Estou tentando redirecionar uma saída de loop foreach para um arquivo com o seguinte código do PowerShell:
PS C:\> foreach ( $dir in "c:\ProgramData", "c:\Program Files", "c:\Program Files (x86)" ) { echo "=> $dir :" ; dir -r -fo $dir 2>$null | % FullName | sls 'exe$' } > C:\temp\VDI_Exclustion_List.txt
mas a saída é exibida em stdout e recebo este erro:
> : The term '>' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:157
+ ... ir :" ; dir -r -fo $dir 2>$null | % FullName | sls 'exe$' } > C:\temp ...
+ ~
+ CategoryInfo : ObjectNotFound: (>:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\> ls C:\temp\VDI_Exclustion_List.txt
ls : Cannot find path 'C:\temp\VDI_Exclustion_List.txt' because it does not exist.
At line:1 char:1
+ ls C:\temp\VDI_Exclustion_List.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\temp\VDI_Exclustion_List.txt:String) [Get-ChildItem], ItemNotFoundEx
ception
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\>
Primeiro, tentei substituir o >
redirecionamento por | Out-File C:\temp\VDI_Exclustion_List.txt
, mas não funcionou:
At line:1 char:138
+ ... 6)" ) { dir -r -fo $dir 2>$null | % FullName | sls 'exe$' } | Out-Fil ...
+ ~
An empty pipe element is not allowed.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement
PS C:\>
Então tentei substituir o >
redirecionamento por 6>&1 | Out-File C:\temp\VDI_Exclustion_List.txt
( encontrado aqui ), mas também não funcionou:
PS C:\> foreach ( $dir in "c:\ProgramData", "c:\Program Files", "c:\Program Files (x86)" ) { echo "=> $dir :" ; dir -r -fo $dir 2>$null | % FullName | sls 'exe$' } 6>&1 | Out-File C:\temp\VDI_Exclustion_List.txt
......
6>&1 : The term '6>&1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
again.
At line:1 char:157
+ ... :" ; dir -r -fo $dir 2>$null | % FullName | sls 'exe$' } 6>&1 | Out-F ...
+ ~~~~
+ CategoryInfo : ObjectNotFound: (6>&1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\>
Espero que a saída esteja dentro do arquivo C:\temp\VDI_Exclustion_List.txt mas o arquivo nem foi criado.
Como você já descobriu, as instruções de controle de fluxo não podem ser usadas no lugar de comandos ou expressões de valor - mas você pode envolvê-las em um bloco de script e então redirecionar a saída ao invocá-lo:
Dito isto, você realmente não precisa de um loop aqui!
Você pode canalizar seus dados de entrada diretamente para
Get-ChildItem
, os arquivos descobertos porGet-ChildItem
podem, por sua vez, ser canalizadosWhere-Object
para filtrar sua extensão; nesse ponto, podemos obter oFullName
valor da propriedade de cada subconjunto de arquivos resultante com oForEach-Object
comando: