Powershell if оператор для нулевого условия

Прошу прощения за этот, казалось бы, простой вопрос, потому что я очень мало знаю о PowerShell, и мне он просто нужен для очень небольшой задачи.

У меня есть файл конфигурации json с именем optionsConfig.json. Ключи являются возможными переменными среды, и если ключ присутствует при запуске сценария, элементы списка, связанные с ключом, также будут считаться переменными среды. Проблема заключается в возможности того, что один или несколько элементов в списке могут не существовать, поэтому значение будет нулевым (логика для этого ниже). Я полагаю, что оператор if / else может уловить это и удалить значение из списка, но я не уверен, как это сделать. Может ли кто-нибудь помочь?

Вот optionsConfig.json

{"test1": ["options_size", "options_connection", "options_object"],
 "test2":["options_customArgs", "options_noUDP", "options_noName"]}

Цель переменной $ Options в приведенном ниже коде - взять каждый элемент из значения списка для соответствующего теста и предположить, что эти элементы являются переменными среды в системе, затем найти их значения и сформировать объект словаря, который будет использоваться в файл json.

Вот что у меня есть на данный момент.

# Read the JSON file into a custom object.
$configObj = Get-Content -Raw optionsConfig.json | ConvertFrom-Json

# Retrieve the environment variables whose
# names are listed in the $env:test property
# as name-value pairs.
Get-Item -Path env:* -Include $configObj.$env:test

$Options = Get-Item -Path env:* -Include $configObj.$env:test |
  % {$hash = @{}} {$hash[$_.Name]=$_.Value} {$hash}
$jObj = @{test= $env:test
      RECORD= $env:Record
      HASH= $Env:hash
      target= $env:Target
      options=$Options
     }

$jObj | ConvertTo-Json | Set-Content "C:\Test\jsonStuff.json"

Мой последний объект Json в новом файле json jsonStuff.json выглядит так

{
    "options_size":  "default",
    "options_object":  "obj1",
    "options_connection":  "connected"
}

К сожалению, это может выглядеть так, если одна из переменных среды не существует.

{
    "options_size":  "default",
    "options_object":  null,
    "options_connection":  "connected"
}

Есть ли способ удалить их ключ из этого вновь сформированного объекта Json или даже не добавлять его к объекту json в зависимости от того, является ли значение нулевым? Спасибо за терпение с моими несуществующими знаниями PowerShell

[EDIT] Спасибо всем за помощь. Однако обновленный код не работает. Я не совсем уверен, в чем причина. Код,

# Read the JSON file into a custom object.
$configObj = Get-Content -Raw C:\TestWare\security_test\optionsConfig.json | ConvertFrom-Json

# Retrieve the environment variables whose
# names are listed in the $env:tool property
# as name-value pairs.
Get-Item -Path env:* -Include $configObj.$env:test

$Options = Get-Item -Path env:* -Include $configObj.$env:test |
  % {$hash = @{}} {$hash[$_.Name]=$_.Value} {$hash} 

$Options | ForEach-Object {
    $NonEmptyProperties = $_.psobject.Properties | Where-Object {$null -ne $_.Value} | Select-Object -ExpandProperty Name

    $_ | Select-Object -Property $NonEmptyProperties | ConvertTo-Json -Compress
    }

$jObj = @{test= $env:test
          Record= $env:Record
          HASH= $Env:hash
          target= $env:Target
          options=$Options
         }

$jObj | ConvertTo-Json | Set-Content "C:\Test\jsonStuff.json"

выполняется по назначению и заполняет файл json, когда он находится в собственном файле PowerShell. Он также производит этот дополнительный вывод при запуске в окне PowerShell,

{"IsReadOnly":false,"IsFixedSize":false,"IsSynchronized":false,"Keys": 
["options_size","options_object","options_connection"],"Values":["default","obj1","connnected"],"SyncRoot":{},"Count":4}

Я поместил тот же самый код в другой файл PowerShell немного большего размера, который выполняет еще несколько вещей, которые, по моему мнению, не повлияют на этот код, и в коде отображается options = System.Collections.Hashtable. Я знаю, что это в значительной степени означает, что там есть какой-то dict или map, но я не уверен, почему он должным образом создает объект json в одном файле, а не в другом. Я неправильно указал свое значение в цикле ForEach-Object?

попробуйте что-нибудь вроде if ($value -eq $null) { do something here }

No Refunds No Returns 10.08.2018 17:17

также if(!$value) / if($value)

Jacob Colvin 10.08.2018 17:19

Всегда помещайте $null в левую часть сравнения. Операторы сравнения сложны при работе с коллекциями и действуют как фильтры. @NoRefundsNoReturns

Maximilian Burszley 10.08.2018 17:23

пример? Или ссылку?

No Refunds No Returns 10.08.2018 17:25

@NoRefundsNoReturns вот пример: 1, $null, 3 -ne $null

Maximilian Burszley 10.08.2018 17:36

В конечном итоге это звучит как дубликат вопроса, на который ссылается @robdy, поэтому я закрываю его, но дайте нам знать, если это не так и почему.

mklement0 10.08.2018 18:25

@ mklement0 извините за беспокойство, но не могли бы вы дать некоторое представление о моем недавнем редактировании и возможной причине добавления Systems.Collections.Hashtable к моему json obj вместо ожидаемого dict?

UCProgrammer 13.08.2018 16:31

@UCProgrammer: Отмените редактирование и используйте его содержимое, чтобы задать конкретный вопрос новый; пожалуйста, постарайтесь максимально приблизиться к MCVE (минимальный, полный и проверяемый пример).

mklement0 13.08.2018 17:13

@ mklement0 забудь. Я починил это. Просто нужно добавить "| ConvertTo-Json -Compress" в $ Options. Мне все еще кажется странным, что мне приходится дважды конвертировать в json

UCProgrammer 13.08.2018 17:13

@UCProgrammer: Если есть поведение, которое не имеет для вас смысла, тем не менее, я рекомендую вам задать новый вопрос.

mklement0 13.08.2018 17:14
1
10
162
0

Другие вопросы по теме