我经常使用批处理脚本进行交互工作,但无法轻易更改。此脚本的功能之一是作为导航辅助工具 - 它了解我公司/产品的代码布局约定,并利用这些知识将“theScript cdTestCode”转换为“cd /DC:\The\Inferred\Path\To\The\Unit\Tests”,用于我当前所在目录的组件。这是一个很好的节省时间的小方法。
我希望能够在交互式 PowerShell 环境中使用此脚本。对于它的大多数功能,只需在 PowerShell 中调用脚本即可。但对于该导航功能,它执行的目录更改仅影响 PowerShell 在其中运行批处理脚本的 cmd 环境。周围的 PowerShell 主机的目录没有改变,这意味着当我尝试使用 PowerShell 作为我的 shell 时,它对我来说不是很有用。
我的问题是:假设我无法更改批处理脚本(并且我不想将其重写为 PowerShell 脚本),在批处理脚本完成时,是否有任何好的方法可以将批处理脚本的最终工作目录传播回 PowerShell 主机?也就是说,是否有一种相当简单的方法来编写函数:
function InvokeBatchScriptAndAssumeDirectory($BatchScriptFullName) {
# ...
}
使得
PS> pwd
Path
----
C:\elsewhere
PS> echo .\mybatchscript.cmd
@ECHO OFF
cd /D C:\
PS> InvokeBatchScriptAndAssumeDirectory .\mybatchscript.cmd
PS> pwd
Path
----
C:\
这个问题非常相似,但它提供的“解决方案”只是将批处理文件更改为 .ps1 脚本。我正在使用的批处理脚本非常复杂 - 这样做需要大量重写,我宁愿避免这种情况。
答案1
我最终采纳了@dangph 的建议。
Param([string]$Script, [string]$ScriptParams)
$WorkingDirectoryTempFile = [IO.Path]::GetTempFileName()
cmd /c " `"$Script`" $ScriptParams && cd > `"$WorkingDirectoryTempFile`" "
Get-Content $WorkingDirectoryTempFile | Set-Location
Remove-Item $WorkingDirectoryTempFile
另外,Lee Holmes 在 2006 年编写了一个脚本,基本解决了同样的问题:http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/