write variable results print .net windows powershell

.net - variable - powershell write-output to file



¿Cuál es la diferencia entre echo y Write-Host en PowerShell? (2)

echo es un alias para Write-Output , que escribe en la secuencia de salida Success. Esto permite que la salida se procese a través de canalizaciones o se redirija a archivos. Write-Host escribe directamente en la consola, por lo que la salida no se puede redirigir / procesar más.

Estoy confundido sobre la diferencia entre echo y Write-Host en PowerShell. Tengo dos archivos, POC.ps1 y validatePath.ps1 . Estos archivos están en mi máquina local y los estoy ejecutando en una máquina remota usando Invoke-Command . Estoy usando PowerShell v3.0.

Para ejecutar ambos de estos scripts, uso el comando:

./POC.ps1 -filename C:/Users -user Blaine

Aquí están los dos archivos:

POC.ps1:

param($filename, $user) echo $filename echo "This" echo $user $responseObject = Invoke-Command testcomputer -FilePath ./validatePath.ps1 -ArgumentList($filename, $user) -AsJob while($responseObject.State -ne "Completed") { } $result = Receive-Job -Id $responseObject.Id -Keep echo $result

Aquí es donde las cosas se ponen raras ...

validatePath.ps1:

Param([string] $filename, [string] $user) function ValidatePath( $filename, $user, $fileType = "container" ) { Write-Host "This is the file name: $filename" Write-Host "This is user: $user" <--- Notice I''m using Write-Host here $fileExist = $null if( -not (test-path $filename -PathType $fileType) ) { throw "$user, the path $filename does not exist!" } else { Write-Host "This is the second part" echo $filename found! } Write-Host "This is the third part" return $fileExist } try { ValidatePath($filename, $user) } catch { $e = $_.Exception echo $e }

Cuando ejecuto el script anterior, este es el resultado:

C:/Users This Blaine This is the file name: C:/Users Blaine This is user: <--- Notice where this line is? This is the second part This is the third part C:/Users Blaine found!

Pero si cambio validatePath.ps1 a esto:

Param([string] $filename, [string] $user) function ValidatePath( $filename, $user, $fileType = "container" ) { Write-Host "This is the file name: $filename" echo "This is user: $user" <---notice I''m using Echo here $fileExist = $null if( -not (test-path $filename -PathType $fileType) ) { throw "$user, the path $filename does not exist!" } else { Write-Host "This is the second part" echo $filename found! } Write-Host "This is the third part" return $fileExist } try { ValidatePath($filename, $user) } catch { $e = $_.Exception echo $e }

Este es el resultado:

C:/Users This Blaine This is the file name: C:/Users Blaine This is the second part This is the third part This is user: <---- Notice where this line is now? C:/Users Blaine found!

Notará que la línea "Este es el usuario:" está en diferentes puntos. ¿Por qué es esto? ¿Por qué el echo funciona de forma diferente que Write-Host ?

ACTUALIZAR:

Lo que es aún más extraño es que si vuelvo a ejecutar el script dos veces como este:

POC.ps1:

param($filename, $user) echo $filename echo "This" echo $user $responseObject = Invoke-Command CAPTESTPK01 -FilePath ./validatePath.ps1 -ArgumentList $filename, $user -AsJob while($responseObject.State -ne "Completed") { } $result = Receive-Job -Id $responseObject.Id -Keep echo $result $filename = "C:/saddfasdfj" #Here I run the command again, using a different file name $responseObject = Invoke-Command CAPTESTPK01 -FilePath ./validatePath.ps1 -ArgumentList $filename, $user -AsJob while($responseObject.State -ne "Completed") { if($responseObject.State -eq "Failed") { echo "Failed" $result = Receive-Job -Id $responseObject.Id -Keep echo $result break } } $result = Receive-Job -Id $responseObject.Id -Keep echo $resul

Me da esta salida cuando uso echo en validatePath.ps1 :

C:/Users This Blaine This is the file name: C:/Users This is the second part This is the third part This is user: Blaine <---- This line is here C:/Users found! This is the file name: C:/saddfasdfj This is user: Blaine <---- But now it''s here, where it should be? Wth? Blaine, the path C:/saddfasdfj does not exist!


echo es un alias para Write-Output. Cuando Write-Host escribe directamente en la ''pantalla'', Write-Output escribe en la canalización. Si la tubería no se alimenta en algún otro comando, también termina en la ''pantalla'' al final. La diferencia que ve es que Write-Host se escribe en la pantalla directamente donde Write-Output primero pasa por la tubería y termina en la pantalla después de Write-Host.

El uso de Write-Output le permite canalizar / redirigir la salida a un archivo u otro comando, donde Write-Host no lo hace. Deben usarse según lo que desee.

Mira aquí para más.