在使用参数创建新的Powershell会话时保留$ null值

时间:2015-05-20 14:59:58

标签: arrays session powershell

我有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非常感谢。

2 个答案:

答案 0 :(得分:1)

如果我需要在脚本之间序列化数据,或者跨脚本执行保留对象,我倾向于使用Export-ClixmlImport-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