2

Я использую слегка измененную версию техники, приведенной в этом ответе, для создания элемента контекстного меню в проводнике Windows, который позволяет мне запускать сценарий PowerShell для определенных папок.

Команда выглядит так:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \"%1\" | clip" 

Это прекрасно работает, за исключением случаев, когда в имени папки есть символ амперсанда (&). Затем я получаю следующую ошибку (целевая папка была названа Testing & Testing):

The string starting:
At line:1 char:37
+ C:\PowerShellScript\folder_script.ps1  <<<< "E:\tmp\Testing
is missing the terminator: ".
At line:1 char:53
+ E:\Dropbox\PowerShell\namefixer.ps1 "E:\tmp\Testing  <<<<
    + CategoryInfo          : ParserError: (E:\tmp\Testing :String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

Очевидно, что-то интерпретирует амперсанд как специальный символ, но я не знаю, как это исправить. Исключение амперсанда из имени папки не является жизнеспособным решением для меня.

Решение, которое не включает пакетный скрипт, было бы предпочтительным.

Я использую Windows 7 Enterprise (64-разрядная версия) с PowerShell 2.

3 ответа3

2

Вы можете использовать дословный маркер Powershell: --% , он говорит Powershell, что все, что следует за ним, не должно интерпретироваться.

Таким образом, ваша команда станет:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 --% \"%1\" | clip" 

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

Этот маркер является новым для Powershell 3.0, поэтому убедитесь, что он у вас в актуальном состоянии.

1

Вы можете попробовать изменить скрипт PowerShell. И измените строку cmd на командный файл ...

Ваша партия (runner.cmd)

set ps_arg="%~1"
@cd /d %~dp0
PowerShell "folder_script.ps1 | clip"

Вторая строка означает, что папка, в которой находится файл runner.cmd, является текущей папкой, поэтому вы можете запускать сценарий PowerShell без полного пути. Облегчает перемещение объектов, поскольку вам не нужно редактировать файл runner.cmd.

И получите доступ к вашему пути через следующее в вашем скрипте:

$value = $env:ps_arg -replace """",""

Кавычки из командного файла, похоже, передаются в сценарий PowerShell и должны быть удалены, поэтому -replace """","" . Поскольку двойные кавычки недопустимы в именах файлов Windows, это никогда не удалит ничего важного.

Итак, командная строка будет

cmd /K runner.cmd "%1"
0

Это вопрос цитирования. Замените экранированные двойные кавычки на экранированные одинарные кавычки, чтобы ваша команда выглядела следующим образом:

cmd /K PowerShell "C:\PowerShellScript\folder_script.ps1 \'%1\' | clip"

Вы используете две разные программы (cmd и powershell) и запускаете три разных куска кода, которые могут принимать аргументы (cmd, powershell и сценарий .ps1).

cmd нужны три аргумента: /K Powershell и аргументы для powershell. Аргументы для powershell должны быть одной строкой, поэтому они заключены в кавычки.

Powershell нужен один аргумент: командная строка, которую вы хотите выполнить.

Скрипт .ps1 нуждается в аргументе: папка для запуска. Powershell должен интерпретировать путь как одну строку, поэтому он должен быть в кавычках.

Когда вы запускаете команду, cmd запускает Powershell и отправляет ей строку в кавычках с раскрытой переменной и без кавычек или escape-символов: C:\PowerShellScript\folder_script.ps1 "Testing & Testing" | clip

Кавычки гарантируют, что скрипт видит один аргумент вместо трех.

(Я не уверен, почему разные типы цитат дали разные результаты (насколько я знаю, их не должно быть), но они сделали, когда я тестировал, поэтому я предоставил решение, которое работало в моей системе. Если вы сможете предоставить более подробную информацию, я смогу найти решение, которое также подойдет вам.)

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