我是PowerShell的新手,并且已经尝试了各种方法来分割我发现的以下powershell脚本的结果,但没有运气。目前,脚本列出了4列中的所有内容,每个服务器的结果之间没有间隙。 (当它完成一个服务器的结果时,我希望在每个结果之间有一个间隙甚至带有服务器名称的标头,以便在针对多个服务器运行时更容易阅读) 任何有关格式化的帮助都将不胜感激。
Get-WmiObject -ComputerName ("server1","server2") Win32_UserProfile | % {
$userinfo = [WMI] ($_.__Path -Replace "Win32_UserProfile", "Win32_SID")
New-Object PsObject -Property @{
ComputerName= $_.__Server
Domain = $userinfo.ReferencedDomainName
User = $userinfo.AccountName
LastUsed = $_.ConvertToDatetime($_.LastUseTime)
}
} | export-csv -NoType c:\Results.csv
这就是我要做的事情
server 1
user lastModified
bob 8/20/14
billy 7/20/14
Carla 6/12/14
server 2
user lastModified
bob 8/20/14
billy 7/20/14
Carla 6/12/14
server 3
user lastModified
bob 8/20/14
billy 7/20/14
Carla 6/12/14
这就是我目前所得到的
lastUsed user computername
8/20/14 bob server 1
6/20/14 billy server 1
9/1/14 sam server 3
3/2/14 sonny server 4
所以,当你输入50个60个配置文件时,它们几乎无法读取,特别是如果你尝试按日期排序,因为那时服务器就到处都是。
每次运行脚本时我都会收到此错误,但我仍然会得到结果并且脚本会生成它应该生成的内容。
使用“1”参数调用“ConvertToDateTime”的异常:“异常调用”ToDateTime“with”1“参数:”指定的参数超出了有效值的范围。 参数名称:dmtfDate“” 在行:13 char:33 + $ .ConvertToDatetime<<<< ($ .LastUseTime) + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:ScriptMethodRuntimeException
再次感谢您的帮助
答案 0 :(得分:1)
$toFile = "C:\temp\TEST.CSV"
$header = "Computer","Domain","User","LastUsed"
$computers = "kanimage02","kanantivirus01"
ForEach($singleComputer in $computers){
Add-Content -Path $toFile -Value "$singleComputer`n$($header -join ',')"
Get-WmiObject -ComputerName ($singleComputer) Win32_UserProfile | ForEach-Object{
$userinfo = [WMI] ($_.__Path -Replace "Win32_UserProfile", "Win32_SID")
Add-Content -Path $toFile -Value (@(
$_.__Server
$userinfo.ReferencedDomainName
$userinfo.AccountName
$_.ConvertToDatetime($_.LastUseTime)
) -Join ",")
}
Add-Content -Path $toFile -Value ""
}
我遇到了一个真正的问题,试图让Export-Csv
尝试重复标题。通过将Export-Csv
移动到ForEach-Object
的管道输出中,可以实现多种调用。但是Export-Csv
没有-StopBeingHelpful
切换意味着无论我做了什么,它都会注意到标题已经存在并感觉不需要重复它。由于您要求的不是 true csv文件输出,因此使用Add-Content
时更容易。所以这里有一些细分
$computers
Get-WmiObject
循环基本上是相同的接受,而不是使customPSObject
我只是制作一个简单的数组。这又是为了阻止PowerShell对它进行特殊处理。在实践中,创建CustomPSObject
将其转换为数组只是为了导出它似乎毫无意义!-join
我接受数组并用逗号连接它们以创建csv输出。在每次循环运行期间,向下放置一个标题,其中包含一行上的计算机名称和下一行中的标题。 WMI数据如下。在循环之间插入一个空白行,以便隔离样本。$header
和数组内容以满足您的需要。 某些示例输出如下所示:
kanimage02
Computer,Domain,User,LastUsed
KANIMAGE02,NT AUTHORITY,NETWORK SERVICE,9/11/2014 10:25:19 AM
KANIMAGE02,NT AUTHORITY,LOCAL SERVICE,9/11/2014 10:25:24 AM
KANIMAGE02,NT AUTHORITY,SYSTEM,2/22/2011 12:07:14 PM
kanantivirus01
Computer,Domain,User,LastUsed
KANANTIVIRUS01,NT AUTHORITY,NETWORK SERVICE,9/10/2014 3:19:03 AM
KANANTIVIRUS01,NT AUTHORITY,LOCAL SERVICE,9/10/2014 3:19:08 AM
KANANTIVIRUS01,NT AUTHORITY,SYSTEM,2/22/2011 12:07:14 PM
请注意,在此期间我不会清除文件。如果它已经包含内容,则将全部附加。