В параметрах командной строки для PowerShell.exe говорится, что вы должны иметь возможность для передачи аргументов при использовании блока сценария путем добавления -args:
PowerShell.exe -Command { - | <script-block> [-args <arg-array>] | <string> [<CommandParameters>] }
Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:
-args: термин «-args» не распознается как имя командлета, функции, файла сценария или работающей программы. Проверьте написание имени или, если был включен путь, убедитесь, что путь правильный, и повторите попытку.
Я добавил $MyInvocation | fl
в блок сценария, чтобы увидеть, что происходит, и похоже, что -args просто добавляется к десериализованным командам в блоке сценария (отсюда и ошибка, поскольку -args не является допустимой командой). Я также пробовал использовать GetNewClosure () и $ Using: VariableName, но они работают только при вызове блока сценария (в отличие от этого, когда мы используем его для сериализации / десериализации команд).
Мне удалось заставить его работать, обернув его функцией вроде ответа deadlydog.
$var = "this is a test"
$scriptblock = {
$MyInvocation | fl #Show deserialized commands
function AdminTasks($message){
write-host "hello world: $message"
}
}
Start-Process powershell -ArgumentList '-noexit','-nologo','-noprofile','-NonInteractive','-Command',$scriptblock,"AdminTasks('$var')" -Verb runAs #-WindowStyle Hidden
#Output:
MyCommand :
$MyInvocation | fl #Show deserialized commands
function AdminTasks($message){
write-host hello world: $message
}
AdminTasks('this is a test')
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 0
OffsetInLine : 0
HistoryId : 1
ScriptName :
Line :
PositionMessage :
PSScriptRoot :
PSCommandPath :
InvocationName :
PipelineLength : 2
PipelinePosition : 1
ExpectingInput : False
CommandOrigin : Runspace
DisplayScriptPosition :
hello world: this is a test
Обертывание его в блок скрипта и использование $args[0]
или $args[1]
также работает, просто имейте в виду, что вам многим нужно заключить $ var0 или $ var1 в кавычки, если есть проблемы при десериализации, и использовать `$, чтобы предотвратить появление $ sb заменен на "", так как эта переменная не существует в области действия вызывающего:
$var0 = "hello"
$var1 = "world"
$scriptblock = {
$MyInvocation | fl #Show deserialized commands
$sb = {
write-host $args[0] $args[1]
}
}
Start-Process powershell -ArgumentList '-noexit','-nologo','-noprofile','-NonInteractive','-Command',$scriptblock,"& `$sb $var0 $var1"
person
Greg Bray
schedule
07.01.2016
&
. Как& $Scriptblock
в вашем примере. - person oɔɯǝɹ   schedule 22.07.2013