PowerShell:Measure-Command 向控制台输出良好的响应时间列表;当输出到文本文件时,它是一个很长的文本字符串

PowerShell: Measure-Command outputs nice Response Time list to console; when outputted to text file its one very long string of text

我发现 PowerShell Measure-Command 向控制台输出了一个很好的响应时间列表,但是当输出到文本文件时,它变成了一串很长的文本。这是一个问题,因为当使用 HTML reader 查看时,它变得难以阅读。今晚我已经为这个问题苦苦挣扎了一段时间,所以现在 post 把它改成 SO。

import-module activedirectory
cls
$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$domaincontrollers = $myforest.Sites | % { $_.Servers } | Select Name
$report = foreach ($DomainController in $DomainControllers) 
{
  $totalmeasurement = 0
  $i = 0
  while ($i -ne $numberoftests)
  {
  $measurement = (Measure-Command {Get-ADUser Administrator -Server $DomainController.name}).TotalSeconds
  $totalmeasurement += $measurement
  $i += 1
  }
  $totalmeasurement = $totalmeasurement / $numberoftests
  "Domain Controller: " + $DomainController.name + ", Response time: " + $totalmeasurement + " seconds"
}

当 运行 在原版环境中时,上面的代码将产生如下第一个屏幕截图所示的输出:


通过将foreach设置为一个变量,对代码稍作修改(如下所示):

import-module activedirectory
cls
$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$domaincontrollers = $myforest.Sites | % { $_.Servers } | Select Name
$report = foreach ($DomainController in $DomainControllers) 
{
  $totalmeasurement = 0
  $i = 0
  while ($i -ne $numberoftests)
  {
  $measurement = (Measure-Command {Get-ADUser Administrator -Server $DomainController.name}).TotalSeconds
  $totalmeasurement += $measurement
  $i += 1
  }
  $totalmeasurement = $totalmeasurement / $numberoftests
  "Domain Controller: " + $DomainController.name + ", Response time: " + $totalmeasurement + " seconds"
}
$report | Out-String | Out-File $htmlfile_temp -Append  

文件输出最终看起来一团糟,如第二个屏幕截图所示:

我尝试了原始代码的许多不同排列,以输出到第一个屏幕截图中格式很好的文件,但无济于事。我已经放弃并 post 向这个论坛提出问题。我很清楚 write-host 的局限性,这也是我输出到 HTML 文件的众多原因之一。

(从这个 post 找到的原始代码 here

您似乎正在尝试打开 HTML 文件中的输出。然后,您需要在每行末尾添加一个 <br> 才能在单独的行中查看该信息。

我对你的脚本做了一些修改。输出在 HTML 中,我使用 CSS 文件来格式化 table.

import-module activedirectory
cls

$htmlfile_temp = "C:\Temp\DCAudit.html" # ***PLEASE CHANGE THIS***

$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$domaincontrollers = $myforest.Sites | % { $_.Servers } | Select Name


$Report = @()
$totalmeasurement = @()
foreach ($DomainController in $DomainControllers) 
{
    # Get information about domain controllers
    $DC = Get-ADDomainController $DomainController.name
    
    
    $totalmeasurement = 0
    $numberoftests = 4
    $i = 0
    while ($i -ne $numberoftests)
    {
      $measurement = (Measure-Command {Get-ADUser Administrator -Server $DomainController.name}).TotalSeconds
      $totalmeasurement += $measurement
      $i += 1
    }
    $totalmeasurement = $totalmeasurement / $numberoftests
  
    # Create a Hash Table
    $Hash = @{
        DomainController = $DomainController.NAME
        ResponseTimeInSeconds =  $totalmeasurement
        DateTime = (get-date)
        Forest = $Dc.forest
        IPAddress = $DC.IPv4Address
        OS = $DC.OperatingSystem
        Site = $Dc.Site

    }
  [array]$Report += New-Object psobject -Property $Hash
}

# Define CSS
$CSS = "
<style>
h1 { font-family: Calibri, Candara, Segoe, Optima, Arial, sans-serif; 
    font-size: 24px; font-style: normal; font-variant: normal; font-weight: 700; 
    line-height: 26.4px; } 
h2 { font-family: Calibri, Candara, Segoe, Optima, Arial, sans-serif; 
    font-size: 18px; font-style: normal; font-variant: normal; font-weight: 700; 
    line-height: 15.4px; }
h3 { font-family: Calibri, Candara, Segoe, Optima, Arial, sans-serif; 
    font-size: 14px; font-style: normal; font-variant: normal; font-weight: 700; 
    line-height: 15.4px; } 
body{ font-family: Calibri, Candara, Segoe, Optima, Arial, sans-serif; 
    font-size: 14px; 
    font-style: normal; 
    font-variant: normal; 
    font-weight: 400; 
    line-height: 15px; }
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"

$Report | ConvertTo-Html -Head $CSS | Out-File $htmlfile_temp

当您将报告构建为 objects 数组而不是 strings 数组时,您将更好地控制输出内容应该是这样的。
下面演示了两种类型的文件输出,一种是可以在 Excel 中打开的结构化 CSV 文件,另一种显示了如何创建一个漂亮的 HTML 数据文件:

Import-Module ActiveDirectory

$myForest          = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$domaincontrollers = ($myforest.Sites | ForEach-Object { $_.Servers }).Name
$numberoftests     = 4  # just guessing..

$report = foreach ($dc in $DomainControllers) {
    $totalmeasurement = 0
    for ($i = 0; $i -lt $numberoftests) {
        $totalmeasurement += (Measure-Command {Get-ADUser -Filter "SamAccountName -eq 'Administrator'" -Server $dc}).TotalSeconds
    }
    # now output an object with the properties you need
    [PsCustomObject]@{
        'Domain Controller'       = $dc
        'Response Time (Seconds)' = ($totalmeasurement / $numberoftests)
    }
}

# output on screen
$report | Format-Table -AutoSize

# output to CSV file
$report | Export-Csv -Path 'X:\ResponseTimes.csv' -UseCulture -NoTypeInformation

# output to HTML file
$htmlTemplate = @'
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ResponseTimes</title>"
    <style>
        body, table {font-family: sans-serif; font-size: 10pt; color: #000000;}
        table {border: 1px solid black; border-collapse: collapse;}
        th {border: 1px solid black; background: #dddddd; padding: 3px;}
        td {border: 1px solid black; padding: 3px;}
    </style>
</head>
<body>
@@TABLE@@
</body></html>
'@

$table = ($report | ConvertTo-Html -Fragment) -join [environment]::NewLine
$report  = $htmlTemplate -replace '@@TABLE@@', $table 
$report | Set-Content -Path 'X:\ResponseTimes.html'