Использование --% в Powershell
Я видел --% ссылки в связи с выполнением команды с несколькими параметрами. У меня возникли проблемы с поиском дополнительной информации об этом. Я подозреваю, что google думает, что я пытаюсь использовать особый синтаксис. Я надеюсь, что смогу выполнить команду plink из Powershell и с помощью переменных добавить параметры следующим образом:
&"./plink.exe" --% $Hostname -l $Username -pw $Password $Command
Это работает, если я указываю информацию, но не с переменной подстановкой
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.Некоторые примеры использования из связанных блог:
Как я уже упоминал выше, вам, вероятно, лучше попробовать решение, в котором можно использовать переменные powershell.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& " "или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