2013-11-12 1 views
1

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

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

$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, с добавлением новых «SubCategory» и «Notes» noteproperties (iPod получает ярлык для записи, 780ти планируется украсть). Но когда я бегу со следующим как переключатель ...

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"} 
} 

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

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

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

+0

Можете ли вы предоставить 2-3 строки данных образца (со строкой заголовка)? – alroc

+0

Не похоже, что это должно работать вообще. Это свойство obj.Composite не находится в хеше свойства объекта. – mjolinor

+0

Я вообще не вижу слово «композитный», на которое ссылается код. –

ответ

1

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

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

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

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

  1. Заменить switch ($obj.Name) { с switch -regex ($obj.Name) {

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

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"} 
} 

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

+0

Проблема решена, но я не могу опубликовать решение еще на 8 часов по какой-то причине на сайте. Меня это разозлило, когда я это сделал. Завтра я отправлю выводы. Вся ваша информация хороша, хотя! Проблема была точно такой же, как упоминалось. Был применен метод .replace (" ", "") для генерации исходного. CSV, импортируемого. По-видимому .replace не просто заменяет, он изменяет значение байта в записи, и это значение отличается от записи, которую человек будет генерировать вручную (например, $ item = «Value», в сравнении с $ item = $ other.name.replace ("", "")). Спасибо, что желаю помочь, Ади! – JVucic