Использование --% в Powershell



Я видел --% ссылки в связи с выполнением команды с несколькими параметрами. У меня возникли проблемы с поиском дополнительной информации об этом. Я подозреваю, что google думает, что я пытаюсь использовать особый синтаксис. Я надеюсь, что смогу выполнить команду plink из Powershell и с помощью переменных добавить параметры следующим образом:



&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command


Это работает, если я указываю информацию, но не с переменной подстановкой

494   3  

3 ответов:

У меня была такая же проблема, и есть обходной путь для этой проблемы. Недавно я написал об этом в блоге http://mscodingblog.blogspot.com/2013/09/use-powershell-variables-after-escaping.html вдохновившись собственным ответом powershell выполняет внешнюю команду не принимая параметр

Фокус в том, чтобы использовать --% в качестве переменной и включить ее вместе с другими переменными в powershell.

Так что вместо этого

&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command

Попробуйте это

$escapeparser = '--%'
& "./plink.exe" $escapeparser $Hostname -l $Username -pw $Password $Command

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

Я также написал об этом в блоге вскоре после отправки v3. --% превращает PowerShell в тупой синтаксический анализатор от этой последовательности символов до конца строки. Это означает, что вы не получаете никакой переменной оценки после --%.. Однако вы можете использовать переменные окружения следующим образом:

$env:hostname = $hostname
$env:user     = $user
$env:passwd   = $password
$env:command  = $command
.\plink.exe --% %hostname% -l %user% -pw %passwd% %Command%
Тем не менее, в этом сценарии я не вижу смысла использовать --%. Это должно работать просто отлично:
.\plink.exe $Hostname -l $Username -pw $Password $Command

Вы хотите использовать только --% , когда аргументы командной строки EXE ожидают аргументы с символами, которые запускают PowerShell, например:

tf.exe status . /r /workspace:*;domain\user

В данном случае tf.exe использует ;, чтобы отделить имя рабочей области от владельца рабочей области, но PowerShell интерпретирует ; как разделитель инструкций, который портит вызов tf.exe. Вы бы исправили это так:

tf.exe status . /r --% /workspace:*;domain\user

Кстати, использование & здесь не нужно, потому что вам не нужно цитировать `.\звон.отлично". Вам нужно будет только процитировать его, если имя файла или путь содержат пробел.

--% это предотвратит разбор оставшейся части инструкции с помощью Powershell. В блоге Хосе Баррето на сайте TechNet есть очень важная запись, посвященная этой проблеме. Наряду с предоставлением примера использования --%, есть и другие, такие как cmd /c, которые могут быть более полезны для решения вашей проблемы, так как powershell не разрешает переменные после --%, кажется проблематичным для вашего варианта использования.

--% является новым в Powershell версии 3.

Некоторые примеры использования из связанных блог:

PS C:\> ICACLS.EXE --% C:\TEST /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files

PS C:\> ICACLS.EXE C:\TEST --% /GRANT USERS:(F)
processed file: C:\TEST
Successfully processed 1 files; Failed processing 0 files
Как я уже упоминал выше, вам, вероятно, лучше попробовать решение, в котором можно использовать переменные powershell. & " " или cmd /c " " будут разрешать переменные и могут быть хорошим местом для начала.
cmd /c "path/plink.exe $Hostname -l $Username -pw $Password $Command"

Edit: я копался вспецификации языка Powershell для чего-то несвязанного и нашел некоторую документацию для --%. Я опубликую его здесь в надежде, что его будет легче найти в интернете для будущих пользователей:

Выдержка из 8.2 "операторы конвейера"

Аргумент --% указывает, что все аргументы, следующие за ним, должны быть прошел с минимальным разбором и обработкой. Этот аргумент называется параметр verbatim. Аргументами после параметра дословно не Выражения PowerShell, даже если они синтаксически допустимы PowerShell выражения.

Windows PowerShell: если тип команды-Application, то параметр -- %не передается команде. То аргументы после --% имеют расширенные переменные окружения (строки, окруженные%). Например:

Echoargs.exe -- % "% path% " # % path% заменяется значением $env: путь

Comments

    Ничего не найдено.