1

ループ (選択したサービスの配列) を反復するたびに、サーバー名、サービス名、サービス状態、サービス開始名の 4 つの値を各サービスに収集するスクリプトを作成しています。

したがって、反復ごとに、上記の 4 つの値を外部ファイル (txt、svc、または html) に出力して、各値が独自の列に配置されるようにします。現在、タブ `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

変数を保持したい場合は、次の文字列フォーマットを試して、文字列内の変数を均等に配置することができます。以下の例では、各値の間の間隔は 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 に答える