Поведінка файлу PowerShell


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 файл. Я вважаю це неправильним підрахунком ...

Чи може хтось пояснити, чому це «неправильне».

Крім того, будь ласка, не соромтеся зневажати мене за очевидну помилку n00b, яку я повинен зробити.

Дякую!

Відповіді:


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
    

Блискуче! Просто вдарив "@" спереду, і кількість масивів працює як і раніше. Дякуємо за відповідь!
Beeblebrox

0

Я намагався отримати кількість типів файлів у каталозі, щоб вирішити, чи слід обробляти папку.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.