
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:Varname
hacer 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
ArgumentList
pará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.