2013-07-12 9 views
20

Sono confuso circa la differenza tra echo e Write-Host in PowerShell. Ho due file, POC.ps1 & validatePath.ps1. Questi file sono sul mio computer locale e li sto eseguendo su una macchina remota usando Invoke-Command. Sto usando PowerShell v3.0.Qual è la differenza tra echo e Write-Host in PowerShell?

Per eseguire entrambi questi script che uso il comando:

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

Ecco i due file:

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 

Qui è dove le cose si fanno strane. ..

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 
} 

Quando eseguo lo script precedente, questo è l'output:

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! 

Ma se cambio il validatePath.ps1 a questo:

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 
} 

Questa è l'uscita:

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! 

Si noterà che la linea "Questo è l'utente:" si trova in punti diversi. Perchè è questo? Perché lo echo funziona diversamente da Write-Host?

UPDATE:

cosa è ancora più strana è che se io rieseguire lo script due volte in questo modo:

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 

Mi dà questa uscita quando si utilizza echo in 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! 
+0

Non una risposta alla domanda, ma gli argomenti alle funzioni di PowerShell non devono essere messi tra parentesi quando vengono chiamati. Dovrebbe essere 'ValidatePath $ nomefile $ utente' –

+0

Questo probabilmente risponde alla mia domanda qui: http://stackoverflow.com/questions/17623712/multiple-parameters-put-into-one-variable-in-powershell Grazie. – BlackHatSamurai

risposta

43

echo è un alias per Write-Output, che scrive sul flusso di output Success. Ciò consente di elaborare l'output tramite pipeline o reindirizzato in file. Write-Host scrive direttamente nella console, quindi l'output non può più essere reindirizzato/elaborato.

+3

@velua Si prega di non modificare roba quando non capisci nemmeno cosa stai modificando. 'echo' è un alias per' Write-Output', ** not ** per 'Write-Host'. 'Write-Output' e' Write-Host' sono due cmdlet completamente diversi che fanno cose completamente diverse. –

11

echo è un alias per Write-Output. Dove Write-Host scrive direttamente sullo 'schermo', Write-Output scrive nella pipeline. Se la pipeline non viene inserita in un altro comando, termina anche sullo "schermo" alla fine. La differenza che si vede è che Write-Host viene scritto sullo schermo direttamente dove Write-Output passa prima attraverso la pipeline e finisce sullo schermo dopo Write-Host.

L'utilizzo di Write-Output consente di reindirizzare/inviare l'output a un file o a un altro comando, in cui l'host di scrittura non lo esegue. Dovrebbero essere usati a seconda di ciò che vuoi.

Vedere here per ulteriori informazioni.

Problemi correlati