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!
20
demandé sur Peter Mortensen 2013-07-13 00:38:20

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.

45
répondu Ansgar Wiechers 2016-12-16 10:53:00

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

11
répondu Lars Truijens 2017-05-23 12:17:48