Array in einer Batchdatei kopieren

788
Mike Van Dunk

Ich habe mehrere Dateien in mehreren Verzeichnissen / Unterordnern, die ich in mehrere Ziele kopieren muss. Ich mache dies derzeit mit xcopy, aber ich mache es Zeile für Zeile, also gibt es mehrere Codezeilen. Ein Freund schlug vor, stattdessen ein Array zu verwenden, was ich jetzt versuche.

Ich habe verschiedene Varianten ausprobiert, um dies zum Laufen zu bringen. Meine letzte Variante sieht so aus:

@echo off set "mansource=somelocation\location1\sourcefolder" set "mandest=someloacation\location2\destfolder  set src[0]="%MANSOURCE%\folderA\number1.pdf" set dest[0]="%MANDEST%\folderB\number\1"  set src[1]="%MANSOURCE%\folderC\number2.pdf" set dest[1]="%MANDEST%\folderD\number\2" set /a "x=0"  for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y  pause 

Ich weiß, dass dies falsch ist, da es nicht funktioniert, aber nichts anderes, was ich versucht habe, hat auch funktioniert. Für jedes Beispiel, das ich bisher online über Arrays in einem Stapel gefunden habe, gibt es nur den Befehl do (echo), um entweder das Indizierte aufzulisten oder eine Anweisung an die cmd-Eingabeaufforderung zu drucken. Ich konnte keine Beispiele finden Ich hatte eine Variation des obigen Codes, aber es ergab sich eine endlose Schleife mit "0 kopierten Dateien", die sich immer wiederholen.

Die Idee ist, die Datei in src [0] an die Speicherorte in dest [0] kopieren zu lassen, dann die Datei in src [1] und so weiter.

Jeder Rat wäre dankbar.

Hinweis: Die Verwendung eines * .pdf-Platzhalters funktioniert nicht, da sich an diesen Stellen andere PDF-Dateien befinden und ich nur bestimmte, um kopiert zu werden. Außerdem befindet sich jede Datei an einem anderen Ort als die nächste und jedes Kopierziel für diese Datei ist ebenfalls unterschiedlich.

2
Das erste, was auffällt, fehlt in Zeile 3 ein abschließendes Zitat. Ist das ein Tippfehler hier oder im eigentlichen Code? Ƭᴇcʜιᴇ007 vor 7 Jahren 1
Es ist ein Tippfehler hier. Mike Van Dunk vor 7 Jahren 0

2 Antworten auf die Frage

0
Ƭᴇcʜιᴇ007

Stapel + "Arrays" (die eigentlich keine Arrays sind) sind ein Schmerz. :)

Ich würde stattdessen die Verwendung von PowerShell vorschlagen, da sie korrekte Arrays unterstützt. So etwas wie:

$mansource = "somelocation\location1\sourcefolder" $mandest = "someloacation\location2\destfolder"  # Create empty arrays $sources = @() $destinations = @()  # Add values to arrays $sources += Join-Path $mansource "\folderA\number1.pdf" $sources += Join-Path $mansource "\folderC\number2.pdf"  $destinations += Join-Path $mandest "\folderB\number\1" $destinations += Join-Path $mandest "\folderD\number\2"  # Iterate over the Sources array and copy to the matching Destination. for ($i = 0; $i -le $sources.length; $i++) { Copy-Item $sources[$i] $destinations[$i] -Force } 
Ja, ich dachte an Powershell, aber ich würde lieber Batch für diesen speziellen Zweck verwenden, wenn ich kann. Mike Van Dunk vor 7 Jahren 0
0
Pimp Juice IT

Da Sie nach einer Batch-Lösung suchen, besteht eine andere Möglichkeit darin, eine FOR- Schleife mit dem 0Durchgangsindexbereich zu erstellen x. Die FOR- Schleife durchläuft die Werte der Indexnummer und ruft mit dem CALL- Befehl die Namen der korrelierten Subroutinen auf.

Die Subroutine Markennamen werden alle die gleichen sein, außer die Indexnummer Werte (wie in der FOR - Schleife) an die Beschriftungsnamen angehängt werden ( das heißt :idx0, :idx1, :idx2, und so weiter).

Jede Unterroutine sollte die gleichen Variablennamen enthalten, die Werte für jedes sollten jedoch entsprechend eingestellt werden. Jede Unterroutine muss jedoch mit enden GOTO :EOF. Sie GOTO :EOFgeben die Kontrolle an den Aufrufer zurück und lassen ihn seine Logik beenden. In diesem Fall startet die FOR / R- Schleife.

Stellen Sie sicher, dass Ihre Logik nach dem Ende Ihrer Logik vorhanden ist EXIToder GOTO :EOFsich nicht auf die darunter liegende Logik bezieht, wie beispielsweise Unterprogrammbezeichnungen, die nur mit CALL- Befehlen ausgeführt werden sollen.

Beispielskript

@echo off  set "mansource=somelocation\location1\sourcefolder" set "mandest=someloacation\location2\destfolder"  FOR %%A IN (0,1) DO CALL :idx%%A for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y  pause ::GOTO :EOF EXIT  :idx0 set src="%MANSOURCE%\folderA\number1.pdf" set dest="%MANDEST%\folderB\number\1" GOTO :EOF  :idx1 set src="%MANSOURCE%\folderC\number2.pdf" set dest="%MANDEST%\folderD\number\2" GOTO :EOF 

Weitere Ressourcen