Процесс запуска Powershell не может найти файл - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь обновить сервер с конкретным приложением с клиента с помощью удаленного PowerShell:

Invoke-Command -ComputerName $server -Credential $mycreds {Start-Process -FilePath "C:\temp\xxx.exe"   -ArgumentList "-default", "-acceptEULA" -wait }

Что бы я ни пытался, я получаю сообщения типа "Не удается найти указанный файл ..."что я делаю не так? FilePath находится на локальном (клиентском) компьютере.

1 Ответ

1 голос
/ 15 октября 2019

Ваш 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...