Powershell 向对象添加列时的表达式收到错误哈希文字不完整

Powershell 向对象添加列时的表达式收到错误哈希文字不完整,powershell,scriptblock,Powershell,Scriptblock,为什么我可以在脚本块外部执行命令,但不能在脚本块内部执行 我的最终目标是根据预定义的类别对目录列表进行排序。代码从目录列表中创建一个动态对象,并添加两列。创建的第一列是从名称派生的类别,基于第一列的第二列是用于以后排序的索引 实际错误 The hash literal was incomplete. At line:0 char:0 独立工作代码 $importance = "Hierarchy", "Item", "UPC", "Color", "Price" $importance.In

为什么我可以在脚本块外部执行命令,但不能在脚本块内部执行

我的最终目标是根据预定义的类别对目录列表进行排序。代码从目录列表中创建一个动态对象,并添加两列。创建的第一列是从名称派生的类别,基于第一列的第二列是用于以后排序的索引


实际错误

The hash literal was incomplete.
At line:0 char:0
独立工作代码

$importance = "Hierarchy", "Item", "UPC", "Color", "Price"
$importance.IndexOf('UPC') # returns 2
故障代码

$importance = "Hierarchy", "Item", "UPC", "Color", "Price"
$importance.IndexOf('UPC') # returns 2
总体任务是做一个目录列表,并最终按照
$importance
对列表进行排序。通过创建动态列,它将在名为
Index
的新列上排序(未显示)

$match = "UPC|Item|Color|Price|Hierarchy"

gci $incrementalTargetDir `
| Select-Object Name, @{label="Category"; Expression= {[regex]::match($_.BaseName, $match).Groups[0].Value}} `
| Select-Object Name, @{label="Index"; Expression= { $importance.IndexOf($_.Category) } 
在第二个
选择对象时失败


First select成功返回此数据:

Name                        Category
----                        --------
ColorStyleSize.txt          Color
Item.txt                    Item
FieldProductHierarchy.txt   Hierarchy
UPC.txt                     UPC
PriceAdjust.txt             Price

还尝试添加作用域
脚本:
,结果相同:

 …. Expression= { $script:importance.IndexOf($_.Category)

我能够通过将此代码作为脚本运行来复制问题。第二个
选择对象
中的哈希表缺少结束符
}
会引发此错误。一旦添加了缺少的
}
,我就可以毫无问题地运行代码了

另一种方法是使用foreach循环和自定义对象输出。如果不想排除不匹配的项,可以删除
if
语句

$incrementalTargetDir = 'Drive:\Folder1\Folder2'
$importance = "Hierarchy", "Item", "UPC", "Color", "Price"
$match = "UPC|Item|Color|Price|Hierarchy"

foreach ($file in (Get-ChildItem $incrementalTargetDir)) {
    $Category = $null
    $Category = [regex]::match($file.BaseName, $match).Groups[0].Value

    if ($Category) {
        [pscustomobject]@{
            Name = $file.Name
            Category = $Category
            Index = $importance.IndexOf($Category)
        }
    }
}

可能这只是一个输入错误,但您缺少最后一个
选择对象上的第二个
}
。添加缺少的
}
后,代码在控制台中为我工作,其中所有内容都在该控制台中定义;我最终接受了你的代码片段建议。很明显,管道为文件重命名的最终操作增加了开销。因为
if
语句演示了它可以很容易地从创建自定义对象切换到使用手头的信息执行实际的重命名操作。谢谢你的帮助和建议。