¿Cuál es la diferencia entre echo y Write-Host en PowerShell?

Estoy confundido acerca de la diferencia entre echo y Write-Host en PowerShell. Tengo dos archivos, POC.ps1 & validatePath.ps1. Estos archivos están en mi máquina local, y estoy ejecutando en un equipo remoto mediante Invoke-Command. Estoy usando PowerShell v3.0.

Para ejecutar estos scripts puedo usar el comando:

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

Aquí están los dos archivos:

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

Aquí es donde las cosas se ponen extrañas…

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
}

Cuando ejecuto el script de arriba, este es el resultado:

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!

Pero si puedo cambiar el validatePath.ps1 a este:

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
}

Este es el resultado:

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!

Te darás cuenta de que la línea de «Este es el usuario:» es en diferentes puntos. ¿Por qué es esto? ¿Por qué echo funcionan de manera diferente que Write-Host?

ACTUALIZACIÓN:

Lo que es aún más extraño es que si vuelvo a ejecutar la secuencia de comandos dos veces como esta:

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

Me da esta salida cuando se utiliza echo en 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!
  • No una respuesta a su pregunta, pero los argumentos a funciones de PowerShell no debe ser puesto entre paréntesis cuando se le llama. Debe ser ValidatePath $filename $user
  • Que probablemente responde a mi pregunta aquí: stackoverflow.com/questions/17623712/… Gracias.

2 Kommentare

  1. 53

    echo es un alias para Write-Output, que escribe para el Éxito de la secuencia de salida. Esto permite que la salida se procesan a través de tuberías o redirige a los archivos. Write-Host escribe directamente a la consola, por lo que la salida no puede ser redirigido/procesando.

  2. 13

    echo es un alias para la Escritura de Salida. Donde Write-Host escribe directamente a la pantalla de’ la Escritura, la Salida se escribe en la tubería. Si la tubería no está de alimentación en algún otro comando finaliza en la ‘pantalla’ en la final así. La diferencia es Write-Host llegar por escrito a la pantalla donde Escribir-Salida de la primera vez que va a través de la canalización y termina en la pantalla después de Write-Host.

    Mediante Write-Output permite a la tubería/redirigir la salida a un archivo o a otro comando, donde Write-Host no. Deben ser utilizados dependiendo de lo que quieras.

    Ver aquí para más.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea