BAT-Datei zum Extrahieren des Ordnernamens aus einem Dateinamen und Verschieben der Datei in diesen Ordner

BAT-Datei zum Extrahieren des Ordnernamens aus einem Dateinamen und Verschieben der Datei in diesen Ordner

Ich bin mit der Windows-Bat-Dateiprogrammierung nicht sehr vertraut und wäre für jede Hilfe dankbar.

Ich brauche eine Bat-Datei, um Folgendes zu tun:

  • Ordnernamen aus einem Dateinamen extrahieren - z. B. Chemie aus dem Dateinamen „123-Chemistry-101.rep“ extrahieren. „-“ kann verwendet werden, um Anfang und Ende des Tokens zu kennzeichnen.
  • Verschieben Sie dieselbe Datei in einen Ordner mit dem Namen „Chemie“. „Chemie“ ist ein Unterverzeichnis, in dem sich alle Berichte befinden.

Den zweiten Teil (den ich auf dieser Site gefunden habe) kann ich wahrscheinlich machen, aber der erste Teil übersteigt meine Fähigkeiten.

zB für /RU:\Test %%f in (*.rep) kopiere %%f U:\test\Chemistry\

Grüße, Durand

Antwort1

Sie haben danach gefragt Batch, aber ich antworte mit , Powershellweil ich denke, dass es Batchfür eine solche Aufgabe heutzutage etwas veraltet ist, und hoffe, dass Ihr System Folgendes unterstützt Powershell:

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep

foreach($file in $files) {
  $folder = $file.toString().split("-")[1]
  $sourcefile = "$rootDir\$file"
  $targetdir = "$rootDir\$folder"
  if(!(Test-Path -Path $targetdir )){
    New-Item -ItemType directory -Path $targetdir
  }
  Move-Item $sourcefile $targetdir
}

Bearbeiten @Karan:

Rekursiv (Unterverzeichnisbaum beibehalten):

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep -Recurse

foreach($file in $files) {
  $sourcefile = $file.Fullname
  $filepath = $file.PSParentPath
  $newfoldertocreate=$file.toString().split("-")[1]
  if(!(Test-Path -Path $filepath\$newfoldertocreate)){
    New-Item -ItemType directory -Path $filepath\$newfoldertocreate
  }
  Move-Item $sourcefile $filepath\$newfoldertocreate
}

Antwort2

Führen Sie diese Batchdatei aus dem übergeordneten Ordner vonOrdner „Berichte“:

for /f "delims=" %%a in ('dir /b /s "Reports folder\*.rep"') do for /f "tokens=2 delims=-" %%i in ("%%~a") do (
    if not exist "%%~dpa%%i\" md "%%~dpa%%i"
    move "%%~a" "%%~dpa%%i\"
)

%%a und %%i sind die Variablen, die in den beidenfürSchleifen. Erstere enthält die vollständigen Pfade zu den .REP-Dateien (mit freundlicher Genehmigung der äußeren Schleife) und letztere enthält die aus den Dateinamen extrahierten Ordnernamen (mit freundlicher Genehmigung der inneren Schleife).

for /?ist das, was sich jeder Interessierte für weitere Hilfe wirklich ansehen sollte (beachten Sie, dass in Batchdateien die %-Zeichen doppelt vorkommen):

%~I  - expands %I removing any surrounding quotes (")
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only

Was bedeutet also "%%~dpa%%i"? Angenommen, eine der .REP-Dateien, die sich imdirBefehl ist "C:\Reports folder\123-Chemistry-101.rep".

%%~dpawürde den Laufwerkbuchstaben und den Pfad der Datei abzüglich der Anführungszeichen bedeuten, also C:\Reports folder\.

%%ichwäre, wie ich oben angemerkt habe, der Ordnername, der aus dem Dateinamen (irgendetwas zwischen zwei Bindestrichen als Trennzeichen) extrahiert wurde, in diesem Fall also Chemistry.

Alles in allem würde sich „%%~dpa%%i“ für diese Datei zu erweitern "C:\Reports folder\Chemistry", da die Datei dorthin verschoben werden soll.

verwandte Informationen