Powershell格式化

时间:2014-09-26 01:19:44

标签: powershell

我是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

再次感谢您的帮助

1 个答案:

答案 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时更容易。所以这里有一些细分

  1. 我将您的计算机放入名为$computers
  2. 的字符串数组中
  3. 你的Get-WmiObject循环基本上是相同的接受,而不是使customPSObject我只是制作一个简单的数组。这又是为了阻止PowerShell对它进行特殊处理。在实践中,创建CustomPSObject将其转换为数组只是为了导出它似乎毫无意义!
  4. csv 部分来自-join我接受数组并用逗号连接它们以创建csv输出。在每次循环运行期间,向下放置一个标题,其中包含一行上的计算机名称和下一行中的标题。 WMI数据如下。在循环之间插入一个空白行,以便隔离样本。
  5. 您的示例忽略了您正在收集的一些数据。我输出所有数据,但您可以更改$header和数组内容以满足您的需要。
  6. 某些示例输出如下所示:

    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
    

    请注意,在此期间我不会清除文件。如果它已经包含内容,则将全部附加。