Почему переменная в PowerShell расширяется до `-encodedCommand` вместо ее фактического значения? - PullRequest
0 голосов
/ 09 октября 2018

Я хочу, чтобы переменная $mydate или команда Get-Date -Format yyyy-MM-dd расширились в следующей командной строке (обратите внимание на фигурные скобки , требуемые для svn.exe клиента :

$mydate = Get-Date -Format yyyy-MM-dd

svn log https://svn.apache.org/repos/asf/ -r {Get-Date -Format yyyy-MM-dd}

svn log https://svn.apache.org/repos/asf/ -r {$mydate}

В обоих случаях я получаю следующую ошибку:

svn: E205000: Syntax error in revision argument '-encodedCommand'

Почему переменная становится -encodedCommand? Должен ли я избегать фигурных скобок? Как? Галочка '`' не работает:

Error formatting a string: Input string was not in a correct format..
At line:1 char:1
+ svn log https://svn.apache.org/repos/asf/ -r `{$mydate`}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Чтобы дополнить полезный ответ Яквахолика справочной информацией:

Без кавычек Использование {...} имеет особое значение в PowerShell : оно создает блок сценария (блок сценария), который представляет собой повторно используемый фрагмент кода PowerShell, который можно передать в качестве аргумента или сохранить в переменной для последующего выполнения по требованию.

Следовательно, для передачи аргументов со встроенными { или } символами, кавычка их '...' (буквенная строка, например, '{foo}') или "..."(расширяемая строка, например "{$foo}"), при необходимости).


Поведение, которое PowerShell проявляет в Windows PowerShell v5.1 / PowerShell Core 6.1.0 с без кавычек {...} - это известная проблема :

Блок сценария не имеет значения вне PowerShell, например, при передаче аргументов во внешнюю программу, такую ​​как svn.

Напротив, вызывая собственный CLI PowerShell - powershell.exe (WindowsPowerShell), pwsh (PowerShell Core) - с блоком сценариев поддерживается , с помощью скрытого Base64-кодирования содержимого блока сценария, с кодированной строкой, передаваемой через -encodedCommand, иСериализация CLIXML применяется к аргументам и конвейерному вводу - см. этот комментарий к GitHub

Этот механизм в настоящее время - бессмысленно - применяется и к другим внешним программам, поэтому вы видели аргумент -encodedCommandпоявляются.

0 голосов
/ 09 октября 2018

У меня недостаточно очков для комментариев, но попробуйте:

svn log https://svn.apache.org/repos/asf/ -r "{$($mydate)}"

Внешние "кавычки преобразуют все это в строку, поэтому игнорирует фигурные скобки.() позволяет правильно интерпретировать переменную (не как строку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...