【问题标题】:Delete specific line from variable从变量中删除特定行
【发布时间】:2018-08-04 01:58:59
【问题描述】:

我正在制作一个 PowerShell 脚本,它将列出当前登录到系统的用户数。

我要做的是:

$users = query user /server:localhost
$number = $users.Count

if ( $number -le 1 ) {
    Write-Host 0 Users online"|" Users=0
} else {
    $number = $users.Count-1
    Write-Host $number Users online"|" Users=$number
}
exit

但是我需要能够排除用户,例如管理员。

我以为我可以发表if 声明,但我真的不知道如何正确地做到这一点。

假设我这样做:

$users = query user /server:localhost

if ($users -contains '*Administrator*') {
    $number = $users.Count-2
    Write-Host $number
}
exit

我添加.Count-2是因为第一行是“用户名、ID、会话”等信息。

它没有返回任何东西,所以我认为我不能做出这样的if 声明。

是否可以从$users 变量中“grep”某些内容并删除该行?

例如,如果我运行:

$users[1]

它将返回第二行等。但是我该如何操作这些行?

我也试过了:

$users | Where-Object {$_ -match 'administrator'}

但这什么也没有返回。

这里有人对我能做什么有意见吗?

【问题讨论】:

  • 试试$users | Where-Object {$_ -notlike "*Administrator*"}
  • 太快了。那确实奏效了。非常感谢!
  • 没问题 :) 需要更详细的解释或自己解决?
  • 我想我可以从这里弄清楚。那是我缺少的那部分。谢谢!
  • 您可能会认为它过大了,但this function 应该将该输出转换为客户的 powershell 对象。我用它来转换基于文本的输出,就像你所拥有的一样。

标签: powershell


【解决方案1】:

它不返回任何东西,所以我认为我不能做出这样的if 声明。

你可以大致像那样做一个if 声明,但你不能做的是使用:

'some words test' -contains 'words'

作为测试。这是因为-contains 是为了这个用途:

@('collection', 'of', 'words', 'here') -contains 'words'     # if a collection contains X.

对于字符串中的文本,您需要以下之一:

'some words test' -like '*words*'   # this is a wildcard match, case insensitive.

#or

'some words test' -match 'words'    # this is a regex match, case insensitive.

#or

'some words test'.Contains('words')    # this is a .Net method on strings, case sensitive.

【讨论】:

  • 或者只使用字符串方法.Contains()...'some words test'.Contains('words') -contains 运算符旨在用于集合。
  • FYI Contains 方法区分大小写,可能会搞砸
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多