Quelle est la différence entre echo et Write-Host dans PowerShell?
Je ne comprends pas la différence entre echo
et Write-Host
dans PowerShell. J'ai deux fichiers, POC.ps1
et validatePath.ps1
. Ces fichiers sont sur ma machine locale, et je les exécute sur une machine distante en utilisant Invoke-Command
. J'utilise PowerShell v3.0.
Pour exécuter ces deux scripts j'utilise la commande:
.POC.ps1 -filename C:Users -user Blaine
Voici les deux fichiers:
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
voilà où les choses deviennent bizarres...
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
}
quand j'exécute le script ci-dessus, c'est la sortie:
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!
mais si je change le validatePath.ps1
en ceci:
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
}
C'est la sortie:
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!
, Vous remarquerez que la ligne "C'est à l'utilisateur:" est-ce à différents endroits. Pourquoi est-ce? Pourquoi echo
travailler autrement que Write-Host
?
mise à jour:
ce qui est encore plus étrange est que si je relis le script deux fois comme ceci:
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
il me donne cette sortie en utilisant echo
dans 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!
2 réponses
echo
est un alias pour Write-Output
, qui écrit au flux de sortie de succès. Cela permet de traiter la sortie par des pipelines ou de la rediriger dans des fichiers. Write-Host
écrit directement sur la console, de sorte que la sortie ne peut plus être redirigée/traitée.
echo est un alias pour Write-Output. Où Write-Host écrit directement à l'écran, Write-Output écrit au pipeline. Si la conduite n'est pas d'alimenter une autre commande, il se termine sur "l'écran" à la fin. La différence que vous voyez est que Write-Host reçoit l'écriture directement à l'écran où Write-Output passe d'abord par le pipeline et finit sur l'écran après Write-Host.
L'utilisation de L'écriture-sortie vous permet de pipe / rediriger la sortie vers un fichier ou à une autre commande, où Write-Host ne le fait pas. Ils doivent être utilisés en fonction de ce que vous voulez.
Voir ici pour plus d'.