【问题标题】:Powershell formattingPowershell 格式化
【发布时间】:2014-09-26 11:46:43
【问题描述】:

我对 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”的异常:“使用“1”个参数调用“ToDateTime”的异常:“指定的参数超出了有效值的范围。 参数名称:dmtfDate"" 在行:13 字符:33 + $.ConvertToDatetime .LastUseTime) + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ScriptMethodRuntimeException

再次感谢您的帮助

【问题讨论】:

  • 如果您向我们展示所需的输出会容易得多。否则社区可能会弄错您正在寻找的内容并浪费每个人的时间。
  • 当然 - 我需要的是“用户”文件夹中的所有文件夹列表,用于多个服务器的用户、上次使用文件夹和服务器名称。基本上我需要找到哪些配置文件文件夹已经过时了一段时间,然后将其放入 excel 或 HTML 中。该脚本完全符合我的需要,但没有格式。我将在上面展示我想要得到的示例
  • 我想知道如果LastUsedTime没有值是否会发生错误...如果用户从未登录过,可能是null。
  • 现在它已经组织好了,我确实看到了一些空白行和带有用户但没有日期的行 - 所以你刚才说的有道理

标签: powershell


【解决方案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. 您的Get-WmiObject 循环与创建customPSObject 的做法基本相同,我只是创建了一个简单的数组。这也是为了阻止 PowerShell 对其进行特殊处理。在实践中,创建 CustomPSObject 将其转换为数组只是为了导出它似乎毫无意义!
  3. 其中的 csv 部分来自 -join 我将数组与逗号连接起来以创建 csv 输出。在每次循环运行期间,向下放置一个标题,其中一行包含计算机名称,下一行包含标题。 WMI 数据如下。在循环之间插入一个空白行以进行示例中的隔离。
  4. 您的样本忽略了您正在收集的一些数据。我输出所有数据,但您可以更改 $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

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

【讨论】:

  • WOW - 这正是我所需要的 - 我应该能够找出任何其他更改 - 我在运行它时确实注意到了,即使我得到了这个错误的结果(这已经是问题 - 你所做的任何事情都没有出现)这个错误是你的意思是它忽略了一些数据吗?使用“1”参数调用“ConvertToDateTime”的异常:
  • 如果它的一些简单的东西可能能够解决它。将其包含在问题中。如果它涉及到什么,它可能更好地作为另一个问题。
  • 不客气。在 SO,您可以通过将好的答案标记为已接受和/或赞成的答案来表达您的感激之情。再次欢迎您
  • 会做 - 我也将错误添加到问题中
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多