2017-06-02 5 views
1

文書の変更後のファイルのリストを、設定した日付の後にエクスポートしようとしました(再帰スキャンの所有者も含めてGet-ChildItem)。Powershell Get-ChildItem、所有者の日付でフィルタリングされ、txtまたはcsvにエクスポート

$Location2 = "\\fs01\DATAIT" 
$loc2 ="melb" 

cd $Location2 

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { Write-Host $_.Name "," $_.lastwritetime "," ((get-ACL).owner) } > c:\output\filelisting-$loc2.txt 

ここでPowerShellの達人のいずれかが、いくつかの光を当てるでしてください:私は、ファイル/ csvファイルへの出力ポートにそれを得ることができないいくつかの理由

答えて

1

コードに問題があります。Write-Hostを使用しており、明示的に出力をコンソールに送信しています(別の場所にリダイレクトできません)。次のように簡単な修正は次のとおりです。

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | foreach { "$($_.Name),$($_.lastwritetime),$((get-ACL).owner)" } > filelisting-$loc2.txt 

これは、標準出力(Write-Outputを使用するのと同じ)に文字列を出力します。私は二重引用符で囲まれた文字列内の部分式演算子$()を使用してアクセスしたい変数を含む単一の文字列にしました。この演算子は、オブジェクトのプロパティにアクセスしたり、そのような文字列内で他のコマンドレット/複合コード(基本的には単純な$変数以外のもの)を実行するために必要です。

オブジェクト結果を作成することでコードをさらに改善できます。これにより、Export-CSVのようにパイプライン内の他のコマンドレットを活用できます。私はこれをお勧め:

Get-ChildItem -Recurse | Where-Object { $_.lastwritetime -gt [datetime]"2017/05/01" } | ForEach-Object { 
    $Properties = [Ordered]@{ 
     Name = $_.Name 
     LastWriteTime = $_.LastWriteTime 
     Owner = (Get-ACL).Owner 
    } 

    New-Object -TypeName PSObject -Property $Properties 
} | Export-CSV $Loc2.csv 

これは、あなたが望んでいたプロパティのハッシュテーブル@{}を作成し、New-ObjectでPowerShellのオブジェクトを作成するために、そのハッシュテーブルを使用しています。このオブジェクトは標準出力に戻され、パイプラインに入り、ForEach-ObjectループによってすべてのオブジェクトがExport-CSVに送信され、CSVとして正しく出力されます(オブジェクト入力が必要です)。余談として


  • 、ここになぜWrite-Host is considered harmful上のPowerShellの生みの親から興味深い読み出しがあります。

  • [Ordered]にはPowerShell 3以上が必要です。 PowerShell 2を使用している場合は、削除してください。それは、定義された順序でオブジェクト内のプロパティの順序を保持するだけです。

+1

完璧!あなたの答えのために多くのおかげで、治療を働いた! 私はexport-CSVを他のスクリプト用に使い始めました。乾杯。 –

関連する問題