
Я регулярно работаю в интерактивном режиме с пакетным скриптом, который не могу легко изменить. Одна из функций этого скрипта — помощь в навигации: он понимает соглашения о макете кода моей компании/продукта и использует эти знания для преобразования "theScript cdTestCode" в "cd /DC:\The\Inferred\Path\To\The\Unit\Tests" для компонента, в каталоге которого я сейчас нахожусь. Это здорово экономит время.
Я хотел бы иметь возможность использовать этот скрипт из интерактивной среды PowerShell. Для большинства его многочисленных функций простой вызов скрипта из PowerShell работает нормально. Но для этой функции навигации выполняемое им изменение каталога влияет только на среду cmd, в которой PowerShell запускает пакетный скрипт. Каталог окружающего хоста 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
Кстати, Ли Холмс в 2006 году написал сценарий, который решает по сути ту же самую проблему:http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/