Verschieben von Ordnern basierend auf Bedingungen

Verschieben von Ordnern basierend auf Bedingungen

Ich habe viele Excel-Dateien in einem einzigen Ordner wie unten.

+----------------------+
| 01012019_LOC001.xlsx |
| 01012019_LOC002.xlsx |
| 01012019_LOC003.xlsx |
| 02012019_LOC001.xlsx |
| 02012019_LOC002.xlsx |
| 02012019_LOC003.xlsx |
| 03012019_LOC001.xlsx |
| 03012019_LOC002.xlsx |
| 03012019_LOC003.xlsx |
+----------------------+

eine Kombinationsstruktur aus Datum und OrtDDMMYYYY_LOCXXX

Ich möchte diese Dateien in die entsprechenden Ordner verschieben, die ähnlich der folgenden Struktur erstellt wurden.

MAIN_FOLDER
|
|-LOC001
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC002
  |-01012019
  |-02012019
  |-03012019
  |
|-LOC003
  |-01012019
  |-02012019
  |-03012019
|

Mit kann ich einzeln überweisen for /r %d in (01012019_LOC001.xlsx) do move "%d" "C:MAIN_FOLDER\LOC001\01012019\".

Aber ich suche nach einer dynamischeren Lösung. Bitte helfen Sie mir daher, eine Lösung zu finden.

PSHinweis: Sogar eine Powershell-Antwort würde ausreichen.

Antwort1

Dazu sollten Sie die Dateien mit verzögerter Erweiterung durchlaufen. Sofern es keine Unterordner gibt, aus denen Sie auch Daten ziehen möchten, würde ich das /rFlag „of“ vermeiden for, da es rekursiv ist. Das Hauptproblem besteht darin, den Dateinamen aufzuteilen, da jede Hälfte eine separate Information ist. Es sieht ungefähr so ​​aus:

@echo off

set "dir=C:\Your\Excel\File\Directory"
set "des=C:\MAIN_FOLDER"

setlocal enabledelayedexpansion
for %%A in (%dir%\*.xlsx) do (
    set "file=%%~nA"
    if not exist "%des%\!file:~-6!" md "%des%\!file:~-6!"
    if not exist "%des%\!file:~-6!\!file:~0,8!.xlsx" move /y "%dir%\%%~nxA" "%des%\!file:~-6!\!file:~0,8!.xlsx"
)

Dies ist eine Stapellösung. Sie können es also einfach kopieren, in den Editor einfügen und dann als .batstatt als speichern .txt.

Zuerst habe ich Variablen für dir(Verzeichnis; wo sich Ihre Excel-Dateien derzeit befinden) und des(Ziel; wo Sie Ihre Ordner erstellen und Ihre Dateien verschieben möchten) festgelegt. Sie müssen diese Werte bearbeiten, um Ihre Umgebung widerzuspiegeln. Bevor wir irgendetwas anderes tun, verwenden wir, setlocal enabledelayedexpansionda wir mit Variablen arbeiten, deren Werte sich bei jeder Schleifeniteration ändern. Das fordurchläuft alle Excel-Dateien im obersten Ordner unseres Verzeichnisses und weist sie dem Parameter zu %%A. Sobald wir uns in der Schleife befinden, legen wir eine Variable namens fileas fest %%~nA, die nur ein Parameter ist, der %%Aauf den Dateinamen reduziert ist. Wir verwenden eine ifAnweisung, um zu prüfen, ob der Ordner für diese Datei bereits vorhanden ist. Wenn dies nicht der Fall ist, erstellen wir den Ordner mit md. Dann verwenden wir eine weitere ifAnweisung, um zu prüfen, ob die Datei, die wir gerade betrachten, bereits in dem Ordner vorhanden ist, den wir gerade überprüft/erstellt haben. Wenn dies nicht der Fall ist, verschieben wir die Datei in den Ordner mit moveund unterdrücken die Bestätigungsaufforderung mit /y(das /yist nicht wirklich erforderlich, da wir es mit einer Anweisung starten if, aber es ist meiner Meinung nach die beste Vorgehensweise). Der Befehl „move“ hat eine integrierte Umbenennung, also verwenden wir diese einfach, um dem gewünschten Benennungsschema zu folgen.

Der knifflige Teil hier sind die variablen Teilzeichenfolgen - da Ihre Daten und Standorte festgelegte Zeichenzahlen sind, zählen wir diese Zeichen einfach und extrahieren sie nach Bedarf:
!file:~-6!greift nur die letzten sechs Zeichen (unsere LOC-Informationen) während !file:~0,8!greift die ersten acht Zeichen (unsere Datumsinformationen). Das einzige andere erwähnenswerte ist die Verwendung von Ausrufezeichen innerhalb einer Schleife, die eine verzögerte Erweiterung verwendet (da dies die Variablen sind, die sich ändern); für unsere statischen Variablen ( dirund des) sind die Prozentzeichen durchweg in Ordnung.

Hoffentlich bewirkt dies, was Sie wollten, oder bringt Sie zumindest auf den richtigen Weg.

Referenz:für,variable Teilzeichenfolge,bewegen

Antwort2

Der Vollständigkeit halber hier einePower ShellAusführung:

$Source = 'C:\Source'
$Dest   = 'C:\Destination'

Get-ChildItem $source -filter *.xls | foreach{
   $FolderName = $_.Basename.Split('_')[1]
   If (!(Test-Path "$Dest\$FolderName")) {
      New-Item -Path $Dest -Name $FolderName -ItemType Directory | out-null
   }
   Move-Item $_.FullName "$Dest\$FolderName"
}

Ich habe mich für dieOrt###Zeichenfolge durch Aufteilen des Basisnamens auf den Unterstrich, was wiederum ein zweielementiges Zeichenfolgenarray zurückgibt. Die1Index verweist auf das zweite Element. WennTestpfadfehlschlägt, erstellen wir den Ordner und leiten die Rückgabe anout-nullum die Bildschirmanzeige zu vermeiden. DannArtikel verschiebentut genau das, wonach es sich anhört! :)

Untergeordnetes Element abrufen

ForEach-Objekt

String.Split-Methode

Testpfad

Neuer Gegenstand

Artikel verschieben

verwandte Informationen