【问题标题】:Set Executable's Working Directory When PowerShell Remoting在 PowerShell 远程处理时设置可执行文件的工作目录
【发布时间】: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


【解决方案1】:

尝试查看 New-PSDrive 看看是否有帮助

我猜你会想要类似的东西

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

CD 工作目录:

我假设您应该能够修改您的脚本以包含 $version 变量并将其放入 New-PSDrive 命令的路径中...

不确定这是否能满足您的需要,但这是首先想到的...

或者,尝试如下修改您的脚本:

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

【讨论】:

  • 感谢您的建议。我尝试指定完全限定的远程服务器路径,但这导致 exe 根本无法启动。稍后我会尝试一下您对 New-PSDrive 的建议。谢谢。
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多