Запись полного пути к приложению в PowerShell

Запись полного пути к приложению в PowerShell

Я хочу выполнить команду на удаленной машине, например:

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

См. документацию Вызов-Команды.

Связанный контент