【问题标题】:If-else inside a foreach doesn't return what I think it shouldforeach 中的 if-else 不会返回我认为它应该返回的内容
【发布时间】:2017-05-09 20:38:16
【问题描述】:

我有一个需要循环的服务器数组,并且有一个仅分配给特定服务器的属性(这会在脚本后面发生)。

这是数组:

$test = @('test_dc','test_fp','test_ts','test_ap')

在阵列中,我有一个域控制器、文件/打印、终端服务器和应用程序服务器(按此顺序)。

应该获取该属性的唯一服务器是 fp、ts 和 ap 服务器。

这是我迄今为止尝试过的:

foreach ($item in $test) {
  Write-Host $item "`n"
  Write-Host "Start IF here `n"
  if ($item.Name -like '*fp*') {
    Write-Host "Found $item"
  } else {
    Write-Host "ELSE `n"
    Write-Host '-=-=-=-=-'
  }
}

输出如下:

PS C:\Users\me\Desktop> .\scratch.ps1 test_dc 从这里开始 别的 -=-=-=-=- test_fp 从这里开始 别的 -=-=-=-=- test_ts 从这里开始 别的 -=-=-=-=- test_ap 从这里开始 别的 -=-=-=-=- PS C:\用户\我\桌面>

根据我认为它应该工作的方式,我应该看到这个:

... test_fp 找到 test_fp ...

我也试过这个:

if ($test -contains '*fp') {
  Write-Host "Found $_"
} else {
  Write-Host 'end'
}

我只得到一个空行。

【问题讨论】:

  • 将字符串的星号部分用作通配符在powershell中不起作用,删除星号并尝试。或者在这种情况下使用正则表达式模式。
  • $item 只是一个普通字符串,它没有 name 属性。将$item.name -like '*fp*' 更改为$item -like '*fp*'
  • 是在屏幕上看到它的唯一目标吗?因为,这就是 Write-Host 所能做的。无法重定向。
  • @t0mm13b:PowerShell 的-like 运算符的全部意义在于支持包含元字符的通配符模式,例如*(星号)。这里唯一的问题是输入由字符串组成,而字符串没有.Name属性。
  • @lit 可以重定向,在 PSv5 中已更改 - stackoverflow.com/questions/38523369/…

标签: arrays powershell if-statement foreach


【解决方案1】:

您会看到额外的信息被写入主机,因为您对每个项目都有无限期的写入,无论它是否匹配。由于您还包括else 语句,因此您将看到为不匹配的项目编写的额外内容。您的 foreach 循环还指定了对象的 name 属性,而您的 $test 数组仅包含字符串。

这是我将其更新为限制仅在循环中写入与*fp* 匹配的主机名,否则写入您的分隔符:

$test = @('test_dc','test_fp','test_ts','test_ap')
foreach ($item in $test) {
  if ($item -like '*fp*') {
    Write-Host "Found $item"
  } else {
    Write-Host '-=-=-=-=-'
  }
}

运行会输出这个:

-=-=-=-=-
Found test_fp
-=-=-=-=-
-=-=-=-=-

【讨论】:

  • 谢谢!我想是这样的,但我不确定。只是出于好奇,我在第二个示例中将-contains 更改为-like,脚本如我预期的那样返回“找到”,但为什么它没有返回找到的文本或任何以$_ 表示的内容?
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多