0

私はこれで少し一日を過ごしています。PowerShellを使用して、スクリプトの後半で処理されるXMLのログファイルであるCSVファイルをインポートしようとしています。

$_.FullName目標は、スクリプトの先頭にifステートメントを設定して、スクリプトが複数回実行された場合にその方法ですでに処理された各ファイルを除外することです。スクリプトはこの列を読み取り、ファイルを2回処理しません。

注:構文がお粗末で申し訳ありませんが、PowerShellは初めてです。

以下は私が持っている現在のコードと試みです

$sourceDir = "C:\test" #Production Folder "D:\Vodassets\_PreImport_Success"
$tempDir = "C:\test-temp"
$targetDir = "C:\test-copyback"
$Date = Get-Date -format MM-dd-yyyy
$Time =     "{0:h:mm:ss tt zzz}" -f (get-date)
$LogFile = "Disney-Log.csv"


### Copy Disney Metadata.xml's to a temporary folder for the editting process
if (Test-Path $LogFile){
    $ImportLog = Import-CSV $LogFile
    $GetXML = @(Get-ChildItem $sourceDir -recurse -filter "Metadata.xml" -exclude {$LogFile.Fullname} | Where-Object {$_.FullName -like "*disney*"})
} else {
    $GetXML = @(Get-ChildItem $sourceDir -recurse -filter "Metadata.xml" | Where-Object {$_.FullName -like "*disney*"})
}
$OutXML = ForEach-Object { $GetXML } | Select LastWriteTime,Fullname,DirectoryName
if ($GetXML.count -eq 0){
    write-host "No files to copy. Ending Process....." -foregroundcolor yellow -backgroundcolor black 
} else {
    ForEach ($File in $GetXML)
    {   $Path = $File.DirectoryName.Replace($sourceDir,$tempDir)
        if (-not (Test-Path $Path)) {
            Write-Host "Destination $Path doesn't exist, creating it." -foregroundcolor yellow -backgroundcolor black
            New-Item -Path $Path -ItemType Directory
            Copy-Item -Path $File.FullName -Destination $Path -ErrorAction silentlyContinue }
            elseif (-not $?) { write-warning "Failed to copy $($File.Fullname)" }
            else { write-host "Succesfully copied $($File.Fullname) to $($tempDir)" -foregroundcolor green -backgroundcolor black }
        }



### Edit XML Process
    ForEach ($File in $GetXML)
    {   $Path = $File.DirectoryName.Replace($sourceDir,$tempDir)
        if (Test-Path $Path) {
            $xmlData = [xml](Get-Content $File.FullName)
            foreach ($group in $xmlData){
                $xmlData.assetpackages.assetpackage.'Type' = 'SVOD'
                $xmlData.assetpackages.assetpackage.'Product' = 'SVOD'
                $xmlData.assetpackages.assetpackage.'Name' = 'Disney Family Movies'
            }
        }
        $xmlData.Save($File.Fullname)   
    }


    $OutXML | Export-Csv $LogFile -NoTypeInformation -Force -Append


### Copy Files to VOD Import Server
    $import = (Get-ChildItem $tempDir -recurse -filter "Metadata.xml" | Where-Object {$_.FullName -like "*disney*"})
    if ($import.count -eq 0) {
        write-host "No files to import. Ending Process....." -foregroundcolor yellow -backgroundcolor black
    } else {
        ForEach ($File in $import)
        {   $Path = $File.DirectoryName.Replace($tempDir,$targetDir)
            if (-not (Test-Path $Path)) {
                Write-Host "Destination $Path doesn't exist, creating it." -foregroundcolor yellow -backgroundcolor black
                New-Item -Path $Path -ItemType Directory
                Copy-Item -Path $File.FullName -Destination $Path -ErrorAction silentlyContinue }
                elseif (-not $?) { write-warning "Failed to copy $($File.Fullname)" }
                else { write-host "Succesfully copied $($File.Fullname) to $($targetDir)" -foregroundcolor green -backgroundcolor black }
            }
    }


### Cleanup temporary directory
    if (-not (Test-Path $tempDir | Where-Object {$_.FullName -like "*disney*"})){
        Get-ChildItem $tempDir -recurse | % { Remove-Item $_.FullName -recurse } #Remove the -whatif to actual clean out the directory
    }
}
4

1 に答える 1

0

あなたのファイルには注意が必要なことが複数あります。

  • $OutXML = ForEach-Object { $GetXML } | Select LastWriteTime,Fullname,DirectoryName #Foreach loop is unnecessary. $OutXML = $GetXML | Select ... works

  • New-Item -Path $Path -ItemType Directory #ItemType should be File

  • XML編集が間違っているようです。あなたはすべてを求めますgroupが、ファイル全体を編集しようとするたびにxmlData

もっとあるかもしれませんが、それらは私の目を早く捉えたものにすぎませんでした。

あなたの質問に答えるには、以下のコードを見てください。それはそれを解決する方法のアイデアを与えるはずです。ログに保存するのがファイルパスだけの場合は、より高速で簡単なため、代わりに純粋なテキストファイルを使用する必要があります。以下に、テキストファイルとcsvのソリューションを含めました。csv-headers / sampleを提供しなかったため、ソリューションは単一列のcsv用に作成されています(どのようにcsvに保存するかわかりません)。

#Load from csv
$log = Import-Csv .\test.csv
$loggedpaths = $log | Select-Object -ExpandProperty FullName

#Get only untouched files
$GetXML = @(Get-ChildItem $sourceDir -recurse -filter "Metadata.xml" | Where-Object {$_.FullName -like "*disney*" -and $loggedpaths -notcontains $_.FullName})

#Add processed file after editing(after $xmldata.save($file.fullname)
$log += $file | Select-Object LastWriteTime, Fullname, DirectoryName

#Save log to csv
$log | Export-Csv .\test.csv -NoTypeInformation
于 2013-02-23T09:52:13.817 に答える