2016-07-07 1 views
1

Ich habe eine große Menge an Dateien (> 30K), die alle in einem Verzeichnis gespeichert sind und neu organisiert und archiviert werden müssen.Batch oder Powershell: Dateien mit ähnlichen Namen archivieren

Dateien werden wie (nicht chronologische Reihenfolge) genannt:

  • M056811-01-.txt
  • M056811-02-.txt
  • M056811-03-.txt
  • M956782 -01-.txt
  • M956782-02-.txt ...

Ich möchte Dateien, die zusammen gehören (haben dasselbe Präfix), zu einer Zip-Datei archivieren.

  • M056811.zip
  • M956782.zip ...

Gibt es eine Möglichkeit achive dies mit einigen Batch oder Powershell-Scripting: Welche in Art führen würde.

Ich bin nicht sehr fortgeschritten im Scripting. Abgesehen von der Antwort selbst (wenn es eine Lösung gibt) würde ich wirklich gerne wissen, dass es funktioniert.

Meine Endlösung (Vielen Dank an David Brabant):

Ich habe das Skript für Remote-dir-Nutzung. Es besteht keine Notwendigkeit, das Skript innerhalb desselben Verzeichnisses zu platzieren. Bearbeiten Sie einfach die ersten beiden Variablen und Sie sollten gut gehen.

$dirpath = "<Enter Directorypath here>" 
$offsetlength = 6 

$pathlength = $dirpath.Length 
$absolutelength = $pathlength + $offsetlength 


dir $dirpath | group { $_.FullName.Substring(0, $absolutelength) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

SO ist kein kostenloser Code-Schreibservice! Probieren Sie es selbst aus, und wenn Sie stecken bleiben, kommen Sie hierher zurück, beschreiben Sie genau, was Sie erreichen möchten und was Ihr Code tatsächlich tut. – aschipfl

Antwort

1

Hier ist etwas, das Sie mit in Powershell beginnen (ex for /?, set /?.) . Es wird davon ausgegangen, dass Sie PowerShell 5 (für das Cmdlet Compress-Archive) verwenden.

$dirpath = "D:\temp" 

dir $dirpath | group { $_.Name.Substring(0, 8) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

Hallo David, danke für deine Antwort. Ich nehme an Name.Substring (0, 8) Gruppiert den Namen durch die ersten 8 Zeichen? PS antwortet mit dem folgenden, irgendeine Idee, was der Grund sein könnte? Nicht existierender Pfad M63251-25-.txt: string. Bei H: \ tools \ Powershell \ Group_and_Archive.ps1: 7 Zeichen: 9 + Compress-Archiv $ _ $ subset.Name -Update + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (M63251-25-.txt: Zeichenfolge) [Compress-Archive], InvalidOperationException + FullyQualifiedErrorId: ArchiveCmdletPathNotFound, Compress-Archive –

+0

Ich habe den Fehler selbst gefunden. Das Skript muss sich im selben Verzeichnis wie die Dateien befinden. Jetzt funktioniert es !!! Danke David. Können Sie mir sagen, wie Sie ein bestimmtes Verzeichnis festlegen? Also gibt es keine Notwendigkeit, dass das Skript genau auf dem gleichen Dir ist? Vielen Dank David! –

0

können Sie mit Platzhaltern arbeiten. Es gibt ? für "beliebiges Zeichen" und * für "ein oder mehrere Zeichen". Dies wird als "Dateimaske" bezeichnet, zum Beispiel M000001-??-.txt.

dir "M000001-??-.txt" 
dir "M000001*.txt" 
dir "M000001*.*" 

Ihre Zip-Anwendung höchstwahrscheinlich unterstützt auch Dateimasken, so können Sie wie etwas tun (Syntax stark davon abhängt, welche Anwendung Sie verwenden - siehe Dokumentation):

ZipApp.exe /zip "M000001-??-.txt" "M000001.zip" 

Nun, das war der einfache Teil. Jetzt um alle Ihre Dateien zu verarbeiten. Sie haben gemeinsame Präfixe (M000xxx), die Ihnen erlauben, einen einfachen Zähler zu verwenden (for /L), fügen Sie genügend führende Nullen hinzu, nehmen Sie die letzten 6 Zeichen davon und fügen Sie schließlich ein weiteres "M" davor hinzu. Damit können Sie ganz einfach Ihre Dateimaske und Ihren Zip-Dateinamen erstellen.

@echo off 
setlocal enabledelayedexpansion 
for /l %%i in (1,1,10) do (
    set "n=0000000%%i" 
    set "n=M!n:~-6!" 
    echo Mask="!n!-??-.txt" Zipfile="!n!.zip" 
) 

Sie benötigen delayed expansion Ihre Variablen innerhalb der for Schleife zu verarbeiten.

Statt der Zeile echo führen Sie Ihre Zip-Anwendung mit der richtigen Parametersyntax aus.(Können Sie sich nicht helfen - sehen, es ist Dokumentation)

Wenn Sie sich nicht sicher über einen Befehl sind, finden Sie es Hilfe ist mit command /?

+0

Vielen Dank für Ihre Antwort. Tut mir leid, aber ich habe das in meiner ersten Frage nicht erwähnt. Die Namen sind nicht chronologisch geordnet. Mehr wie M065788-01-.txt, M065788-02-.txt .... M0255288-01-.txt, M0255288-02-.txt. Danke für Ihre Bemühungen. –