2017-03-29 3 views
0

データダンプからファイルをエクスポートしようとしていますが、何か助けが必要です。私がエクスポートしようとしているファイルはすべてpdf、doc、xlsx、jpg、png形式です。データダンプの組み立て方法により、ファイル名はf0.pdf、f0.docなどに変更されました。また、ファイルは異なるサブフォルダ(例:Data \ 000 \ 004 \ 0000001212)にあります。さらに、サブフォルダ内にファイルがある場合は、m.xmlファイルが添付されています(参考のため、hereを参照してください)。PowerShellでファイルを書き出す問題

ex: <TextVar length="255" field="LDDOCUMENTNAME">ABC.pdf</TextVar> 

私は名前を変更し、通過しなかったが、PDFファイルの一部をPowerShellを使用してファイルをエクスポートしようとした(I:それは「LDDOCUMENTNAME」フィールドで反射された元のファイル名が含まれているようm.xmlファイルが重要ですサブフォルダ内のすべてのpdfファイルを検索し、エクスポートされたpdfファイルの数と比較しました)。

は、これは私のスクリプトは次のようになります。

$fsoFiles = Get-ChildItem -Path C:\Files -Filter *m.xml* -Recurse 
ForEach($fsoFile in $fsoFiles) 
{ 
    $docM = Select-String $fsoFile -Pattern "LDDOCUMENTNAME" 
    $txtNewFile = $docM.Line.Substring(0,($docM.Line.Length-10)) 
    $txtNewFile = $txtNewFile.Split(">")[-1] 
    $txtExtension = $txtNewFile.Split(".")[-1] 
    $txtOldFile = ([string]$fsoFile.Directory+"\"+"f0."+$txtExtension) 
    Copy-Item $txtOldFile C:\Extracted\$txtNewFile 
} 

基本的に私はすべてのサブフォルダを検索し、m.xmlファイルとフォルダのみをフィルタリングするためのPowerShellを尋ねました。 PowerShellは、 "LDDOCUMENTNAME"フィールドにある値を使用して、対応するファイルの名前を元のファイル名に戻します。

私は私のスクリプトを実行すると、私はこれらのエラーメッセージの束を提示しています:

You cannot call a method on a null-valued expression. 
    At line:6 char:5 
    +  $txtNewFile = $docM.Line.Substring(0,($docM.Line.Length-10)) 
    +  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
     + FullyQualifiedErrorId : InvokeMethodOnNull 

私は、これはPowerShellは、PDFファイルの一部をエクスポートできなかった理由であると仮定していますか?おそらく、対応するm.xmlファイルの "LDDOCUMENTNAME"フィールドが空白ですか?

は、私は、エクスポートすることができなかったファイルの場所を得ることができるかどうかを確認するために私のFORループの内側にIF文を追加してみましたが、私は同じエラーメッセージと会った:

If ($docM = $null) 

    { 
     Get-ChildItem -Path C:\Files -include !$docM -Recurse -Force -Name C:\Extracted\listofPaths.txt 

     } 

    else 

は誰をいここでこれを達成する方法を知っていますか?私は文字通り私の髪を引っ張っています。どんな助けでも大歓迎です。ありがとう!

+0

XMLをXML文書として解析するのはなぜですか?部分文字列の分割を分割する必要はありませんか? – vonPryz

+0

返信いただきありがとうございます!これは実際にPowerShellを使用して初めてのことです。どのように私がそれを達成することができるかについてあなたは正しい方向で私を指摘できますか?ありがとう! –

+0

正しい方向がグーグルである...とにかく、[SO](http://stackoverflow.com/a/11344234)はすでに良い答えがあります。実装に問題がある場合は、フラグメントの代わりに有効なXMLドキュメントを提供してください。 – vonPryz

答えて

0

XMLファイルは自明ではないため、テキストとして処理するべきではありません。 XMLとしてロードし、XPathを使用して関連するノードを選択します。同様に、

# XML is 1st class citizen in Powershell 
[xml]$doc = get-content c:\path\to\doc.xml 
# Select all the TextVar nodes that have attribute field='LDDOCUMENTNAME' 
$nl = $doc.selectnodes("//TextVar[@field='LDDOCUMENTNAME']") 
# Did we find one? 
if($nl.count -eq 1) { 
    # Do something with the element's text data 
    # Rename the data file would happen here, for now 
    # print the results for further review 
    Write-Host $nl[0].InnerText 
} 
# Todo: handle no elements found case 
# Todo: handle multiple elements found case 
関連する問題