2

Я регулярно работаю в интерактивном режиме с пакетным скриптом, который я не могу легко изменить. Одной из функций этого скрипта является вспомогательное средство навигации - он понимает правила компоновки кода моей компании / продукта и использует эти знания для преобразования "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 ответ1

0

Я закончил тем, что пошел с предложением @ 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 и-другие-технологии /

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .