2016-05-17 4 views
-1

次のコードを参照してください閲覧、ファイルやグリッドののメタデータを抽出:PowerShellの - それは

# import .NET 4.5 compression utilities 
Add-Type -As System.IO.Compression.FileSystem; 

$zipArchives = Get-ChildItem "*.zip"; 
foreach($zipArchive in $zipArchives) 
{ 
    $archivePath = $zipArchive.FullName; 


$archive = [System.IO.Compression.ZipFile]::OpenRead($archivePath); 
try 
{ 

    foreach($archiveEntry in $archive.Entries) 
    { 
     if($archiveEntry.FullName -notmatch '/$') 
     { 
      $tempFile = [System.IO.Path]::GetTempFileName(); 
      try 
      { 
       [System.IO.Compression.ZipFileExtensions]::ExtractToFile($archiveEntry, $tempFile, $true); 
       $windowsStyleArchiveEntryName = $archiveEntry.FullName.Replace('/', '\'); 

       Select-String -pattern "<dc:title>.*</dc:title>" -path (Get-ChildItem $tempFile) | Select-Object @{Name="Path";Expression={Join-Path $archivePath (Split-Path $windowsStyleArchiveEntryName -Parent)}} 
       #Select-String -pattern "<dc:title>.*</dc:title>" -path (Get-ChildItem $tempFile) | Select-Object Matches 
       #Select-String -pattern "<dc:subject>.*</dc:subject>" -path (Get-ChildItem $tempFile) | Select-Object Matches 
       #Select-String -pattern "<dc:date>.*</dc:date>" -path (Get-ChildItem $tempFile) | Select-Object Matches 
      } 
      finally 
      { 
       Remove-Item $tempFile; 
      } 
     } 
    } 
} 
finally 
{ 
    $archive.Dispose(); 
} 
} 

また、私はインターネット上で発見し、zipファイル内の文字列を見つけるために私を助けたコードの修正版です。

私の意図は、このコードを使用してzipファイルからメタデータを抽出することです。

2つのタイプの情報を別々の行に表示する方法を理解できません。 1つのSelect-String...パイプライン行のみを使用してスクリプトを実行すると、コードは期待通りに機能します。 2番目のSelect-String...パイプライン行をアクティブ化(コメント解除)すると、2番目の種類の情報(<dc:title>の値)は表示されず、代わりに空白行が表示されます。

私を助けてください:

1)どのように私はまた、私はコードで使用Select-String | Select-Objectメカニズムを使用してdc:title値を表示することができます。

2)どのように表形式ですべてのデータIが出力できるので、表は次のようになります。

* ZIP Filename * DC Title * 
* zipfile01.zip * Bla Bla 01 * 
* zipfile02.zip * Bla Bla 02 * 
* zipfile03.zip * Bla Bla 03 * 

出力のこの形式は、私にとって最も使用可能になります。

答えて

0

私は、それはあなたが探していた答えではありません知っているが、一時的な回避策として、あなたはパイプライン-objctsため、この

Select-String -pattern "<dc:title>.*</dc:title>" -path (Get-ChildItem $tempFile) | Select-Object Matches, @{Name="Path";Expression={Join-Path $archivePath (Split-Path $windowsStyleArchiveEntryName -Parent)}} 
+0

おかげで、アンソニーしかし、この方法は私の問題を解決しません。あなたの答えは私の質問を更新する必要があることを理解してくれました。 ""の最初の "Select-String"は、実際には私のユニークなキーの一種として使用されています。なぜなら、すべてのファイルがメタデータ内にこのタグを持っているからです。私はファイル名と実際の ""を同じ出力行に含めたくない。 完成したコードにはさらに多くのdcタグ( ""、 ""など)が含まれており、各タグにはそれぞれ別の行が必要です。 – kurkum

1

