1

我正在从 CSV 导入创建一系列新的 PSObject,然后将它们添加到 $new。我正在使用开关来尝试设置“Notes”属性的值,因为正在创建\添加对象,并且我遇到了一些'hinky'。

当我运行这个...

$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 得到了烧录标签,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 并用 * 替换开关连字符,并将 ` 字符放在 - 之前。似乎没有任何工作。

4

1 回答 1

1

代码没有问题,所以问题一定出在数据上。我验证它适用于在“名称”列中具有这些精确连字符值的 CSV 文件。

如果switch不适用于带连字符的名称,则导入Name属性的值与switch语句中的值不匹配。始终发布您正在使用的数据或其中的样本是一个好主意,因为这通常是问题的根源。即使不是,它也可以帮助其他人了解您要完成的工作以及您的代码的作用。由于我们没有数据,我可以提出一些可能的可能性:

  • 您在 switch 语句中手动输入名称,它们看起来像 CSV 中的内容,但实际上并不匹配,例如,您将O0混淆,因为它们在您使用的字体中看起来相同。我怀疑像破折号而不是连字符之类的东西,但是您说您尝试用通配符替换连字符
  • 你有尾随空格
  • 您正在单引号 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值不匹配,在某种程度上与您在switch条件中的值不同.

于 2013-11-12T18:02:52.080 回答