【问题标题】:Powershell syntax to use where condition with a foreach loop使用带有 foreach 循环的 where 条件的 Powershell 语法
【发布时间】:2021-09-29 02:09:57
【问题描述】:

我是 powershell 新手,并且一直在练习以变得更好,因此非常感谢您的所有帮助。

我有一个 txt 文件,其中只有我需要添加帐户的服务器列表。但是,我需要排除服务器名称中不包含“-”的服务器名称。

这就是我现在所拥有的,显然不起作用,而且我不断收到错误。

    $servers = Get-Content "$PSScriptRoot\SQLServers.txt"
    

     foreach ($server in $servers| Where $server -contains "*-*" ) 

【问题讨论】:

    标签: powershell


    【解决方案1】:

    对于通配符字符串比较,您需要-like 运算符,然后使用$_ 引用Where-Object 正在测试的当前管道项:

    foreach ($server in $servers |Where { $_ -like "*-*" }) {
       # work with each matching $server here
    }
    

    -like 也可用于直接过滤字符串集合,因此在您的情况下,您可以这样做:

    foreach ($server in @($servers) -like "*-*") {
       # work with each matching $server here
    }
    

    【讨论】:

    • 非常感谢您的帮助。尝试了第二个选项,它就像一个魅力!
    • @afzzaps,如果这是您问题的最佳答案,请选择答案左侧的复选标记图标。这让其他人知道这是最好的答案。这就是 SO 的工作原理。
    • @Mathias,我偶然发现的最后一项,如果您也可以提供帮助。过滤掉 $servers 中的 $server 后 -like -;我需要找出哪些服务器不是以 TPP 开头的。如何添加该附加过滤器以及 - 过滤器?
    • @afzzaps 您可以将多个调用链接到Where-Object... |Where { $_ -like "*-*"} |Where {$_ -notlike "TPP*"},或者使用-and 运算符将多个比较合并到一个子句中:... |Where { $_ -like "*-*" -and $_ -notlike "TPP*" }。您还可以链接多个过滤器比较(尽管它可能不是超级可读/明显):@(@($servers) -like "*-*") -notlike "TPP*"
    【解决方案2】:

    如果您的文件只有一列,您可以使用 import csv 并直接设置一列和 uniq 列的名称,如下所示:

    Import-Csv "$PSScriptRoot\SQLServers.txt" -Header server | where server -Like "*-*" | foreach{
    
    #user serveur name here
    $_.Server
    
    }
    

    否则你可以像这样直接过滤 $_ 变量:

    Get-Content "$PSScriptRoot\SQLServers.txt" | where {$_ -like "*-*"} | foreach{
    
    #user serveur name here
    $_
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 2014-10-14
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多