コンソール「ビュー」のように一つに2つのコマンドを組み合わせることができるかもしれません最初のオブジェクト(Pathのプロパティのみを持つ)に基づいて作成されます。 2番目のオブジェクトにはPathというプロパティがありません。これは空白行が表示されるためです。最初のSelect-String ..行(それはPathと表示されています)をコメントアウトした場合、2行目が機能します。

パイプライン経由で送信されるオブジェクトは同じプロパティセットを持つ必要がありますので、異なるプロパティセットでselect-objectを使用することは避けてください。例:

..... 

$tempFile = [System.IO.Path]::GetTempFileName(); 
try 
{ 
    [System.IO.Compression.ZipFileExtensions]::ExtractToFile($archiveEntry, $tempFile, $true); 
    [System.IO.Compression.ZipFileExtensions]:: 
    $windowsStyleArchiveEntryName = $archiveEntry.FullName.Replace('/', '\'); 

    Select-String -pattern "<dc:title>(.*)</dc:title>" -path (Get-ChildItem $tempFile) | Select-Object @{n="Zip FileName";e={$zipArchive.Name}}, @{Name="DC Title";Expression={ $_.Matches.Groups[1].Value}} 
} 
finally 
{ 
    Remove-Item $tempFile; 
} 

..... 

すべてのメタデータを出力するには、すべての値を含むオブジェクトを作成する必要があります。例:

$tempFile = [System.IO.Path]::GetTempFileName(); 
try 
{ 
    [System.IO.Compression.ZipFileExtensions]::ExtractToFile($archiveEntry, $tempFile, $true); 
    [System.IO.Compression.ZipFileExtensions]:: 
    $windowsStyleArchiveEntryName = $archiveEntry.FullName.Replace('/', '\'); 

    #Avoid multiple reads 
    $content = Get-Content $tempFile 

    New-Object -TypeName psobject -Property @{ 
     "Zip Filename" = $zipArchive.Name 
     "DC Title" = if($content -match '<dc:title>(.*)</dc:title>') { $Matches[1] } else { $null } 
     "DC Subject" = if($content -match '<dc:subject>(.*)</dc:subject>') { $Matches[1] } else { $null } 
     "DC Date" = if($content -match '<dc:date>(.*)</dc:date>') { $Matches[1] } else { $null } 
    } 


} 
finally 
{ 
    Remove-Item $tempFile; 
} 

.... 

例出力

Zip Filename DC Subject DC Title  DC Date 
------------ ---------- --------  ------- 
test.zip  Subject O M G   5/18/2016 

あなたが本当に別のビューを(醜い取得します)を強制したい場合、あなたは彼がするたびに新しいビューを作成するために、| Out-Defaultにオブジェクトを送信する必要があり、例:

Select-String -pattern "<dc:title>.*</dc:title>" -path (Get-ChildItem $tempFile) | Select-Object @{Name="Path";Expression={Join-Path $archivePath (Split-Path $windowsStyleArchiveEntryName -Parent)}} | Out-Default 
+0

ありがとう、Frode F.それは良く見えますが、まだ問題があります '$ Matches [1]'を使用すると、テーブルに表示される一致キャプチャ値が得られません。私はmatchルーチンがパターンを見つけられなかったかもしれないと思ったが、 '$ Matches [1]'を '$ Matches [0]'に変更したので、実際にマッチするはずのテキストを持っている各ファイルについてこれで私を助けてくれますか?どうもありがとう。 – kurkum

+0

私はこの問題を理解していません。試したこと、出力と希望する出力( '$ matches [0]'などの例も含めて)で質問を更新してください。入力がどのように見えるのかわからずにデバッグするのは難しいです。あなたはペーストビンや何かのtempfileを共有することができました(センシビデータなしのテストジップから抜粋) '$ Matches [1]'は '' some value''を出力しますが、 ''($ content-match '(。*)'){$ Matches [0]} 'は' some value ' '$ matches [0]'のみが '/'を返した場合は、何か問題があります。 –

関連する問題