Я использую удаленное взаимодействие PowerShell для выполнения exe-файла на удаленном сервере. Проблема в том, что исполняемый файл должен иметь рабочий каталог, установленный в каталог, в котором находится исполняемый файл, чтобы он работал правильно. Если я запускаю exe локально (на сервере) из командной строки, он работает нормально, а если я использую Enter-PSSession (со своей рабочей станции), а затем использую Start-Process -FilePath [PathToExe] -WorkingDirectory [DirectoryPath]
, это работает нормально, но если я использую Invoke-Command -ComputerName [Blah] -ScriptBlock [MyScriptBlock]
или $session = New-PSSession -ComputerName [Blah]; Invoke-Command -Session $session -ScriptBlock [MyScriptBlock]
(с моей рабочей станции) ), то рабочий каталог не устанавливается.
Вот как выглядит [MyScriptBlock]:
$scriptBlock = {
param($version, $database)
$hubSyncronizerExeDirectoryPath = "C:\inetpubLive\ScheduledJobs\$version\"
$hubSyncronizerExePath = Join-Path $hubSyncronizerExeDirectoryPath 'Test.exe'
Set-Location -Path $hubSyncronizerExeDirectoryPath
Get-Location
Write-Output "$version $database"
Start-Process -FilePath $hubSyncronizerExePath -WorkingDirectory $hubSyncronizerExeDirectoryPath -ArgumentList '/database',$database
}
Я также пробовал использовать Invoke-Command вместо Start-Process, но это дает тот же эффект; рабочий каталог не устанавливается.
Я проверил это с помощью SysInternals Process Explorer, справа щелкнув процесс и выбрав «Свойства». Когда я запускаю его локально или использую Enter-PSSession, свойства Command Line и Current Directory устанавливаются, но не при использовании New-PSSession или просто Invoke-Command с ComputerName.
Я использую как Set-Location
, так и устанавливаю -WorkingDirectory
, которые представляют собой 2 типичных рекомендуемых подхода для установки рабочего каталога, а Get-Location
действительно отображает ожидаемый (локальный сервер) путь (например, C: \ inetpubLive \ ScheduledJobs \ 1.2.3.4). Я предполагаю, что это просто ошибка PowerShell (я использую V4 на рабочей станции и сервере), или, может быть, что-то мне не хватает?
ОБНОВИТЬ
Оказывается, рабочий каталог был отвлекающим маневром (по крайней мере, я так думаю). По какой-то причине все работает нормально, если я вызвал свой исполняемый файл из командной строки.
Итак, в моей Invoke-Command (я заменил Start-Process на Invoke-Command), изменив это:
& ""$hubSyncronizerExePath"" /database $database
к этому:
& cmd /c ""$hubSyncronizerExePath"" /database $database
исправил проблему.
Спасибо за все предложения, ребята :)
[Environment]::CurrentDirectory
в скрипте перед запуском процесса. Другой - создать экземплярSystem.Diagnostics.ProcessStartInfo
, установить рабочий каталог и затем напрямую вызватьProcess.Start
. - person Mike Zboray   schedule 15.05.2015