PowerShell Switch не работает с переносами

Я создаю серию новых PSObjects из импорта CSV, а затем добавляю их в $new. Я использую переключатель, чтобы попытаться установить значение для свойства "Примечания", поскольку объект создается \ добавляется, и я столкнулся с чем-то "странным".

Когда я запускаю это...

$import = Import-Csv c:\somerandom.csv
$new = @() 
foreach ($Item in $Import) { 
    $obj = New-Object PsObject -Property @{ 
           Name = $item.Name
           Description = $Item.Description
           Quantity = $Item.Quantity
           Vendor = $Item.Vendor 
           SubCategory = "Misc"
           Notes = ""
    } 
    switch ($obj.Name) { 
        "iPod" { $obj.Notes = "Burn with the rest of the Apple garbage"} 
        "nVidia GTX 780ti" { $obj.Notes = "Steal immediately!" } 
        default { $obj.Notes= "Sorry man... I have no idea what that is"} 
    }
    $new += $obj
}

... это работает, как ожидалось. Все записи из $ import воссоздаются в $ new с добавлением моих свойств примечаний "Подкатегория" и "Заметки" (iPod получает тег записи, 780ti планируется украсть). Но когда я бегу со следующим в качестве переключателя...

switch ($obj.Name) { 
    'SOFM090-107-01-PF-R' { $obj.Notes = "Burn with the rest of the Apple garbage"} 
    'M094-107-01-PF-R' { $obj.Notes = "Steal immediately!" } 
    default { $obj.Notes = "Sorry man... I have no idea what that is"} 
}

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

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

Я пробовал это с одинарными кавычками, двойными кавычками, используя -wildcard и заменяя дефисы переключателей на * и помещая символ `перед символом -s. Кажется, ничего не работает.

1 ответ

В коде нет ничего плохого, поэтому проблема должна заключаться в данных. Я проверил, что он отлично работает с CSV-файлом, который имеет эти точные дефисные значения в столбце "Имя".

Если переключатель не работает с дефисными именами, то значения, импортируемые в свойство Name, не совпадают с тем, что есть в операторе switch. Хорошей идеей будет всегда публиковать данные, с которыми вы работаете, или их образцы, потому что часто это является источником проблемы. Даже если это не так, это помогает другим людям понять, чего вы пытаетесь достичь и что делает ваш код. Поскольку у нас нет данных, я могу предложить несколько вероятных возможностей:

  • Вы вручную вводите имена в оператор switch, и они выглядят как в CSV, но на самом деле не совпадают, например, вы путаете O с 0, потому что они выглядят одинаково в шрифте, с которым вы работаете. Я бы заподозрил что-то вроде дефиса вместо дефиса, но вы говорите, что пытались заменить дефисы подстановочными знаками
  • У вас есть пробелы
  • Вы используете одинарные кавычки в именах переносов в файле CSV (Import-Csv понимает только двойные кавычки; одинарные кавычки будут включены в значение).

Вот несколько вещей, которые вы можете попытаться помочь определить, почему данные не совпадают (отдельно, а не вместе):

  1. замещать switch ($obj.Name) { с switch -regex ($obj.Name) {

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

Write-Host -NoNewline "[$($obj.Name)] "
switch ($obj.Name) { 
  'SOFM090-107-01-PF-R' {Write-Host 'burn'; $obj.Notes = "Burn with the rest of the Apple garbage"} 
  'M094-107-01-PF-R' {Write-Host 'steal'; $obj.Notes = "Steal immediately!"} 
   default {Write-Host 'sorry'; $obj.Notes = "Sorry man... I have no idea what that is"} 
}

Если вы разместите данные, мы, вероятно, сможем точно сказать, почему они не работают. Но я могу в значительной степени гарантировать вам, что, если вы используете этот код, проблема в том, что импортированные значения Name, которые не сопоставляются с правильными значениями Notes, в некотором роде не совпадают с тем, что вы имеете в условиях переключения,

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