Escribir la ruta completa de una aplicación en powershell

Escribir la ruta completa de una aplicación en powershell

Quiero ejecutar un comando en una máquina remota como esta

Invoke-Command -ComputerName $RemoteMachine -Credential $Cred `
    -ScriptBlock { echo MYPASS | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password}

Sin embargo, me sale este error.

At C:\Users\user\Desktop\anydesk.ps1:14 char:33
+ ... o MYPASS | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-pass ...
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expressions are only allowed as the first element of a pipeline.

Parece que hay un problema al especificar la ruta del programa cuando se utilizan tuberías. ¿Cómo puedo arreglar eso?

ACTUALIZAR:

Como quiero usar eso en un bloque de secuencia de comandos con múltiples comandos y también pasar variables al bloque de secuencia de comandos, la siguiente modificación tampoco funciona.

$NewPassword = 'Mahmood00'
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {        
         & {
         Param(param1)
 'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'
          } } ArgumentList = $Using:NewPassword

Eso tiene un problema de sintaxis. si uso

$NewPassword = 'Mahmood00'
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {        
         & Param(param1){
 'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'
          } } ArgumentList = $Using:NewPassword
              

Recibo este error:

A Using variable cannot be retrieved. A Using variable can be used only with Invoke-Command, 

ACTUALIZACIÓN 2:

Usar una variable local tampoco funciona. Vea abajo:

Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {        
         &   {
         $param1 = $Using:NewPassword
         cmd /c 'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'
          } } 

La contraseña es en realidad $param1 y no el valor de esa variable.

Respuesta1

Esto debería funcionar:

$NewPassword = 'Mahmood00'
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {
    Param($NewPassword)
    $Expression = 'echo {0} | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password' -f $NewPassword
    Start-Process cmd.exe -ArgumentList "/c $Expression"
} -ArgumentList $NewPassword

No es necesario $Using:Varnamehacer esto, simplemente puede pasarlo al Scriptblock normalmente.

Respuesta2

Sugeriría ejecutar un "cmd/c" remoto para toda la tubería. Para pasar variables de entorno desde su computadora al control remoto, use el ArgumentListparámetro.

Sin probar, algo como:

Invoke-Command -ComputerName $RemoteMachine -Credential $Cred
-ScriptBlock {
  Param ($param1)
  'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'}
  ArgumentList = $Using:NewPassword

Ver la documentación de Comando de invocación.

información relacionada