我有PowerShell脚本,需要在新会话中启动其他PowerShell脚本。第一个脚本将一组参数作为数组传递给第二个脚本。当所有参数都有值时,一切正常,但是当我尝试传递$null
时,参数被剥离,参数列表搞砸了。
为了更好地理解这个问题,您可以执行以下操作(这只是一个示例):
将C:\ Test.ps1定义为:
param($a,$b,$c)
" a $a " | Out-File C:\temp.txt
" b $b " | Out-File C:\temp.txt -append
" c $c " | Out-File C:\temp.txt -append
在任何ps控制台中运行
PowerShell.exe -WindowStyle Hidden -NonInteractive -file C:\Test.ps1 @(1,2,3) #works as expected temp.txt contains
a 1
b 2
c 3
PowerShell.exe -WindowStyle Hidden -NonInteractive -file C:\Test.ps1 @(1,$null,5) #strips $null and writes the following to temp.txt
a 1
b 5
c
我需要在创建新会话时保留$null
,所需的temp.txt将包含
a 1
b
c 5
问题似乎是$null
被直接从数组中剥离出来,并且在被新会话解释时已经@(1,5)
。
我已经尝试声明一个空数组并逐个添加元素,也尝试用System.Collections.Generic.List[System.Object]
替换数组并使用Add方法,但$null
仍然被剥离。
我的最后一个想法是,在调用脚本中测试$ null并为参数分配默认值,然后在第二个脚本中测试默认值并重新分配$ null,或者创建一个哈希值所有参数,将其作为参数传递并处理并在调用的脚本中拆分它们。我真的不喜欢这些想法,因为它对手头的任务感觉有些过分。
理解基本问题的任何帮助,为什么$ null从数组中被剥离以及如何保留它,或者如何改变新会话的创建以拾取$null
非常感谢。
答案 0 :(得分:1)
如果我需要在脚本之间序列化数据,或者跨脚本执行保留对象,我倾向于使用Export-Clixml
和Import-Clixml
,有时会与splatting结合使用。 Clixml脚本将保留以前完整存在的对象。
例如,在发送脚本中:
$a = 1;
$b = $null;
$c = 3;
@($a, $b, $c) | Export-Clixml 'C:\params.xml'
然后检索数据:
$params = Import-Clixml 'C:\params.xml';
$x = $params[0];
$y = $params[1];
$z = $params[2];
Write-Output "$x,$y,$z";
你应该得到1,,3
。
通常你甚至可以使用哈希表来帮助组织:
@{'a'=$a, 'b'=$b, 'c'=$c} | Export-Clixml 'C:\params.xml'
然后:
$x = $params.a;
$y = $params.b;
$z = $params.c;
但哈希表有时候有点时髦。一定要测试。
至于发生了什么,看起来PowerShell在从你正在做的数组中分配参数时会跳过空值。 null值在数组中(@(1, $null, 3)[1] -eq $null
为True),它只是PowerShell跳过它。
答案 1 :(得分:0)
如果您指定了参数名称,那么PowerShell会知道您要给它的参数。
PowerShell.exe -WindowStyle Hidden -NonInteractive -file C:\Test.ps1 -a 1 -c 5
给你
a 1
b
c 5
有关PowerShell参数的更多信息here。