列添加到对象的表达式收到错误哈希字面量不完整

时间:2019-07-03 16:12:11

标签: powershell scriptblock

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

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


实际错误

The hash literal was incomplete.
At line:0 char:0

独立工作代码

$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) } 

第二个Select-Object

失败

第一次选择成功返回此数据:

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

还尝试添加作用域script:,其结果相同:

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

1 个答案:

答案 0 :(得分:1)

我能够通过以脚本形式运行此代码来复制问题。在第二个}中哈希表缺少结尾的Select-Object会引发此错误。添加缺少的}之后,我就可以运行代码而不会出现问题。

另一种方法是使用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)
        }
    }
}