3

必要な出力がありますが、問題はそれを出力ファイルに取り込むことです。コマンドレットが何と呼ばれるかは関係ありません。CSVに追加できるようにするために必要です。

これが私の現在の解決策であり、適切な出力を提供します(ファイルに書き込まないだけです):

Param(
    [string]$clusterName
    )

Import-Module failoverclusters

get-cluster -name $clusterName | get-clusterresource | where-object {
    $_.ResourceType.name -eq "SQL Server"
        } |
        %{
            $virtualServerName = get-clusterparameter -InputObject $_ VirtualServerName; 
            $instanceName = get-clusterparameter -InputObject $_ InstanceName; 
            $nodeName = $_.OwnerNode;
            $IPAddress = [System.Net.Dns]::GetHostAddresses($virtualServerName.Value) | where-object {$_.IsIPv6LinkLocal -eq $False}
            echo ("{0},{1}\{2},{3},{4},{5},{6}" -f $nodeName,$virtualServerName.Value, $instanceName.Value,$virtualServerName.Value,$instanceName.Value,$IPAddress,$clusterName);
        }

これをthenendに追加しましたが、エラーが返されます。

| out-file -filepath "D:\Path\To\File\ClusterInstances.txt" -Encoding ASCII -append

戻り値:空のパイプ要素は許可されていません。

これをCSVファイルに出力して追加するにはどうすればよいですか?複数回実行されます。

4

1 に答える 1

2

| out-file最後の「}」と同じ行に行を追加していますか、それとも別の行に追加していますか? 「|」がある場合 新しい行の最初の非空白文字として、前の改行をエスケープする必要があります。そうしないと、「空のパイプ要素」エラーが発生します。

コード次のようになります (最後から 2 行目の「}」の後のバッククォートに注意してください)。

Param(
    [string]$clusterName
    )

Import-Module failoverclusters

get-cluster -name $clusterName | get-clusterresource | where-object {
    $_.ResourceType.name -eq "SQL Server"
        } |
        %{
            $virtualServerName = get-clusterparameter -InputObject $_ VirtualServerName; 
            $instanceName = get-clusterparameter -InputObject $_ InstanceName; 
            $nodeName = $_.OwnerNode;
            $IPAddress = [System.Net.Dns]::GetHostAddresses($virtualServerName.Value) | where-object {$_.IsIPv6LinkLocal -eq $False}
            echo ("{0},{1}\{2},{3},{4},{5},{6}" -f $nodeName,$virtualServerName.Value, $instanceName.Value,$virtualServerName.Value,$instanceName.Value,$IPAddress,$clusterName);
        } `
        | out-file -filepath "D:\Path\To\File\ClusterInstances.txt" -Encoding ASCII -append

または、これは、上記の方がよりエレガントだと思いますが:

Param(
    [string]$clusterName
    )

Import-Module failoverclusters

get-cluster -name $clusterName | get-clusterresource | where-object {
    $_.ResourceType.name -eq "SQL Server"
        } |
        %{
            $virtualServerName = get-clusterparameter -InputObject $_ VirtualServerName; 
            $instanceName = get-clusterparameter -InputObject $_ InstanceName; 
            $nodeName = $_.OwnerNode;
            $IPAddress = [System.Net.Dns]::GetHostAddresses($virtualServerName.Value) | where-object {$_.IsIPv6LinkLocal -eq $False}
            echo ("{0},{1}\{2},{3},{4},{5},{6}" -f $nodeName,$virtualServerName.Value, $instanceName.Value,$virtualServerName.Value,$instanceName.Value,$IPAddress,$clusterName);
        } | out-file -filepath "D:\Path\To\File\ClusterInstances.txt" -Encoding ASCII -append

実際、使用しているスタイルに合わせて、以下も機能するはずです。

Param(
    [string]$clusterName
    )

Import-Module failoverclusters

get-cluster -name $clusterName | get-clusterresource | where-object {
    $_.ResourceType.name -eq "SQL Server"
        } |
        %{
            $virtualServerName = get-clusterparameter -InputObject $_ VirtualServerName; 
            $instanceName = get-clusterparameter -InputObject $_ InstanceName; 
            $nodeName = $_.OwnerNode;
            $IPAddress = [System.Net.Dns]::GetHostAddresses($virtualServerName.Value) | where-object {$_.IsIPv6LinkLocal -eq $False}
            echo ("{0},{1}\{2},{3},{4},{5},{6}" -f $nodeName,$virtualServerName.Value, $instanceName.Value,$virtualServerName.Value,$instanceName.Value,$IPAddress,$clusterName);
        } |
        out-file -filepath "D:\Path\To\File\ClusterInstances.txt" -Encoding ASCII -append

肝心なのは「|」です。前の改行をエスケープしない限り、最初の文字にすることはできません。これは、新しいコマンドとして解釈され、最初のパイプ要素が欠落しているため、「空のパイプ要素」エラーが発生するためです。

于 2013-03-15T17:39:42.067 に答える