2015-11-25 2 views
0

Я хотел бы сохранить вывод команды Select в переменной. Вот исходный код:Powershell Добавить выходной параметр Select to Variable

# OUs to search for servers 
"OU=Domain Controllers,$mydomain", "OU=Server,OU=Berlin,$mydomain" | 
# For each OU get Windows Server 
ForEach { Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server*' } -Properties OperatingSystem -SearchBase $_ } | 
Select -Exp Name | Add-Content C:\serverfile.txt 

В последней строке я хотел бы изменить Add-Content команды, которая добавляет вывод переменных $ серверов. Однако я не могу правильно получить синтаксис. Я пробовал:

| Add-Content $Servers 

| $Servers 

"> $Servers" 

$Servers += Select -Exp Name 

ответ

0

Вы можете создать и массив ($ серверов, например), а затем добавьте каждый результат в него:

$Servers = @() 
"OU=Domain Controllers,$mydomain", "OU=Server,OU=Berlin,$mydomain" | 
# For each OU get Windows Server 
ForEach { $Servers += Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server*' } -Properties OperatingSystem -SearchBase $_ | Select -ExpandProperty Name} 
+0

Кроме того, вы можете заменить '$ Servers + =' на '[array] $ Servers + =' и избежать необходимости инициализировать массив (т. Е. Не нужно '$ Servers = @()'.) – gms0ulman

+0

спасибо Авшалом и @gmsoulman, это сработало! – Peter

1
  • Add-Content $Servers - Add-content бы ожидать, что $servers это путь к файлу. Это не то, что вы хотите. См. Больше от Add-Content.
  • | $Servers - $servers не является функцией, командлетом, псевдонимом или командой, которая принимает вход конвейера. Это не то, что вы хотите. Вот видео, которое может быть начато для understanding the pipeline. Не лучший пример, но это начало.
  • "> $Servers" - Перенаправление также предполагается использовать для путей к файлам (по большей части.). $servers не путь к файлу. Это не то, что вы хотите. См. Больше от about_redirection.

Вы можете просто напрямую передать выходные данные из конвейера переменной. Это то, что вы могли бы сделать. Существуют и другие варианты, такие как построение массива внутри цикла. В этом нет необходимости.

$servers = "OU=Domain Controllers,$mydomain", "OU=Server,OU=Berlin,$mydomain" | ForEach-Object { 
    Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server*' } -Properties OperatingSystem -SearchBase $_ } | 
    Select-Object -ExpandProperty Name 

Или, если вам нужно сделать, как вывод в файл и переменную можно использовать Tee-Object

"OU=Domain Controllers,$mydomain", "OU=Server,OU=Berlin,$mydomain" | ForEach-Object { 
    Get-ADComputer -Filter { OperatingSystem -Like '*Windows Server*' } -Properties OperatingSystem -SearchBase $_ } | 
    Select-Object -ExpandProperty Name | Tee-Object -Variable servers | Add-Content "C:\serverfile.txt" 

В обоих случаях $servers будет содержать выход.

+0

Спасибо за объяснения. Я всегда искал способ поместить переменную после конвейера, но теперь я знаю, что это был неправильный подход. Я использовал решение @gmsoulman, оно, по-видимому, соответствовало моему сценарию. – Peter

+0

@Peter Если вы начинаете делать 1000-ый компьютер, будьте осторожны, так как это интенсивная операция с памятью. Построение такого массива заставит PowerShell построить новый массив, а затем добавить новый объект. Рад, что вы нашли решение. – Matt

+0

Спасибо за ваш совет. Я буду делать это всего за 100 серверов. И я в конце концов использовал другое решение. – Peter

Смежные вопросы