【问题标题】:Powershell passing variable as a filter stringPowershell将变量作为过滤器字符串传递
【发布时间】:2013-09-10 16:49:25
【问题描述】:

我正在尝试编写一个脚本来从服务器检索登录用户的用户名,(这是一个使用未格式化字符串数据的练习,我知道其他获取此数据的方法,所以请不要建议他们)

我正在尝试将 WMI 查询中的数字字符串传递到 where-object 过滤器 这是从 Win32_LoggedOnUser 类读取 WMI 输出

$Name | where {$_.Dependent -like $ID } | select Antecedent

问题似乎在于读取 ID 变量,我尝试了几种变体,这是一个与过滤器格式的一些通配符连接的值,当我将字符串转换为 CSV 格式时,我得到了提示,所以我可以更轻松地执行 [regex]::Split,我收到 InputObject 为空的错误,如果我单独运行上面的行,我只会得到空结果,如果我手动输入过滤器字符串,我会得到我想要的输出。

[String]$ID = "'*"+$UserSessions.LogonId+"*'"

如果我做一个 write-host,我只会返回 '146771' 这似乎是我想要的,并且 get-member 显示它是一个 [System.String]

然后我将其扔到一个拆分中,该拆分抓取最后一个标记,即用户名,如果我手动输入过滤器字符串而不是我尝试过的任何格式的变量,整个脚本都可以正常工作

${ID}   ($ID)   ""$ID""  $($ID)

这是完整的脚本供参考

$UserSessions = GWMI Win32_LogonSession | where { $_.LogonType -eq 2}

[String]$ID = "'*"+$UserSessions.LogonId+"*'"

$Name = GWMI Win32_LoggedOnUser

$Results = $Name | where {$_.Dependent -like $ID } | select Antecedent

$Split = $Results | ConvertTo-Csv

$Splat =  [regex]::Split($Split, """")[9]

Write-Host "User = $Splat"

【问题讨论】:

    标签: powershell conditional-statements


    【解决方案1】:

    gwmi Win32_LogonSession 可能会产生多个结果,因此您需要考虑这一点。此外,拆分产生的字段比您预期的要少。

    这对我有用:

    gwmi Win32_LogonSession | ? { $_.LogonType -eq 2 } | % {
      $ID = "*$($_.LogonId)*"
      gwmi Win32_LoggedOnUser | ? { $_.Dependent -like $ID } | select Antecedent
    } | % {
      $name = ($_.Antecedent -split '"')[3]
      Write-Host "User = $name"
    }
    

    【讨论】:

    • 我在 var 中看到的唯一真正变化是您使用的是 $_ Last Pipeline 通用变量,不知道为什么它不适用于任何变体,我不太确定关于解析数组中的多个对象是一个问题,至少在我使用的测试环境(本地家用电脑)中,在我过滤后只有一个对象从该查询中出来,尽管你基本上做了我最终要做的事情并且把它全部放在一个 ForEach 循环中以在服务器上运行,所以谢谢你。
    • 值得注意的是,如果你在服务器上运行这个,比如我在工作中遇到的 Citrix Xen 服务器,你需要将“LogonType”过滤器更改为“10”Win32_LogonSession class跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2020-01-28
    • 2011-10-22
    相关资源
    最近更新 更多