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!
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' –
Questo probabilmente risponde alla mia domanda qui: http://stackoverflow.com/questions/17623712/multiple-parameters-put-into-one-variable-in-powershell Grazie. – BlackHatSamurai