Ваш C:\temp\xxx.exe
исполняемый файл должен присутствовать на сервере (удаленном компьютере) , чтобы ваша команда работала, потому что именно здесь выполняется ваш блок скриптов ({ ... }
).
Примечание. В отличие от этого, если вы используете Invoke-Command
с параметром -FilePath
для удаленного запуска локально представленного файла script (.ps1
), PowerShell автоматически копирует его на удаленный компьютер;from the docs : "Когда вы используете этот параметр, PowerShell преобразует содержимое указанного файла сценария в блок сценария, передает блок сценария на удаленный компьютер и запускает его на удаленном компьютере."
Чтобы скопировать исполняемый файл с локального (клиентского) компьютера , вам необходимо выполнить 4-шаговый подход ( PSv5 + , из-за использования Copy-Item -ToSession
[1] ):
Создайте сеанс удаленного взаимодействия с явным $server
, используя New-PSSession
Скопируйте локальный (на стороне клиента) исполняемый файл в этот сеанс (удаленный компьютер) с помощью Copy-Item
и его -ToSession
параметра
Запустите команду Invoke-Command
с параметром -Session
(вместо
-ComputerName
) для запуска в явно созданном сеансе (это не обязательно, но нетнеобходимо создать еще один (специальный сеанс).
Выполнить Remove-PSSession
, чтобы закрыть удаленный сеанс.
Важно : В сеансе удаленного взаимодействия PowerShell вы не можете запускать внешние программы , для которых требуется интерактивный пользовательский ввод :
Хотя вы можете запускать GUI приложения, они неизменно запускают невидимо .
Аналогично, интерактивные консольные приложения не поддерживаются (хотя вывод из консольных приложений - , полученный клиентом).
Однако интерактивные подсказки из команд PowerShell поддерживаются.
Чтобы собрать все это вместе:
# Specify the target server(s)
$server = 'w764' # '.'
# Establish a remoting session with the target server(s).
$session = New-PSSession -ComputerName $server
# Copy the local executable to the remote machine.
# Note: Make sure that the target directory exists on the remote machine.
Copy-Item C:\temp\xxx.exe -ToSession $session -Destination C:\temp
# Now invoke the excutable on the remote machine.
Invoke-Command -Session $session {
# Invoke *synchronously*, with -Wait.
# Note: If the program is a *console* application,
# you can just invoke it *directly* - no need for Start-Process.
Start-Process -Wait -FilePath C:\temp\xxx.exe -ArgumentList "-default", "-acceptEULA"
}
# Close the remote session.
# Note: This will terminate any programs that still
# run in the remote session, if any.
Remove-PSSession $session
[1] Если вы используете Powershell v4 или ниже , рассмотрите возможность загрузки psexec .