2015-05-20 2 views
0

У меня есть сценарии 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 
    
  • работать в любой п.с. консоль

    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.

+1

Оба ответа от битков Бэкона и ответ от Сэмюэля Прута полезны для проблемы, с которой я столкнулся. Для моего случая ответ Сэмюэла быстрее и проще реализовать, чтобы это был принятый ответ. Splatting выглядит великолепно, поэтому для тех, кто сталкивается с подобными проблемами с параметрами прохождения, обязательно проверьте его (можете найти ссылку в ответе Bacon Bits). – Mircea

ответ

0

Если вы укажете имена параметров, PowerShell знает, какие параметры вы ему даете.

PowerShell.exe -WindowStyle Hidden -NonInteractive -file C:\Test.ps1 -a 1 -c 5

дает

a 1 
b 
c 5 

Больше на PowerShell параметры here.

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; 

Но Hashtables немного напуганная иногда. Обязательно проверьте.

Что касается того, что происходит, похоже, что PowerShell пропускает нулевые значения при назначении параметров из массива, как вы делаете. Нулевое значение находится в массиве (@(1, $null, 3)[1] -eq $null - True), это просто PowerShell, пропуская его.

Смежные вопросы