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 понимает только двойные кавычки; одинарные кавычки будут включены в значение).
Вот несколько вещей, которые вы можете попытаться помочь определить, почему данные не совпадают (отдельно, а не вместе):
замещать
switch ($obj.Name) {
сswitch -regex ($obj.Name) {
Используйте следующий код, чтобы показать вам, что именно 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, в некотором роде не совпадают с тем, что вы имеете в условиях переключения,