Отрицание в CMD и PowerShell - PullRequest
5 голосов
/ 24 мая 2011

Есть ли способ сделать отрицание в cmd или powershell?Другими словами, я хочу найти все файлы, которые не соответствуют определенным критериям (кроме атрибута, в котором отрицание указано как «-»), например, в имени.Было бы полезно, если бы существовало общее отрицание, которое можно было бы использовать и в других контекстах.Кроме того, для powershell, есть ли способ получить список имен файлов, а затем сохранить его в виде массива, который можно отсортировать и т. Д.

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

В PowerShell существует множество способов отменить набор критериев, но наилучший способ зависит от ситуации.Использование одного метода отрицания в любой ситуации иногда может быть очень неэффективным.Если вы хотите вернуть все элементы, которые не были библиотеками DLL старше 05.01.2011, вы можете выполнить:

#This will collect the files/directories to negate
$NotWanted = Get-ChildItem *.dll| Where-Object {$_.CreationTime -lt '05/01/2011'}
#This will negate the collection of items
Get-ChildItem | Where-Object {$NotWanted -notcontains $_}

Это может быть очень неэффективно, поскольку каждый элемент, проходящий через конвейер, будет сравниваться с другим наборомпредметов.Более эффективный способ получить тот же результат заключается в следующем:

Get-ChildItem | 
  Where-Object {($_.Name -notlike *.dll) -or ($_.CreationTime -ge '05/01/2011')}

Как сказал @riknik, проверьте:

get-help about_operators
get-help about_comparison_operators

Кроме того, многие командлеты имеют параметр "Исключить".

# This returns items that do not begin with "old"
Get-ChildItem -Exclude Old*

Чтобы сохранить результаты в массиве, который вы можете сортировать, фильтровать, использовать повторно и т. Д.: * 10101 *

# Wrapping the command in "@()" ensures that an array is returned
# in the event that only one item is returned.
$NotOld = @(Get-ChildItem -Exclude Old*)

# Sort by name
$NotOld| Sort-Object
# Sort by LastWriteTime
$NotOld| Sort-Object LastWriteTime

# Index into the array
$NotOld[0]
3 голосов
/ 24 мая 2011

Не уверен, что я полностью понимаю, что вы ищете. Может быть, что-то вроде этого (в PowerShell)?

get-childitem | where-object { $_.name -notlike "test*" }

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

Чтобы получить больше информации об операторах, используйте встроенную справку PowerShell:

get-help about_operators
get-help about_comparison_operators
0 голосов
/ 24 мая 2011

Помимо того, что упоминал @riknik, для конкретного случая Get-ChildItem и имени файла вы должны использовать -exclude, который будет более эффективным.

Get-ChildItem c:\scripts\*.* -exclude *.txt,*.log

http://technet.microsoft.com/en-us/library/ee176841.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...