
Я хочу выполнить команду на удаленной машине, например:
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred `
-ScriptBlock { echo MYPASS | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password}
Однако я получаю эту ошибку
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.
Похоже, что есть проблема с указанием пути к программе при использовании каналов. Как это исправить?
ОБНОВЛЯТЬ:
Поскольку я хочу использовать это в блоке скрипта с несколькими командами, а также передавать переменные в блок скрипта, следующая модификация также не работает.
$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
Это проблема синтаксиса. Если я использую
$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
Я получаю эту ошибку:
A Using variable cannot be retrieved. A Using variable can be used only with Invoke-Command,
ОБНОВЛЕНИЕ 2:
Использование локальной переменной также не работает. Смотрите ниже:
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {
& {
$param1 = $Using:NewPassword
cmd /c 'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'
} }
На самом деле пароль — $param1, а не значение этой переменной.
решение1
Это должно сработать:
$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
Вам это не нужно $Using:Varname
, вы можете просто передать его в Scriptblock обычным способом.
решение2
Я бы предложил выполнить удаленный "cmd /c" для всего конвейера. Для передачи переменных среды с вашего компьютера на удаленный используйте параметр
ArgumentList
.
Без тестирования, что-то вроде:
Invoke-Command -ComputerName $RemoteMachine -Credential $Cred
-ScriptBlock {
Param ($param1)
'echo $param1 | "C:\Program Files (x86)\AnyDesk\AnyDesk.exe" --set-password'}
ArgumentList = $Using:NewPassword
См. документацию Вызов-Команды.