PowerShell -C команда измерения со строками в кавычках, где ручное экранирование невозможно - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь синхронизировать команды, которые выходят из системы сборки, с помощью windows powershell meansure-command. Многие из команд, которые я хочу, чтобы время провалилось, когда используются в этом контексте, и ошибки указывают на проблемы с цитированием. Некоторые из ресурсов, которые я видел, указывают, что я должен избегать кавычек в этих строках, но я не знаю хорошего способа сделать это в автоматическом контексте.

Некоторые другие источники указывают, что я могу каким-то образом передать команду в стандартный ввод и выполнить ее. Я предполагаю, что это избавит от необходимости избегать кавычек, но у меня возникают проблемы с тем, чтобы заставить это работать.

В качестве тестового примера я пробую следующее:

echo dir | powershell -C measure-command

Measure-Command: Невозможно связать параметр «Выражение». Невозможно преобразовать значение "dir" типа "System.String" в тип "System.Management.Automation.ScriptBlock". В строке: 1 символ: 1 + мера-команда + ~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (:) [Measure-Command], ParameterBindingException + FullyQualifiedErrorId: CannotConvertArgumentNoMessage, Microsoft.PowerShell.Commands.MeasureCommandCommand

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

1 Ответ

0 голосов
/ 11 мая 2018

Вы правы.Но это не проблема функции dir.Проблема состоит в том, чтобы передать параметр в powershell.exe.

Фактически, когда вы отправляете параметр в powershell.exe, например myObject | powershell -C exec, аргумент transform in String.

В вашемВ случае, если вы загрузите PowerShell и отправите команду>

PS C:\Users\pierre> $foo = { dir }
PS C:\Users\pierre> Measure-Command $foo

У вас будет результат:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 35
Ticks             : 350872
TotalDays         : 4,06101851851852E-07
TotalHours        : 9,74644444444444E-06
TotalMinutes      : 0,000584786666666667
TotalSeconds      : 0,0350872
TotalMilliseconds : 35,0872

$ foo - это объект ScriptBlock

Если выиспользуйте интерактивный параметр передачи, например

myObject | PowerShell -C [...]

Это не объект, это строка.

Это похоже на Measure-Command $foo.ToString() И у вас тот же результат

PS C:\Users\pierre> Measure-Command $foo.ToString()
Measure-Command : Impossible de lier le paramètre «Expression». Impossible de convertir la valeur « dir » du type «
System.String» en type «System.Management.Automation.ScriptBlock».
Au caractère Ligne:1 : 17
+ Measure-Command $foo.ToString()
+                 ~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument : (:) [Measure-Command], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.MeasureCommandCommand

Реальный вопрос: « Как передать объект для PowerShell.exe по PipeLine? »

Использовать другую помощь: Передача блока скриптовсквозной конвейер

Для этого примера возникает вопрос " Можем ли мы обойти конвейер? ".Теперь, вот так, результат может быть напечатан (из команды command.exe или powershell.exe):

C:\Users\pierre>powershell -C "Measure-Command { echo dir }"

Доставка:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 262
Ticks             : 2627527
TotalDays         : 3,04111921296296E-06
TotalHours        : 7,29868611111111E-05
TotalMinutes      : 0,00437921166666667
TotalSeconds      : 0,2627527
TotalMilliseconds : 262,7527

ByОбобщение

В Command.exe

C:\Users\pierre>set bar="echo dir"

C:\Users\pierre>echo %bar%
"echo dir"

C:\Users\pierre>powershell -C "Measure-Command { %bar% }"


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 22
Ticks             : 228750
TotalDays         : 2,64756944444444E-07
TotalHours        : 6,35416666666667E-06
TotalMinutes      : 0,00038125
TotalSeconds      : 0,022875
TotalMilliseconds : 22,875

В PowerShell.exe:

PS C:\Users\pierre> $bar = "echo dir"
PS C:\Users\pierre> $bar
echo dir
PS C:\Users\pierre> powershell -C "Measure-Command { ${bar} }"


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 16
Ticks             : 166117
TotalDays         : 1,92265046296296E-07
TotalHours        : 4,61436111111111E-06
TotalMinutes      : 0,000276861666666667
TotalSeconds      : 0,0166117
TotalMilliseconds : 16,6117

С наилучшими пожеланиями, Питер

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