Por que Invoke-Command
dá resultados diferentes quando os comandos são executados remotamente do que quando exatamente os mesmos comandos são executados localmente no mesmo sistema?
Esses comandos invocados remotamente exibem 4 linhas vazias:
PS > Invoke-Command cluster02 { cmd /c dir c:\ | select-string 'bytes free' }
Enquanto esses comandos locais saem conforme o esperado:
PS > Invoke-Command cluster02 { (cmd /c dir c:\ | select-string 'bytes free').line }
11 Dir(s) 828,179,570,688 bytes free
Se eu iniciar um Enter-PSSession cluster02
e depois executá-los, ambos os comandos retornarão a saída esperada.
É um bug neste antigo PowerShell (windows 2012) ou sinto falta de alguma peculiaridade do PS? Se é um bug ou peculiaridade quando se manifesta? Em outras palavras, há algo a aprender com esse comportamento estranho?
O problema que você está tendo é que você está tentando executar remotamente
cmd /c
com um comando cmddir
e, em seguida, canalizar isso para um comando do PowerShell remotamente.Enquanto você espera que isso funcione exatamente da maneira que funciona localmente quando você o executa remotamente, isso é conhecido por ter diferenças e causar confusão.
Conforme indicado nos comandos que precisam de um perfil de usuário pode falhar quando executado remotamente post
Quando executo
Invoke-Command -ScriptBlock {}
em uma máquina remota, tento manter os comandos o mais PowerShell possível. Você deve testar extensivamente se estiver misturando cmd e PowerShell, pois pode não funcionar da mesma maneira que quando você o executa enquanto conectado ao sistema interativamente.PowerShell remoto, obtenha espaço livre na unidade em bytes (não
cmd
)Resultado
Soluções alternativas
Definir a saída do
Invoke-Command
como uma variável e, em seguida, selecionar a string e a propriedade de linha dela parece fazer o truque para a saída desejada que você prefere.PowerShell (Variação 1)
Resultado
O problema é provavelmente devido à invocação
cmd /c
e, em seguida, ao canal do PowerShell, selecionando a cadeia de caracteres correspondente na sessão invocada remota. Eu resolvo esse problema salvando a saída completa doinvoke-command
que retorna corretamente como uma variável fora doinvoke-command
e, em seguida, analiso essa variável de acordo fora doinvoke-command
também.PowerShell (Variação 2)
Aqui está o mesmo que acima, mas em vez de lançar uma variável no mix, basta canalizar a
Invoke-Command
direita para aSelect-String
consulta.Ou até mesmo algo assim...