2014-02-12 5 views
0

У меня есть папка, которая должна содержать 10 файлов. Каждое имя файла будет другим (имя и расширение), однако оно будет содержать шаблон.powershell проверить каталог для файлов

например.

SomeThing.FILE0.DAT 
SomeThing.FILE1.DAT 
SomeThing.FILE2.DAT 
and so on till 
SomeThing.FILE9.DAT 

В настоящее время мой скрипт не имеет чеков. Я вручную запускаю его, гарантируя, что все файлы присутствуют.

for ($i=0; $i -le 9; $i++) 
{ 
    $FileString = "*FILE"+$i+"*" 
    $MyFileName = Get-ChildItem e:\files -name -filter $($FileString) 
} 

Однако, мне нужно автоматизировать процесс, поэтому я хочу, чтобы добавить проверку, чтобы убедиться, что:

a. Total of 10 files exist in that folder 

$FC = (Get-ChildItem c:\testing | Measure-Object).Count; 
if($FC -eq 10) 
{ 
    echo "File Count is correct" 
} 
else 
{ 
    echo "File Count is incorrect" 
} 

b. Each of the FILEX (X = 0-9) are present 
c. Only one instance of each FILEX (X = 0-9) should be present. If multiple instances of FILEX are present, I need to display it on the screen saying that FILEX pattern is repeated multiple times. 

Как я могу сделать эти оставшиеся чеки? Это выглядело просто, но гораздо сложнее ...

+0

Я вижу, вы уже дали ответ для первой части своего вопроса. Вы пробовали что-нибудь до сих пор для b или c? Если у вас есть, где вы столкнулись с проблемами? –

+0

Нет. Я не могу получить что-то для b и c. Любые указатели оцениваются. Я начал изучать powershell пару месяцев назад. – DataRiver

+0

Сделайте * попытку в B & C. Этот сайт не предназначен для людей, чтобы написать весь ваш код для вас. – alroc

ответ

1
$> if ((compare (ls -name | %{ ([regex]'(?<=.*FILE).*(?=.DAT)').match($_).groups[0].value } | Sort-Object) (0..9 | %{$_.ToString()}) -SyncWindow 0).Length -eq 0) { Write-Host "ok" } 
ok 

Мм?

Перефразируя ваш вопрос, у нас есть что-то вроде «проверьте, что каталог содержит только файлы *FILEX.DAT, где X должно быть всевозможным числом от 0 до 9». В PowerShell это должно выглядеть примерно так:

$> if (allNumbersFromFileNames.IsEqualTo(0..9)) { Write-Info "ok" } 

Чтобы получить все числа от имен файлов из текущего каталога:

$> ls -name | %{ ([regex]'(?<=.*FILE).*(?=.DAT)').match($_).groups[0].value } 
0 
1 
2 
3 
5 
6 
7 
8 
9 
4 

Мы сконструированный регулярное выражения здесь с ([regex]'(?<=.*FILE).*(?=.DAT)') и для каждого файла в текущем каталоге (ls -name | %{ $_ }) проанализируйте магическое число в нем и получите значение первой сопоставимой группы.

И наконец, мы должны иметь этот объект string[], сортировать его и сравнивать с массивом строк чисел. compare может быть полезен здесь.

I.e.

$> if ((compare 0..9 1..4).Length -eq 0) { Write-Host "equals" } 
$> if ((compare 0..9 0..9).Length -eq 0) { Write-Host "equals" } 
equals 

Положите все это вместе, и у вас есть ответ!

+0

Спасибо. «Что-то» будет всегда отличаться.Итак, любой способ удалить это? – DataRiver

+0

ответ обновлен. ''(? <= SomeThing.FILE). * (? =. DAT)'' regex стать ''(? <=. * FILE). * (? =. DAT)''. Также сортировка массива анализируемых цифр добавляется к правильному сравнению массивов. –

+0

Спасибо. Этот разрыв помогает многим :) Цените свою помощь в написании этого ясно. – DataRiver

0

Поскольку решение для регулярных выражений не работает для меня, я закончил писать грубую логику. Пока это работает. Если что-то лучше, пожалуйста, сообщите.

for ($i=0; $i -le 9; $i++) 
{ 
$FileString = "*FILE"+$i+"*" 

$ct = (Get-ChildItem "C:\testing" -name -filter $($FileString) | Measure-Object).Count 
if($ct -ne 1) 
{ 
    if($ct -eq 0) 
    { 
     write-host "FILE"$i "is missing" 
    } 
    elseif ($ct -gt 1) 
    { 
     write-host $ct" instances of FILE"$i" found" 
    } 
    else 
    { 
     write-host "God help you." 
    } 
} 
} 
Смежные вопросы