Вы правы.Но это не проблема функции 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
С наилучшими пожеланиями, Питер