我正在使用PowerShell远程处理在远程服务器上执行exe文件。问题是exe需要将其工作目录设置为exe所在的目录才能使其正常运行。如果我从命令提示符本地(在服务器上)运行exe它工作正常,如果我使用Enter-PSSession(从我的工作站)然后使用Start-Process -FilePath [PathToExe] -WorkingDirectory [DirectoryPath]
工作正常,但如果我使用{{1或Invoke-Command -ComputerName [Blah] -ScriptBlock [MyScriptBlock]
(来自我的工作站)然后工作目录没有设置。
这就是[MyScriptBlock]的样子:
$session = New-PSSession -ComputerName [Blah]; Invoke-Command -Session $session -ScriptBlock [MyScriptBlock]
我也尝试过使用Invoke-Command而不是Start-Process,但它具有相同的效果;工作目录没有设置。
我已使用SysInternals Process Explorer验证了这一点,右键单击该流程并选择“属性”。当我在本地启动它或使用Enter-PSSession时,会设置命令行和当前目录属性,但不能在使用New-PSSession或只使用带有ComputerName的Invoke-Command时设置。
我正在使用$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
}
并设置Set-Location
,这是设置工作目录的两种典型推荐方法,-WorkingDirectory
确实显示了预期的(服务器的本地)路径(例如C:\ inetpubLive \ ScheduledJobs \ 1.2.3.4)。我猜这只是PowerShell的一个错误(我在工作站和服务器上使用V4),或者有些东西我不知道?
事实证明,工作目录是一个红色的鲱鱼(至少,我认为是)。出于某种原因,如果我从命令提示符调用可执行文件,一切正常。
所以在我的Invoke-Command中(我用Invoke-Command取代了Start-Process),改变了这个:
Get-Location
到此:
& ""$hubSyncronizerExePath"" /database $database
修复了问题。
感谢所有建议人员:)
答案 0 :(得分:0)
尝试查看 New-PSDrive ,看看是否有帮助
我想你会想要像
这样的东西New-PSDrive -Name WorkingDir -PSProvider FileSystem -Root" \\ RemoteServer \ c $ \ inetpubLive \ ScheduledJobs \ 1.2.3.4"
CD WorkingDir:
我假设您应该能够修改您的脚本以包含并将$ version变量放入New-PSDrive命令的路径中...
不确定这会做你需要它做的事情,但它是第一件让人想起的事情......
或者,尝试按如下方式修改脚本:
$ hubSyncronizerExeDirectoryPath =" \\ remoteserver \ C $ \ inetpubLive \ ScheduledJobs \ $ version \"