【问题标题】:ForEach-Object - Trying to for loop each address in a variableForEach-Object - 尝试循环变量中的每个地址
【发布时间】:2021-09-16 04:06:23
【问题描述】:

毫无疑问,回到另一个愚蠢的问题。我正在尝试为我创建的变量中存在的每个 IP 地址执行一个 for 循环。我可以创建逗号或空格分隔的字符串,但无论哪种方式,我都无法让 for 循环执行我想要的操作。

我希望将列表中的每个地址传递到此代码块中

az network application-gateway waf-policy custom-rule match-condition add `
--match-variables RemoteAddr `
--operator IPMatch `
--values <ADDRESS_FROM_STRING>

我正在根据这段脚本构建列表

$addressList = Invoke-WebRequest "https://rules.emergingthreats.net/blockrules/compromised-ips.txt" -UseBasicParsing | Select-Object -ExpandProperty Content
$threatList=(-split $addressList -join ',')

这是我对此的微弱尝试,我认为这是错误的,但我对 foreach 和 foreach-object 的理解可能超出了我的深度。

$threatlist | ForEach-Object -process (az network application-gateway waf-policy custom-rule match-condition add `
--match-variables RemoteAddr `
--operator IPMatch `
--values $_)

任何帮助将不胜感激,谢谢大家!

【问题讨论】:

  • 使用 {} 代替 ()
  • @MathiasR.Jessen 你在跟踪我吗?哈!使用您的建议,我收到以下错误,这就是我尝试使用 for 循环开始的原因。程序“az.cmd”运行失败:文件名或扩展名太长在第 1 行
  • $threatlist 不会是一个数组,所以 foreach 循环只会迭代一次。使用 $addressList.Split('这里是你的分隔符')

标签: azure powershell loops foreach


【解决方案1】:

充实Mathias R. Jessenguiwhatsthat给出的指针:

  • 使用Invoke-RestMethod(其内置别名为irm),它直接返回感兴趣的文本(这是一个带有IP地址的单个字符串,每个字符串占一行)。

  • 使用-split 的一元形式,string splitting operator,将多行字符串拆分为一个 array 标记(通过任何空格运行,这在手头的情况下意味着每个 IP 地址都成为自己的数组元素。

  • 使用ForEach-Object cmdlet 将数组作为输入,它处理您传递给它的script block ({ ... }) 中的每个元素,其中automatic $_ variable 指的是输入对象(字符串,在此案例)在手边。

-split (irm "https://rules.emergingthreats.net/blockrules/compromised-ips.txt") |
  ForEach-Object {
    az network application-gateway waf-policy custom-rule match-condition add `
      --match-variables RemoteAddr `
      --operator IPMatch `
      --values $_
  }

【讨论】:

    猜你喜欢
    • 2011-10-22
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2014-11-18
    • 2018-05-14
    • 2020-05-11
    • 2011-12-09
    相关资源
    最近更新 更多