我有以下脚本查找计算机列表的上次重启时间。当我运行此脚本时,它将第一个计算机名称放在一行上,但时间戳位于第二行。后续计算机都在同一条线上。
以下是示例:
Computer1
TimeStamp
Computer2 TimeStamp
Computer3 TimeStamp
等等......
我希望它是这样的:
Computer1 TimeStamp
Computer2 TimeStamp
Computer3 TimeStamp
我做错了什么?
以下是代码:
$listOfComputers = Import-Csv lastReboot.txt
ForEach($computer in $listOfComputers) {
$name = $computer.Name
Write-Host $name -NoNewLine
$wmi = Get-WmiObject -Class Win32_OperatingSystem -Computer $name
$wmi.ConvertToDateTime($wmi.LastBootUpTime)
}
答案 0 :(得分:3)
您的输出混合了写主机和默认输出,这通常会导致项目显示错误的顺序和其他格式问题:
尝试:
$listOfComputers = IMPORT-CSV lastReboot.txt
ForEach($computer in $listOfComputers){
$name = $computer.Name
Write-Host "$name " -NoNewLine
$wmi = Get-WmiObject -Class Win32_OperatingSystem -Computer $name
write-host $wmi.ConvertToDateTime($wmi.LastBootUpTime)
}
答案 1 :(得分:1)
当-computername
与get-wmiobject
一起使用时,您会在结果中获得一个额外字段 - PSComputerName
。您可以选择该字段,以便轻松获得与其他数据相关的名称。
将它与select-object
中的表达式相结合,你得到一个漂亮的表格。但是等等 - 还有更多!
Get-WMIObject
可以为-computername
参数设置数组名称,完全不需要你的循环。
$listOfComputers = IMPORT-CSV r:\lastReboot.txt
$wmi = Get-WmiObject -Class Win32_OperatingSystem -Computer $listOfComputers.Name;
$wmi |select pscomputername,@{Name="LastBootTime";Expression={$_.converttodatetime($_.lastbootuptime);}};
我们还可以删除$wmi
变量并在一个管道中完成所有操作(为了清晰起见,添加了换行符)。
$listOfComputers = IMPORT-CSV r:\lastReboot.txt
Get-WmiObject -Class Win32_OperatingSystem -Computer $listOfComputers.Name |`
select-object pscomputername,@{Name="LastBootTime";Expression={$_.converttodatetime($_.lastbootuptime);}};
甚至可以进行整个导入,查询和查询单次输出:
IMPORT-CSV r:\lastReboot.txt |`
select-object -ExpandProperty name |`
foreach-object{ Get-WmiObject -Class Win32_OperatingSystem -Computer $_} |`
select-object pscomputername,@{Name="LastBootTime";Expression={$_.converttodatetime($_.lastbootuptime);}};
如果您需要保留数据以供日后使用,可以在最后两个示例中的任何一个的开头指定$wmi =
的变量(确切地说,在第一个示例中为第二行)。
编辑:我记得AliasProperty PSComputerName
是在v3中添加的(或在v2中被破坏)。因此,如果您使用的是v2,则需要使用__SERVER
。