1

我正在编写一个脚本,在每次迭代循环(选定服务的数组)后,它将为每个服务收集 4 个值:服务器名称、服务名称、服务状态和服务启动名称

因此,对于每次迭代,我想将提到的 4 个值输出到外部文件(txt、svc 或 html),这样每个值都将排列在自己的列中。目前我使用 tab `t 来排列每列中的值,但它不能很好地工作,因为某些服务名称更长或更短,所以它搞砸了列对齐。您还建议采用什么其他方法,以便所有列都正确对齐

下面是我当前如何将输出格式化为 txt 文件的脚本片段

ForEach($service in services)
    $startname = $service.startname
    $state = $service.state
    $servicename = $service.name
    write-output "$server `t $servicename `t $state `t $startname is current" | out-file -append $ScriptDirectory
4

4 回答 4

2

如果您只是想以格式良好的方式将结果转储为文本(即,您不需要制作此 CSV、制表符分隔或“易于阅读”之外的任何其他内容),那么只需使用Format-Table -AutoSize.

AutoSize完全符合您的要求 - 它检查您输出的所有属性的长度,然后动态调整列宽,以便尽可能多地显示。

你不解释$server来自哪里,我会假设它是在其他地方定义的......

$services `
| Format-Table -AutoSize @{N='Server';E={$server}},StartName,State,Name `
| Out-String `
| Out-File results.txt
于 2013-08-15T13:55:02.220 回答
1

不要使用多个变量,而是使用 Powershell 对象来存储您的输出。像这样的东西:

ForEach($service in $services) {
  New-Object PSObject -Property @{
    StartName = $service.startname
    State = $service.state
    ServiceName = $service.name
  }
} | Out-File $ScriptDirectory 

您可能需要在链中添加一个 Select-Object 以确保列的最终输出顺序正确。

于 2013-08-15T08:46:25.100 回答
0

有点不清楚您在寻找什么,因为对象Get-Service返回的某些属性并不像所写的那样存在,而且代码似乎不完整。猜测你的意图:

$servers = @("server1","server2");
$services = get-service -computername $servers;

$svcCollection = @();
ForEach($service in $services) {
  $svccollection+=New-Object PSObject -Property @{
    Servername = $service.MachineName;
    StartName = $service.servicename;
    State = $service.Status;
    ServiceName = $service.DisplayName;
  }
}

# Various output formats
$svccollection|ConvertTo-Html|Out-File -path Services.html; # Create a full HTML file
$svcCollection|Export-Csv -NoTypeInformation -Path Services.csv; # Create a "traditional" CSV file
$svcCollection|Export-Csv -Delimiter "`t" -Path Services-tab.csv; # Create a tab-delimited CSV file
$svcCollection|ConvertTo-Xml|Out-File -path Services.xml; # Create an XML file
$svcCollection|ConvertTo-Json|Out-File -path Services.js; # Create a JSON object (v3 only)
于 2013-08-15T13:08:57.693 回答
0

如果您想保留变量,您可以尝试以下字符串格式以均匀地分隔字符串中的变量。在下面的示例中,每个值之间的间距为 20 个字符:

ForEach($service in services){
    $startname = $service.startname
    $state = $service.state
    $servicename = $service.name
    "{0,-20} | {1,-20} | {2,-20} | {3,-20}" -f $server,$servicename,$state,$startname `
                                                | Out-File -append $ScriptDirectory 
}
于 2013-08-15T10:10:03.787 回答