.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.