Powershell 将 Select 的输出添加到变量

Powershell Add Output of Select to Variable

我想将命令 Select 的输出存储在一个变量中。原代码如下:

# 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 更改为将输出添加到变量 $Servers 的命令。但是我无法正确使用语法。我试过了:

| Add-Content $Servers

| $Servers

"> $Servers"

$Servers += Select -Exp Name

您可以创建数组(例如 $Servers),然后将每个结果添加到其中:

$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} 
  • Add-Content $Servers - Add-content 期望 $servers 是一个文件路径。这不是你想要的。查看来自 Add-Content.
  • 的更多内容
  • | $Servers - $servers 不是接受管道输入的函数、cmdlet、别名或命令。这不是你想要的。这是一个视频,可以作为 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 都将包含输出。