2017-01-19 2 views
0

Jeden Morgen bekommt ein Ordner die gleichen Namen ZIP-Dateien übertragen. Ich habe derzeit ein Skript, das nach Dateien sucht, die nicht gezippt wurden, und wenn sie existieren, wird ein Archivordner erstellt, und sie werden dorthin verschoben. Dann werden die Zip-Dateien entpackt und dann wird die Zip-Datei gelöscht.Überprüfen Sie die gleichen Namen Dateien im Ordner mit anderen Erweiterungen, falls vorhanden, verschieben Sie eine

Eine neue Bedingung kam, dass 1 Datei keine tägliche Übertragung hat, aber es wird wöchentlich (zufälliger Tag der Woche), und die zugehörige nicht gezippte Datei muss in dem Ordner bleiben, bis diese Zip-Datei wird übertragen.

Wie würde ich meinen Code überarbeiten, um die gezippten Dateinamen gegen die nicht gezippten zu überprüfen, und wenn es eine Übereinstimmung gibt, nur diese Dateien zu verschieben, bevor der Rest entpackt wird?

Mein aktueller Code: Zuerst if Anweisung Tests für nicht vorhandene Zip-Dateien. Wenn vorhanden, wird ein neues Archivverzeichnis mit dem Datum erstellt. Dann werden diese Nicht-Zips in diesen Ordner verschoben.

Zweite if Anweisung prüft auf zip-Dateien, wenn vorhanden, entpackt es jedes, dann löschen Sie die ZIP-Dateien.

$dir = "D:\test" 
$date = Get-Date -Format "yyyy-MMM-dd" 

if (Test-Path "$dir\*" -Exclude *.zip -PathType Leaf) { 
    $newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force 
    $nozip = gci -Recurse $dir -Exclude *.zip | where { ! $_.PSIsContainer } 

    foreach ($file in $nozip) { 
     Move-Item $file $newDir 
    } 
} 
if (Test-Path "$dir\*.zip" -PathType Leaf) { 
    $list = gci -Recurse $dir -Include *.zip 
    $shell = New-Object -COM Shell.Application 

    foreach ($file in $list) { 
     $zip = $shell.NameSpace($file.FullName) 
     foreach ($item in $zip.Items()) { 
      $shell.NameSpace($dir).CopyHere($item) 
     } 
     Remove-Item $file 
    } 
} else { 
    exit 
} 

Beispielszenario:

Ordner D: \ Test enthält Dateien A.txt, B.txt und C.txt.
Jeden Morgen werden die Dateien B.zip und C.zip mit dem neuen B.txt und C.txt in den gleichen Ordner D: \ Test übertragen.

Die ZIP-Dateien müssen entpackt werden, aber die entsprechenden B.txt und C.txt, die sich bereits in diesem Ordner befinden, müssen in D: \ Test \ Archive, dann B.zip und C.zip verschoben werden kann entpackt werden, ein neues B.txt und C.txt in D: \ Test belassen, und dann werden diese Zip-Dateien gelöscht.

Das Stück, mit dem ich Probleme habe, ist, dass A.zip nicht täglich übertragen wird. Es ist einmal pro Woche und bis A.zip den Ordner erreicht, muss A.txt in D: \ Test bleiben.

Momentan verschiebt mein Skript jeden Tag alle Nicht-Zip-Dateien nach D: \ Test \ Archive. Wenn B.zip und C.zip in D: \ Test kommen, wird es keine A.txt geben, nachdem der Prozess abgeschlossen ist, wird es mit dem Rest der Dateien nach D: \ Test \ Archive verschoben.

Also ich brauche eine Möglichkeit, alle TXT-Dateien gegen die ZIP-Dateien zu überprüfen, und wenn es eine Übereinstimmung nach Dateinamen gibt, nicht die Erweiterung, dann verschieben Sie diese nicht gezippte Datei nach D: \ Test \ Archive. Wenn keine Übereinstimmung vorhanden ist, belassen Sie diese nicht gezippte Datei in D: \ Test und fahren mit der Verarbeitung der übereinstimmenden Dateien fort.

+0

Sie können einige Beispielszenarien mit entsprechenden Dateinamen hinzufügen. So kommt 'foo.zip kommt, da sind bereits Dateien bar und zof -> foo wird extrahiert und jetzt gibt es foo, bar Dateien ...' – vonPryz

+0

Ok, @vonPryz, fügte ich das Szenario des Prozesses. Vielen Dank. – soMuch2Learn

Antwort

1

Ändern Sie bitte Ihre ersten Teil wie folgt aus:

$dir = "D:\Test" 
$date = Get-Date -Format "yyyy-MMM-dd" 
$newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force 
$files = (Get-ChildItem "$dir\*.txt").Name | foreach {$_.Split(".")[0]} 
$zips = (Get-ChildItem "$dir\*.zip").Name | foreach {$_.Split(".")[0]} 
foreach ($file in $files) 
{ 
    foreach ($zip in $zips) 
    { 
     if($file -match $zip) 
     { 
      Move-Item "$dir\$file.txt" $newDir 
      Write-Output "$file matches $zip" 
     } 
     else 
     { 
      Write-Output "$file does not match $zip" 
     } 
    } 
} 
0

Sie Matt Dank! Ich habe ein paar Dinge ein wenig geändert, aber Ihre Vergleichsschleifen waren der Schlüssel.

$dir = "D:\Test" 
$date = Get-Date -Format "yyyy-MMM-dd" 
$newDir = New-Item -Type Directory -Path "$dir\Archive\$date" -Force 
$fileName = gci $dir -exclude *.zip | ? { ! $_.PSIscontainer} | % { [IO.Path]::GetFileNameWithoutExtension($_) } | Sort 
$zips = gci -recurse $dir -Include *.zip 
$zipName = $zips | % { [IO.Path]::GetFileNameWithoutExtension($_) } | Sort 

foreach ($file in $fileName){ 
    foreach ($zip in $zipName){ 
     if($file -match $zip){ 
      Move-Item "$dir\$file.txt" $newDir 
     } 
    } 
} 

if (Test-Path "$dir\*.zip" -pathType leaf){ 
    $shell = New-Object -com shell.application 
    foreach($file in $zips){ 
     $zip = $shell.NameSpace($file.FullName) 
     foreach($item in $zip.items()){ 
      $shell.Namespace($dir).copyhere($item) 
     } 
     Remove-Item $file 
    } 
} else { 
    Exit 
} 
Verwandte Themen