Выражение при добавлении столбца к объекту получает ошибку Hash Literal Incomplete - PullRequest
0 голосов
/ 03 июля 2019

Почему я могу выполнить команду вне блока скрипта, но не внутри него?

Моя конечная цель - отсортировать список каталогов на основе предопределенных категорий. Код создает динамический объект из списка каталогов и добавляет два столбца. Первый созданный столбец представляет собой категорию, производную от имени, второй столбец , основанный на первом , является индексом для последующей сортировки.


Фактическая ошибка

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 Ответ

1 голос
/ 03 июля 2019

Мне удалось воспроизвести проблему, запустив этот код в виде сценария. Отсутствующее закрытие } для хэш-таблицы во второй 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)
        }
    }
}
...