Сравнение файла с оригиналом, создание отчета
Добрый день,
Есть папка, в которую люди выкладывают файлы. Необходимо проверить все ли люди выложи файлы, если нет - записть в отчет - забыли.txt Затем все файлы проверяются на соответствие определенным атрибутам(все атрибуты закодированы в имени файла), если всё верно - файлы перемещаются в папку с именем сегодняшней даты Если атрибуты файлов не верные - запись в отчет - неверно.txt Как планируется проверять все ли люди выложили файлы в папку. Есть файл - сотрудники.txt вот такого вида: Код:
33-1:Отдел1:Иванов:555 Надо создать проверку одного массива данных Код:
get-content .\сотрудники.txt -replace ":.*","" Код:
$files = (get-childitem).Basename В случае если совпадения нет формировать отчет забыли.txt или ошибки.txt Отчеты такого вида: Код:
33-1 Отдел1 Иванов 555 Ошибка Для отчета забыли отчет: Код:
33-1 Отдел1 Иванов 555 Не могу создать отчеты, потому что не понятно как сравнить два массива. Делаю так. Код:
cls Хотя одно значение должно совпадать точно А если просто из строки выполнить Код:
($a[1].BaseName -replace "^S_","" -replace "_.*","") -like $BASEName[$b] Кстати только что понял, что я ожидал ответ от одиночной команды вида: 33-1 (я ведь написал -like а не -contains) а он выдает True или False |
Такого формата имя:sr_33-1_20120926.rar.enc файл не может быть.
Файл должен быть в кодировке Unicode Код:
$base = Import-Csv сотрудники.txt -Delimiter ":" -Header "O","T",TH","F" |
Благодарю за помощь.
Теперь не могу скопировать данные. Код:
cls Вот на них и ругается. Код:
... Код:
$findFile = $files -match $name.N |
1) Зачем в скрипте команды?
cd y:\ cd Y:\TableReports 2) $findAtr = $findFile -match "rar.sig.enc$" -cmatch "S" - Какие тут тестируются атрибуты? 3) Copy-Item -Path $findAtr должно быть Copy-Item -Path $findFile |
1.
cd y:\ так как в команде не было полного пути до файла. указываю диск (исправил) cd y:\tablereports - не могу объяснить :) - удалил 2. Атрибуты - не в привычном смысле слова. То есть это не атрибуты файловый системы (архивный, скрытый, acl, что там ещё...) - эти атрибуты закодированы в имени файла. $findAtr = $findFile -match "rar.sig.enc$" -cmatch "S" - мне нужны файлы, которые оканчиваются на rar.sig.enc и в имени содержат большую букву S. 3. Исправил работает. Вот такой отчет получился. Код:
Write-Host "Файл НЕ прислали" HTML код:
22 Number1Номер 1 На всякий случай весь код: Код:
cls |
$findAtr = $findFile -match "rar.sig.enc$" -cmatch "S" - Попробуйте узнать результат выполнения,может отработать только в случае массива,что врятли,для скалярного значения всегда выражение будет FALSE.
Добавить перед foreach переменную notfound: Код:
$notfound = @() |
Не сколько видоизменил ТЗ.
Один скрипт будет работать как служба. Служба: Код:
$watcher = New-Object System.IO.FileSystemWatcher Второй скрипт проверяет: есть ли папка за сегодняшнее число. Если нет, то создает и проверяет файлы на вшивость. Если файл нормальный, то копируется в папку - нормальные Если файл не нормальный. копируется в папку не правильные и пишется сообщение на почту, что файл не верный (отображаются контакты накосячивших) Второй - проверка файлов: cls Код:
$Checkfolder = Test-Path -Path "c:\Reports\$(Get-Date -uformat '%Y%m%d')" Второй вообще не отрабатывает. Причем как с @(notfound) так и без неё (я не до конца понял, как это работает). А то что отрабатывает вообще не понятно как отрабатывает Скажем по факту два файла. Один нормальный, второй нет. А скрипт говорит, что: - все атрибуты верны - что прислали файл не два человек, а скажем 5 |
Я уже третий раз спрашиваю про условие "$findAtr = $findFile -match "rar.sig.enc$" -cmatch "S"" - ЧТО ЭТО?
|
Извиняюсь. Я вроде как ответил.
$findFile = $files -match $name.N if($findFile) Это первая проверка - ищем файл. Если нашли, то: $findAtr = $findFile -match "rar.sig.enc$" -cmatch "S" весь путь, который нам возвращает вот эта команда $files = Get-ChildItem c:\ftp | Where {!$_.PsIsContainer -and $_.Name -match ".enc$"} | Select-Object -Expand FullName Например, C:\ftp\S_11_20121002.rar.sig.enc проверяем на содержание - есть ли в строчке - S, rar.sig.enc $files.GetType().Name - возвращает string. $findatr - возвращает boolean Поэтому путь не подставлялся (boolean никак не подставишь), а отчет выдает больше вхождения - потому что files по символам разбирается. Но как сделать правильно? Нужно вот это изменить: "$findAtr = $files -match "rar.sig.enc$" -cmatch "S" |
Тогда еще разок(в 6 посте я это описал,но читать конечно же не обязательно):
PS Z:\> "C:\ftp\S_11_20121002.rar.sig.enc" -match "rar.sig.enc$" -cmatch "S" False PS Z:\> "C:\ftp\S_11_20121002.rar.sig.enc" -match "rar.sig.enc$" True $findAtr = $findFile -match "\\S.+\.rar\.sig\.enc$" |
Время: 01:43. |
Время: 01:43.
© OSzone.net 2001-