Comportamento da contagem de arquivos do PowerShell

5

Sou novo no PowerShell e tenho uma dúvida sobre o comportamento a seguir. Estou tentando contar o número de arquivos em um diretório de um certo tipo. Se houver, eu vou copiá-los em outro lugar. Aqui está a saída da minha pasta de teste; o código é modificado dos exemplos do MSDN que encontrei:

[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]>

Tudo bem e bem; O PowerShell e eu concordamos que existem 3 arquivos na pasta. Agora, quando eu gostaria de escolher tipos de arquivos específicos (por exemplo, arquivos .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]>

O '.Count' não está retornando nada, mesmo que o filtro deva retornar 1 arquivo. Eu considero isso uma contagem incorreta ...

Alguém poderia explicar por que esta 'incorreta' .Count está sendo devolvida?

Alternativamente, sinta-se à vontade para me repreender pelo erro óbvio que eu devo estar cometendo.

Obrigado!

    
por Beeblebrox 02.12.2011 / 00:38

2 respostas

6

Chame isso de peculiaridade ou recurso, mas isso tem a ver com o modo como o PowerShell lida com listas com apenas 1 comprimento. Ele "achata" eles para que não seja mais uma lista, mas um único objeto FileInfo. Como o objeto FileInfo não tem uma propriedade Count, você não obtém resultado. Existem algumas maneiras de contornar isso:

  1. Força o valor retornado a permanecer como uma matriz, agrupando-o no operador de matriz @() :

    @(Get-ChildItem c:\pstdump -filter "*.pst").Count
    
  2. Use o cmdlet Measure-Object:

    (Get-ChildItem c:\pstdump -filter "*.pst" | measure).Count
    
por 02.12.2011 / 02:19
0

Eu estava tentando obter o número de tipos de arquivos em um diretório para decidir se a pasta seria processada ou não.

Enquanto o acima funciona, uma solução melhor pode ser usar o Test-Path para verificar a existência de arquivos ou tipos de arquivos específicos.

    
por 06.12.2011 / 00:55

Tags