Почему это не работает? - Попытка сохранить свойства в переменной для многократного использования в функции.

Я пытаюсь найти способ сохранить свойства оператора select в PowerShell, но он не работает. Я не нашел способа сделать весь оператор литералом, чтобы он не проверялся до тех пор, пока переменная не будет открыта.

Вот что работает:

$wsus.GetSummariesPercomputerTarget($CurrentMonthUpdateScope, $ComputerScope) |
    Select-Object @{L="WSUSServer";E={$Server}},
        @{L="FromDate";E={$($CurrentMonthUpdateScope.FromCreationDate).ToString("MM/dd/yyyy")}},
        @{L="ToDate";E={$($CurrentMonthUpdateScope.ToCreationDate).ToString("MM/dd/yyyy")}},
        @{L='Computer';E={($wsus.GetComputerTarget([guid]$_.ComputerTargetID)).FullDomainName}},
        DownloadedCount,
        NotInstalledCount,
        InstalledPendingRebootCount,
        FailedCount,
        Installedcount |
    Sort-Object -Property "Computer"

и я пытаюсь поместить упомянутые свойства (начиная сразу после оператора Select-Object и заканчивая непосредственно перед последним каналом) в переменную, чтобы я мог использовать одни и те же свойства несколько раз с разными областями.

Я пробовал это:

$Properties = '@{L="WSUSServer";E={$Server}},
@{L="FromDate";E={$($CurrentMonthUpdateScope.FromCreationDate).ToString("MM/dd/yyyy")}},
@{L="ToDate";E={$($CurrentMonthUpdateScope.ToCreationDate).ToString("MM/dd/yyyy")}},
@{L="Computer";E={($wsus.GetComputerTarget([guid]$_.ComputerTargetID)).FullDomainName}},
DownloadedCount,
NotInstalledCount,
InstalledPendingRebootCount,
FailedCount,
Installedcount'

$wsus.GetSummariesPercomputerTarget($CurrentMonthUpdateScope, $ComputerScope) |
    Select-Object $Properties |
    Sort-Object -Property "Computer"

Пока он работает, он не дает никаких данных, и я думаю, что это сбивает с толку PowerShell.

Это дает тот же ответ:

$Properties = "@{L=`"WSUSServer`";E={$Server}},
@{L=`"FromDate`";E={$($CurrentMonthUpdateScope.FromCreationDate).ToString(`"MM/dd/yyyy`")}},
@{L=`"ToDate`";E={$($CurrentMonthUpdateScope.ToCreationDate).ToString(`"MM/dd/yyyy`")}},
@{L=`"Computer`";E={($wsus.GetComputerTarget([guid]$_.ComputerTargetID)).FullDomainName}},
DownloadedCount,
NotInstalledCount,
InstalledPendingRebootCount,
FailedCount,
Installedcount"

Есть варианты, мысли и т.д.?


person J.C.    schedule 15.12.2016    source источник
comment
Посмотрите на значение вашей переменной $Properties, и вы сразу увидите проблему. Строки в одинарных кавычках не интерполируют выражения $(...). Вместо этого вам нужно будет использовать строку в двойных кавычках (и избегать встроенных кавычек с помощью обратных кавычек).   -  person Joe White    schedule 15.12.2016
comment
Я также пробовал с двойными кавычками, и он дает тот же ответ.   -  person J.C.    schedule 15.12.2016
comment
Обновление: я обновил исходный вопрос, включив в него $Properties с использованием двойных кавычек и обратных кавычек - тот же ответ, что и в первой версии...   -  person J.C.    schedule 15.12.2016
comment
Можете ли вы попробовать разбить его на один большой @{}. Вместо того, чтобы использовать формат вычисляемых свойств, использовать формат разбрызгивания с блоками скрипта? Например: $Properties = @{'WSUSServer'='$Server'; 'FromDate'='{$($CurrentMonthUpdateScope.FromCreationDate).ToString("MM/dd/yyyy)}'; } Я не уверен, что это работает. Дополнительные сведения о сплаттинге см. здесь: technet.microsoft.com /en-us/library/ Спасибо, Тим.   -  person Tim Haintz    schedule 15.12.2016


Ответы (1)


Аргумент -Property функции Select-Object ожидает массив, а не строку. Что-то вроде этого:

$Properties = @(@{L="WSUSServer";E={$Server}},
                @{L="FromDate";E={$($CurrentMonthUpdateScope.FromCreationDate).ToString("MM/dd/yyyy")}},
                @{L="ToDate";E={$($CurrentMonthUpdateScope.ToCreationDate).ToString("MM/dd/yyyy")}},
                @{L="Computer";E={($wsus.GetComputerTarget([guid]$_.ComputerTargetID)).FullDomainName}},
                "DownloadedCount",
                "NotInstalledCount",
                "InstalledPendingRebootCount",
                "FailedCount",
                "Installedcount")

Обратите внимание, вам нужно будет превратить простые имена свойств в строки в вашем массиве.

person zdan    schedule 15.12.2016
comment
Таким образом, вы должны были бы обернуть все элементы в переменной свойств в массив, используя @(...). Это правильно (или я что-то еще упускаю там)? Я полагаю, что в этом примере мне не нужны обратные кавычки (они были там только для того, чтобы избежать двойных кавычек. - person J.C.; 15.12.2016
comment
Это сработало (после удаления обратных кавычек). Спасибо! - person J.C.; 16.12.2016
comment
@() является необязательным. Достаточно списка через запятую. Важно не помещать весь список в кавычки (чтобы он не превратился в одну строку). - person Ansgar Wiechers; 16.12.2016