Установка рабочего каталога исполняемого файла при удаленном взаимодействии с PowerShell

Я использую удаленное взаимодействие 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

исправил проблему.

Спасибо за все предложения, ребята :)


person deadlydog    schedule 15.05.2015    source источник
comment
Я могу придумать два дополнительных варианта: один - установить [Environment]::CurrentDirectory в скрипте перед запуском процесса. Другой - создать экземпляр System.Diagnostics.ProcessStartInfo, установить рабочий каталог и затем напрямую вызвать Process.Start.   -  person Mike Zboray    schedule 15.05.2015
comment
Спасибо за предложения @mikez. Я пробовал оба, но результат тот же :(   -  person deadlydog    schedule 15.05.2015


Ответы (1)


Посмотрите на New-PSDrive и посмотрите, поможет ли это.

Я думаю, ты захочешь что-то вроде

New-PSDrive -Name WorkingDir -PSProvider FileSystem -Root "\\ RemoteServer \ c $ \ inetpubLive \ ScheduledJobs \ 1.2.3.4"

Рабочий каталог компакт-диска:

Я предполагаю, что вы сможете изменить свой сценарий, включив и поместив переменную $ version в путь к команде New-PSDrive ...

Не уверен, что это сделает то, что вам нужно, но это первое, что пришло в голову ...

В качестве альтернативы попробуйте изменить свой сценарий следующим образом:

$ hubSyncronizerExeDirectoryPath = "\\ remoteserver \ C $ \ inetpubLive \ ScheduledJobs \ $ version \"

person Charlosa    schedule 15.05.2015
comment
Спасибо за предложение. Я попытался указать полный путь к удаленному серверу, но из-за этого exe вообще не запускался. Я попробую ваше предложение New-PSDrive чуть позже. Спасибо. - person deadlydog; 15.05.2015