2016-05-03 2 views
1

Я пытаюсь фильтровать расширение файла, равный .config и имя файла не содержит vshost в имени, поэтому я запускаю этот скрипт:Фильтрация файлов с -notcontains

$files = dir 
foreach($file in $files) { 
    if($file.Name -notcontains 'vshost' -and $file.Extension -eq '.config') { 
     Write-Host $file; 
    } 
} 

Но выход все еще содержит файлы с vshost в названии:

foo.exe.config 
foo.vshost.exe.config 
foo2.vshost.exe.config 

ожидаемый результат:

foo.exe.config 

Что мне не хватает и как это исправить?

+0

'-notcontains' является сбор оператор, а не строка оператора. '-notlike '* vshost *'' – PetSerAl

+0

Извините downvotes за смущение, это первый раз, когда я когда-либо использую скрипт командной оболочки. – Jack

+0

Вероятно, потому, что вы поняли это, прочитав справку (показывает небольшое исследование) :-) https://technet.microsoft.com/en-us/library/hh847759.aspx –

ответ

4

-notcontains Используется для поиска элемента в массиве, например. $array -notcontains $singleitem. Вы должны использовать -notlike или -notmatch (шаблоны регулярных выражений). Ex.

if($file.Name -notlike '*vshost*' -and $file.Extension -eq '.config') { 

или

if($file.Name -notmatch 'vshost' -and $file.Extension -eq '.config') { 
3

-contains/-notcontains используется для проверки, если список содержит элемент. Вы можете использовать оператор -like/-notlike или -match.

В вашем образце можно использовать

$files = dir 
foreach($file in $files) { 
    if($file.Name -notlike '*vshost*' -and $file.Extension -eq '.config') { 
     Write-Host $file; 
    } 
} 

Ссылка может быть найден here

Смежные вопросы