【问题标题】:Powershell Add Output of Select to VariablePowershell将Select的输出添加到变量
【发布时间】:2015-11-25 12:04:46
【问题描述】:

我想将 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

【问题讨论】:

    标签: powershell variables syntax output pipeline


    【解决方案1】:
    • 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 都将包含输出。

    【讨论】:

    • 感谢您的解释。我一直在寻找一种将变量放在管道之后的方法,但我现在知道这是错误的方法。我使用了@gmsoulman 的解决方案,它似乎最适合我的脚本。
    • @Peter 如果您开始使用 1000 台计算机,请小心,因为这是一项内存密集型操作。构建这样的数组使 PowerShell 构建一个新数组,然后附加新对象。很高兴您找到了解决方案。
    • 感谢您的建议。我将只为大约 100 台服务器执行此操作。我最终使用了另一种解决方案。
    【解决方案2】:

    您可以创建和排列(例如 $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} 
    

    【讨论】:

    • 另外,您可以将$Servers += 替换为[array]$Servers += 并避免初始化数组(即不需要$Servers = @()。)
    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多