繁体   English   中英

PowerShell远程处理时设置可执行文件的工作目录

[英]Set Executable's Working Directory When PowerShell Remoting

我正在使用PowerShell远程处理在远程服务器上执行exe文件。 问题是exe需要将其工作目录设置为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] $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验证了这一点,右键单击该进程并选择Properties。 当我在本地启动它或使用Enter-PSSession时,会设置命令行和当前目录属性,但在使用New-PSSession或仅使用带有ComputerName的Invoke-Command时则不会。

在此输入图像描述

我正在使用Set-Location和设置-WorkingDirectory ,这是设置工作目录的两种典型推荐方法, Get-Location确实显示了预期的(服务器的本地)路径(例如C:\\ inetpubLive \\ ScheduledJobs \\ 1.2) .3.4)。 我猜这只是PowerShell的一个错误(我在工作站和服务器上使用V4),或者可能是我缺少的东西?


UPDATE

事实证明,工作目录是一个红色的鲱鱼(至少,我认为是)。 出于某种原因,如果我从命令提示符调用可执行文件,一切正常。

所以在我的Invoke-Command(我用Invoke-Command取代了Start-Process)中,改变了这个:

& ""$hubSyncronizerExePath"" /database $database

对此:

& cmd /c ""$hubSyncronizerExePath"" /database $database

解决了这个问题。

谢谢你的所有建议:)

试着看看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 \\”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM