3

共有とそのプロパティの 1 行の説明を含むテキスト ファイルを読み取る Powershell スクリプトがあります。

次に、共有ごとに、オブジェクトをプロパティとともに配列に追加します。

多くは共通のプロパティを持ちますが、少数の共有にしか表示されないものもあります。

完成した配列を にパイプするExport-CSVと、結果の CSV には、配列内の最初のオブジェクトのプロパティに一致する列のみが含まれます。

どんなアイデアや助けもありがたく受け取った。

コードは次のとおりです。

$shares_only = gc \\server\share\SHARES.txt | where {$_ -match '^*TYPE = DISK'}

$share_index = @()

$shares_only |foreach {

    $sharename = ($_.Split(" ")[1])
    $_ -match '\([\w\s.,"=<>()\/\*\+\-]*\);'|out-null

    $shareparams = $matches[0]

    $paramlist = ($shareparams.Substring(1,($shareparams.Length -3))).Split(",")

    $obj = $null
    $obj = New-Object System.Object

    $obj | Add-Member -type NoteProperty -Name NAME -Value $sharename

    $paramlist | foreach {
        $obj `
        | Add-Member -type NoteProperty -Name ($_.Split("=")[0]) -Value ($_.Split("=")[1])
    }
    $share_index += $obj
}

$share_index | Select * | Export-CSV -notype \\server\share\Shares.csv

例として、配列内の最初の 2 つのオブジェクトを次に示します ($share_index[0..2]コンソールへの出力に使用):

NAME          : _ACCTEST_
TYPE          :  DISK 
PREFIX        :  (<USERCODE>) 
AREABYTES     :  184320 
ACCESS        :  ALL 
FAMILY        :  ACCTESTPACK 
DOWNSIZEAREA  :  TRUE 

NAME              : _HOME_
TYPE              :  DISK 
PREFIX            :  (<USERCODE>) 
COMMENT           :  Private user files 
AREABYTES         :  184320 
ACCESS            :  ALL -EXTRACT 
FAMILY            :  <FAMILY> 
DOWNSIZEAREA      :  TRUE 
ALLOWGUESTACCESS  :  TRUE 

CSV の最初の 3 行は次のとおりです。

"NAME","TYPE ","PREFIX ","AREABYTES ","ACCESS ","FAMILY ","DOWNSIZEAREA "
"_ACCTEST_"," DISK "," (<USERCODE>) "," 184320 "," ALL "," ACCTESTPACK "," TRUE "
"_HOME_"," DISK "," (<USERCODE>) "," 184320 "," ALL -EXTRACT "," <FAMILY> "," TRUE "

プロパティが共有の配列にあるにもかかわらずCOMMENT、プロパティが欠落していることがわかります。ALLOWGUESTACCESS_HOME_

編集: @JPBlancs の回答のわずかに変更されたバージョンを受け入れたため、コードの最後の 2 行は次のようになりました。

$fixed_index = $share_index | Sort-Object -Property @{expression={(($_.psobject.Properties)|Measure-Object).count}} -Descending | ConvertTo-CSV -notype
$fixed_index | ConvertFrom-CSV | Sort -Property Name | Export-CSV -notype \\server\share\Shares.csv 

したがって、提案どおりに実行してから、新しいオブジェクトで CSV に変換します。次に、そのオブジェクトを CSV から元に変換し、新しいプロパティを保持し、名前でもう一度並べ替えて、必要なアルファベット順のリストを取得してから、もう一度 CSV にエクスポートします。

たとえば、次のようになります。

"NAME","TYPE","PREFIX","PUBLIC","COMMENT","AREABYTES","ACCESS","FAMILY","DOWNSIZEAREA","ALLOWGUESTACCESS"
"_ACCTEST_"," DISK "," (<USERCODE>) ","",""," 184320 "," ALL "," ACCTESTPACK "," TRUE ",
"_HOME_"," DISK "," (<USERCODE>) ",""," Private user files "," 184320 "," ALL -EXTRACT "," <FAMILY> "," TRUE "," TRUE "
4

4 に答える 4

4

Export-CsvConvertTo-Csv送信されたオブジェクト間のプロパティの結合のみを取得するように見えます。テキスト ファイルを解析し、すべてのプロパティのリストをコンパイルし、オブジェクトを作成するときに、不足しているプロパティ値を null に設定する必要があると思います。

于 2013-07-31T00:42:09.657 に答える
0

次のコードを使用します。

$a = "" | select "P1","P2"
$b = "" | select "P1","P2","P3"
$c = "" | select "P1","P2","P3","P4"
$props=@{n='P1';e={$_.p1}},@{n='P2';e={$_.p2}},@{n='P3';e={$_.p3}},@{n='P4';e={$_.p4}}
$array = $a,$b,$c
$array | select $props|Export-Csv c:\temp\t.csv
于 2014-02-25T09:19:18.930 に答える