Was ist der Unterschied zwischen Echo und Write-Host in PowerShell?

Ich bin verwirrt über den Unterschied zwischen echo und Write-Host in der PowerShell. Ich habe zwei Dateien, POC.ps1 & validatePath.ps1. Diese Dateien sind auf meinem Rechner, und ich bin mit Ihnen auf einer remote-Maschine mit Invoke-Command. Ich bin mit PowerShell v3.0.

Ausführen diese beiden scripts verwende ich den Befehl:

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

Hier sind die zwei Dateien:

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

Hier ist, wo die Dinge seltsame...

"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
}

Wenn ich das obige Skript, das ist die Ausgabe:

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!

Aber wenn ich die validatePath.ps1:

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
}

Dies ist die Ausgabe:

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!

Werden Sie feststellen, dass die Zeile "Dies ist der Benutzer:" in verschiedenen Orten. Warum ist das so? Warum echo anders funktionieren als Write-Host?

UPDATE:

Was ist noch seltsamer ist, dass wenn ich das Skript erneut ausführen zweimal so:

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

Es gibt mir diese Ausgabe bei der Verwendung von echo im 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!
Kommentar zu dem Problem
Nicht eine Antwort auf deine Frage, aber Argumente PowerShell-Funktionen sollten nicht in Klammern, wenn Sie aufgerufen. Es sollte "ValidatePath" $filename $user Kommentarautor: Lars Truijens
Wahrscheinlich die Antwort auf meine Frage hier: stackoverflow.com/questions/17623712/... Dank. Kommentarautor: BlackHatSamurai

InformationsquelleAutor der Frage BlackHatSamurai | 2013-07-12

Schreibe einen Kommentar