【发布时间】:2015-05-15 00:12:13
【问题描述】:
我正在使用 PowerShell 远程处理在远程服务器上执行 exe 文件。问题是exe需要将其工作目录设置为exe所在的目录才能正常运行。如果我从命令提示符本地(在服务器上)运行 exe,它工作正常,如果我使用 Enter-PSSession(从我的工作站)然后使用 Start-Process -FilePath [PathToExe] -WorkingDirectory [DirectoryPath] 工作正常,但如果我使用 Invoke-Command -ComputerName [Blah] -ScriptBlock [MyScriptBlock] 或 @ 987654325@(来自我的工作站)然后工作目录没有设置。
这就是 [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 时,会设置命令行和当前目录属性,但在使用 New-PSSession 或仅使用带有 ComputerName 的 Invoke-Command 时不会设置。
我同时使用Set-Location 和设置-WorkingDirectory,这是设置工作目录的两种典型推荐方法,Get-Location 确实显示了预期的(服务器的本地)路径(例如 C:\inetpubLive \ScheduledJobs\1.2.3.4)。我猜这只是 PowerShell 的一个错误(我在工作站和服务器上使用 V4),或者我缺少什么?
更新
事实证明,工作目录是一个红鲱鱼(至少,我认为是)。出于某种原因,如果我从命令提示符调用我的可执行文件,一切都会正常工作。
所以在我的 Invoke-Command 中(我用 Invoke-Command 替换了 Start-Process),改变这个:
& ""$hubSyncronizerExePath"" /database $database
到这里:
& cmd /c ""$hubSyncronizerExePath"" /database $database
解决了问题。
感谢大家的建议:)
【问题讨论】:
-
我能想到的另外两个选项,一个是在开始进程之前在脚本中设置
[Environment]::CurrentDirectory。另一种是创建System.Diagnostics.ProcessStartInfo的实例,设置工作目录,然后直接调用Process.Start。 -
感谢@mikez 的建议。我都试过了,但结果还是一样:(
标签: powershell remoting powershell-remoting working-directory