2016-12-15 6 views
0

Я пытаюсь найти способ сохранить свойства для оператора 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" 

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

+0

Посмотрите на значение переменной '$ Свойства', и вы должны сразу увидеть проблему. Строки с одним кавычком не интерполируют выражения '$ (...)'. Вместо этого вам нужно использовать строку с двойными кавычками (и избегать встроенных кавычек с обратными окнами). –

+0

Я попробовал его с двойными кавычками, и он дает тот же ответ. –

+0

Обновление: я обновил исходный вопрос, чтобы включить $ Properties, используя двойные кавычки и обратные ссылки - тот же самый ответ, что и первая версия ... –

ответ

2

Аргумент -PropertySelect-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") 

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

+0

По существу, вы бы обернули все элементы в переменной свойств в массив, используя @ (...). Это правильно (или я там что-то пропустил)? Я полагаю, что в этом примере мне не нужны обратные записи (они были только там, чтобы избежать двойных кавычек. –

+0

Правильно, и вам не нужны обратные ссылки. – zdan

+0

Это сработало (после удаления обратных шагов). –