2014-10-10 5 views
0

Я пытаюсь запустить сценарий Powershell для удаления определенных файлов в каталоге. Имя должно содержать blahblahblah для меня, чтобы иметь возможность удалить это.Сравнение строк не сравнивается

В моем тестовом подкаталоге у меня есть несколько файлов с этим именем. Однако, когда я выполнить следующий код:

$itemsToDelete = get-childItem -path $pathName | where {$_.Name -contains blahblahblah"}

Он не выбирает каких-либо предметов.

Я проверил трижды, чтобы убедиться, что я в правильном каталоге при выполнении сценария.

EDIT

Как уже было сказано мне. Я использовал contains.

$itemsToDelete = get-childItem -path $pathName | where {($_.Name).Contains("blahblahblah")} 

Правильно вылечил мое замешательство.

+2

'-contains' [не работает, как вы, вероятно, думаете, что он должен работать] (http://technet.microsoft.com/en-us/library/hh847759.aspx). Это не ваша вина - имя оператора вводит в заблуждение. Во всяком случае, просто используйте '-match'. –

+0

Вы правы. 'где {($ _. Name) .Contains (" blahblahblah ")'. Это работает. Спасибо. Если вы хотите отправить ответ, я с удовольствием за исключением. – Johnrad

ответ

1

Повторяя мой комментарий (с некоторым фоном) по просьбе автора.

Цитата из TechNet:

-Contains 
    Description: Containment operator. Tells whether a collection of reference 
    values includes a single test value. Always returns a Boolean value. Returns TRUE 
    only when the test value exactly matches at least one of the reference values. 

    When the test value is a collection, the Contains operator uses reference 
    equality. It returns TRUE only when one of the reference values is the same 
    instance of the test value object. 

Короче говоря, -Contains не позволяет проверить, если строка содержит определенную подстроку. Вы хотите -Match или -Like. Обратите внимание, что -Match обрабатывает ваше тестовое значение как regular expression, поэтому вам может понадобиться избежать специальных символов.

Мое мнение таково, что -Contains не является ни очень интуитивным, ни очень полезным. Теоретически такие вещи имеют смысл, если вы поддерживаете идею "don't program by coincidence", но для языка сценариев они несколько завышены.

0

Другим вариантом является использование -like (-unlike) в сочетании с диким char * в соответствии с вашим запросом. Это больше похоже на like в SQL.

$itemsToDelete = get-childItem -path $pathName | where { $_.Name -like '*blahblahblah*' } 
+0

Хотя это уже было сделано в комментариях, если ничто другое не должно объяснять, почему ваше решение поможет ситуации OP. – Matt

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