
私は、簡単には変更できないバッチ スクリプトを定期的に対話的に操作しています。このスクリプトの機能の 1 つは、ナビゲーション補助機能です。このスクリプトは、私の会社/製品のコード レイアウト規則を理解し、その知識を使用して、現在ディレクトリにいるコンポーネントの「theScript cdTestCode」を「cd /DC:\The\Inferred\Path\To\The\Unit\Tests」に変換します。これは、ちょっとした時間の節約になります。
このスクリプトを対話型 PowerShell 環境内から使用できるようにしたいと思います。その多くの機能のほとんどは、PowerShell 内からスクリプトを呼び出すだけで問題なく動作します。ただし、そのナビゲーション機能の場合、実行されるディレクトリ変更は、PowerShell がバッチ スクリプトを実行する cmd 環境にのみ影響します。周囲の PowerShell ホストのディレクトリは変更されないため、PowerShell をシェルとして使用しようとしているときにはあまり役に立ちません。
私の質問は次のとおりです。バッチスクリプトを変更できないと仮定すると(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/