2

Этот вопрос вызван проблемой, с которой я столкнулся при написании этого ответа. Я вызываю PowerShell, как это из реестра:

C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -NoExit -Command "cd '%v'"

Двойные кавычки необходимы для параметра Command для PowerShell.exe, а одинарные кавычки, разумеется, необходимы для работы с любыми пробелами в имени текущего рабочего каталога (CWD).

Проблема в том, что это не удается, если CWD содержит одну кавычку в своем имени (очевидно, так как это преждевременно завершает строку имени каталога). Во время тестирования из командной строки я нашел обходной путь для этого, который должен был указать две одинарные кавычки, так что первая действует как escape-символ:

1

Это все хорошо, но как мне исправить эту проблему с одинарными кавычками, когда PowerShell вызывается с % v прямо из реестра? Одним из способов может быть вызов пакетного файла с помощью % v, замена каждой отдельной кавычки в имени каталога на две одинарные кавычки, а затем по очереди вызов PowerShell, но это такое уродливое решение. У кого-нибудь есть идея получше?

2 ответа2

1

Как я уже упоминал в этом вопросе, можно косвенно запустить PowerShell, используя пакетный файл, который экранирует каждую кавычку в имени каталога.

Чтобы вызвать командный файл: "C:\PS Scripts\PS.bat" "%v"

Содержимое пакетного файла:

@set dn=%~1
@set dn=%dn:'=''%
@PowerShell -NoExit -Command "cd '%dn%'"

Я все еще надеюсь на лучшее решение, хотя.

0

Итак, моя основная идея - просто прочитать команду из stdin. Что может быть достигнуто с помощью -Command "-" . Примером может быть:

echo Set-Location "C:\Oliver's Test" | powershell -NoExit -Command "-"

Это хорошо работает, но у нас больше нет приглашения. $PWD подтвердит, что мы находимся в нужной папке.

Итак, все, что осталось, это сбросить подсказку. Я не знаю, есть ли более элегантное решение, но это работает:

echo Set-Location "C:\Oliver's Test";prompt "PS $PWD> " | powershell -NoExit -Command "-"

Код, который я первоначально нашел в Интернете для установки приглашения, использовал $($PWD.ProviderPath) вместо просто $PWD . Я не знаю почему, но, возможно, вы узнаете, когда моя версия выдает странные ошибки; D

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