ScriptToInvoke.ps1:
[CmdletBinding()]
param (
[Parameter(Mandatory=$True)]
[string[]]$StringArray,
[ValidateSet('Mode1', 'Mode2', 'Mode3')]
[string]$Mode = 'Mode1'
)
$count = $StringArray.Count
Write-Verbose ("String array count ($count): $StringArray")
ScriptCallingStartProcess.ps1:
$stringArray = @('String1','String2','String3')
Start-Process powershell -Verb RunAs
-ArgumentList "-NoExit -File ScriptToInvoke.ps1 -StringArray ""$stringArray"" -Mode Mode3 -Verbose"
在这种情况下,
$stringArray
被视为包含一个元素的数组:screen capture of script run output
我尝试了传递
$stringArray
参数的多种变体:-StringArray $stringArray
-StringArray @($stringArray)
-StringArray @(,@($stringArray))
每个都有相同的错误:
找不到接受参数'String2'的位置参数
据我了解,ArgumentList值周围的双引号会导致任何变量被解析。有可能防止这种情况发生吗?还是有替代方法?
我的用例涉及尝试以提升的权限重新运行Powershell脚本以卸载Windows更新,这就是为什么我将
Start-Process
与-Verb RunAs
一起使用的原因。 最佳答案
这是一种方法。 ScriptCallingStartProcess.ps1
:
$stringArray = @('String1','String2','String3')
$OFS=","
Start-Process powershell.exe -Verb Runas "-NoExit -File \ScriptToInvoke.ps1 $stringArray -Mode Mode3 -Verbose"
ScriptToInvoke.ps1
:[CmdletBinding()]
param (
[Parameter(Mandatory=$True)]
[String] $InputData,
[ValidateSet('Mode1', 'Mode2', 'Mode3')]
[string]$Mode = 'Mode1'
)
$StringArray = $InputData -split ','
$count = $StringArray.Count
Write-Verbose ("String array count ($count): $StringArray")
(即,以逗号分隔的字符串作为第一个参数,然后在第二个脚本内拆分)
关于powershell - 在Powershell中,如何将数组作为参数传递,该数组是Start-Process -ArgumentList的多个参数之一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35484506/