Tyl*_*son 7 powershell scripting parsing powershell-3.0 server
我目前在PowerShell中有以下查询:
query user /server:$server
Run Code Online (Sandbox Code Playgroud)
返回输出:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
svc_chthost 2 Disc 1:05 8/16/2016 12:01 PM
myusername rdp-tcp 3 Active . 8/29/2016 11:29 AM
Run Code Online (Sandbox Code Playgroud)
目前,我正在使用@(query user /server:$server).Count - 1一个值来表示已登录的用户数量(我知道这并不漂亮)。但是,现在我想获取诸如USERNAME,等信息ID,并LOGON TIME在脚本的其他部分中使用。
我的问题是围绕一种更轻松的方法来解析上述信息,或者可能是对我的问题的更好解决方案:统计和收集与登录用户有关的信息。
我找到了其他似乎更有效的解决方案,但是我确信必须有一种更简单的方法来完成此任务:
$ComputerName | Foreach-object {
$Computer = $_
try
{
$processinfo = @(Get-WmiObject -class win32_process -ComputerName $Computer -EA "Stop")
if ($processinfo)
{
$processinfo | Foreach-Object {$_.GetOwner().User} |
Where-Object {$_ -ne "NETWORK SERVICE" -and $_ -ne "LOCAL SERVICE" -and $_ -ne "SYSTEM"} |
Sort-Object -Unique |
ForEach-Object { New-Object psobject -Property @{Computer=$Computer;LoggedOn=$_} } |
Select-Object Computer,LoggedOn
}#If
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)
小智 6
老问题,但似乎是一个可行的解决方案:
(query user) -split "\n" -replace '\s\s+', ';' | convertfrom-csv -Delimiter ';'
Run Code Online (Sandbox Code Playgroud)
这将输出分成几行,就像上面的答案一样,然后用分号替换多个空白字符 (\s\s+),然后使用分号作为分隔符从 csv 转换该输出。
多个空格的原因是列标题中有空格(空闲时间、登录时间),因此只有一个空格它会尝试将其解释为多列。从命令的输出来看,它们似乎总是在项目之间保留至少 2 个空格,并且登录时间列在该字段中也有空格。
评论中的参考资料很棒,并且仍然愿意接受这个问题的更多答案,因为它应该有一个更简单的解决方案!
foreach ($s in $servers) #For Each Server
{
foreach($ServerLine in @(query user /server:$s) -split "\n") #Each Server Line
{
#USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
$Parsed_Server = $ServerLine -split '\s+'
$Parsed_Server[1] #USERNAME
$Parsed_Server[2] #SESSIONNAME
$Parsed_Server[3] #ID
$Parsed_Server[4] #STATE
$Parsed_Server[5] #IDLE TIME
$Parsed_Server[6] #LOGON TIME
}
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案暂时解决了问题,有点草率。
有关具有更多功能的更深入的解决方案,请查看原始问题的评论:)