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/

10-13 07:02