
Ich arbeite regelmäßig interaktiv mit einem Batch-Skript, das ich nicht einfach ändern kann. Eine der Funktionen dieses Skripts ist seine Funktion als Navigationshilfe – es versteht die Code-Layout-Konventionen meines Unternehmens/Produkts und verwendet dieses Wissen, um „theScript cdTestCode“ in „cd /DC:\The\Inferred\Path\To\The\Unit\Tests“ für die Komponente umzuwandeln, in deren Verzeichnis ich mich gerade befinde. Das ist eine tolle kleine Zeitersparnis.
Ich möchte dieses Skript in einer interaktiven PowerShell-Umgebung verwenden können. Für die meisten seiner zahlreichen Funktionen funktioniert es problemlos, das Skript einfach in PowerShell aufzurufen. Bei dieser Navigationsfunktion wirkt sich die durchgeführte Verzeichnisänderung jedoch nur auf die cmd-Umgebung aus, in der PowerShell das Batch-Skript ausführt. Das Verzeichnis des umgebenden PowerShell-Hosts wird nicht geändert, was bedeutet, dass es für mich nicht sehr nützlich ist, wenn ich versuche, PowerShell als meine Shell zu verwenden.
Meine Frage ist also:Vorausgesetzt, ich kann das Batch-Skript nicht ändern(und ich möchte es nicht als PowerShell-Skript neu schreiben), gibt es eine gute Möglichkeit, das endgültige Arbeitsverzeichnis des Batch-Skripts nach Abschluss des Batch-Skripts wieder an den PowerShell-Host zu übertragen? Das heißt, gibt es eine einigermaßen einfache Möglichkeit, eine Funktion zu schreiben:
function InvokeBatchScriptAndAssumeDirectory($BatchScriptFullName) {
# ...
}
so dass
PS> pwd
Path
----
C:\elsewhere
PS> echo .\mybatchscript.cmd
@ECHO OFF
cd /D C:\
PS> InvokeBatchScriptAndAssumeDirectory .\mybatchscript.cmd
PS> pwd
Path
----
C:\
Diese Frageist sehr ähnlich, aber die „Lösung“, die es bietet, besteht lediglich darin, die Batchdatei in ein .ps1-Skript zu ändern. Das Batchskript, mit dem ich arbeite, ist sehr komplex – dazu wäre eine erhebliche Umschreibung erforderlich, was ich lieber vermeiden möchte.
Antwort1
Letztendlich habe ich mich für den Vorschlag von @dangph entschieden.
Param([string]$Script, [string]$ScriptParams)
$WorkingDirectoryTempFile = [IO.Path]::GetTempFileName()
cmd /c " `"$Script`" $ScriptParams && cd > `"$WorkingDirectoryTempFile`" "
Get-Content $WorkingDirectoryTempFile | Set-Location
Remove-Item $WorkingDirectoryTempFile
Nebenbei bemerkt hat Lee Holmes 2006 ein Skript geschrieben, das im Wesentlichen das gleiche Problem löst:http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/