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 /r
Flag „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 .bat
statt 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 enabledelayedexpansion
da wir mit Variablen arbeiten, deren Werte sich bei jeder Schleifeniteration ändern. Das for
durchlä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 file
as fest %%~nA
, die nur ein Parameter ist, der %%A
auf den Dateinamen reduziert ist. Wir verwenden eine if
Anweisung, 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 if
Anweisung, 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 move
und unterdrücken die Bestätigungsaufforderung mit /y
(das /y
ist 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 ( dir
und 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! :)