5

Я новичок в PowerShell и у меня есть вопрос о следующем поведении. Я пытаюсь подсчитать количество файлов в каталоге определенного типа. Если они есть, я скопирую их в другое место. Вот вывод моей тестовой папки; код изменен из примеров MSDN, которые я нашел:

[PS]> Get-ChildItem c:\pstdump

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst
-a---         2/12/2011   9:36 AM          0 New Text Document.txt
-a---         2/12/2011   9:36 AM         20 New WinRAR archive.rar

[PS]> (Get-ChildItem c:\pstdump).Count
3
[PS]>

Все хорошо; PowerShell и я согласны с тем, что в папке 3 файла. Теперь, когда я хотел бы выбрать определенные типы файлов (например.PST файлы):

[PS]> Get-ChildItem c:\pstdump -filter "*.pst"

Directory: C:\pstdump

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/12/2011   9:48 AM          0 blah.pst

[PS]> (Get-ChildItem c:\pstdump -filter "*.pst").Count
[PS]>

.Count 'ничего не возвращает, хотя фильтр должен возвращать 1 файл. Я считаю это неверным подсчетом ...

Может кто-нибудь объяснить, почему это «неправильно».Граф возвращается?

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

Спасибо!

2 ответа2

6

Назовите это причудой или функцией, но это связано с тем, как PowerShell работает со списками, длина которых составляет всего 1. Он "выравнивает" их так, что это уже не список, а отдельный объект FileInfo. Поскольку объект FileInfo не имеет свойства Count, вы не получите результата. Есть несколько способов обойти это:

  1. Принудительно вернуть возвращаемое значение в виде массива, поместив его в оператор массива @():

    @(Get-ChildItem c:\pstdump -filter "*.pst").Count
    
  2. Используйте командлет Measure-Object:

    (Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
    
0

Я пытался получить количество типов файлов в каталоге, чтобы решить, обрабатывать ли папку или нет.

Хотя вышеперечисленное работает, лучшим решением может быть использование Test-Path для проверки существования определенных файлов или типов файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .