2017-02-11 2 views
0

Was ist der einfachste Weg, um eine Batch-Datei lange Listen von Daten zu laden? Momentan lade ich meinen aus einer separaten Textdatei, aber ich vermute, dass das langsamer ist, als die Daten in der gleichen Datei zu haben wie der Programmcode, der gleichzeitig geladen wird. Gibt es einen besseren Weg, es zu handhaben als das, was ich jetzt mache, was das ist:Hat Windows Batch etwas ähnliches wie die "Daten" -Anweisung von BASIC?

for /f "usebackq delims=" %%g in (list.txt) do (if exist "%%g.jpg" del "%%g.jpg") 
+0

easer/besser definieren. Leichter zu lesen/zu pflegen/zu verstehen für Sie/spätere Benutzer/Computer? In Ihrem Code 'usebackq' und die Klammern um den if sind nicht notwendig. – LotPings

+0

Es ist definitiv einfacher, sowohl den Programmcode als auch den Datensatz zu pflegen, wenn sie sich in separaten Dateien befinden. Aber sie scheinen langsamer zu sein. Deshalb frage ich mich, ob es eine andere Möglichkeit gibt, die Daten zu lesen. –

+0

Es gibt keine Notwendigkeit für die "wenn vorhanden". Und Sie erzwingen zwei Festplattenlesevorgänge und eine Festplatte schreiben statt eins und eins. Löschen Sie einfach die Datei. Wenn es nicht existiert, wird sich nichts ändern, wenn es dies tut, wird es gelöscht. – Freddie

Antwort

1

Nun können versuchen, ein weiterer alberner Weg, um eine Liste zu lesen. Ich habe diese Technik von Aacini auf den Dostips.com Foren gehört. Es gibt eine maximale Anzahl an Zeichen, die Sie für den SET-Befehl haben können, so dass es beim Versuch, vielen Einträgen zuzuordnen, fehlschlägt.

@echo off 
setlocal EnableDelayedExpansion 

set str=file1.txt?^ 
file2.txt?^ 
file 4.txt?^ 
file5.txt?^ 
some other file.jpg?^ 
and yet another file.mp3? 

for /F "delims=" %%s in (^"!str:?^=^ 
%= Replace question with linefeeds =% 
!^") do (
    echo %%~s 
) 
pause 

Ausgabe

file1.txt 
file2.txt 
file 4.txt 
file5.txt 
some other file.jpg 
and yet another file.mp3 
Press any key to continue . . . 

Getestet habe ich alle drei Sätze von Code und weil die Datensätze der Zeitdifferenz so klein ist, ist auf meiner Maschine zu vernachlässigen. Ich habe 36 Zeilen für den Datensatz verwendet und den Code zehnmal durchlaufen.

Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.79 Seconds 
Squashman time is 0.79 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.79 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.62 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.94 Seconds 
Wally time is 0.79 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.94 Seconds 
Wally time is 0.79 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.78 Seconds 
Wally time is 0.78 Seconds 
Squashman time is 0.78 Seconds 
Magoo time is 0.78 Seconds 
Press any key to continue . . . 
2

Hier ist eine Art und Weise zu tun, was Sie fragen:

@ECHO OFF 
SETLOCAL 
SET "data=" 
FOR /f "usebackqdelims=" %%a IN ("%~f0") DO (
IF /i "%%a"=="[enddata]" SET "data=" 
IF DEFINED data ECHO execute command ON "%%a" 
IF /i "%%a"=="[data]" SET "data=Y" 
) 

GOTO :EOF 

[data] 
some filename.jpg 
MORE data.jpg 
[enddata] 

Nun - es ist zu kompliziert. Offensichtlich kann die [enddata] Einrichtung entfernt werden, aber dies erlaubt Flexibilität (zwei oder mehr Datenabschnitte, [Daten1] [Daten2] usw. mit jeweils eigenem Datenendabschnitt)

Ich würde das vermuten es wäre langsamer als dein jetziges System und viel schwieriger zu benutzen. Mit einer externen Datei können Sie diese Datei einfach mit einem Editor (oder programmatisch) ändern, während Sie bei diesem System die Batch-Datei selbst verwalten müssen.

Es ist besser geeignet, um „Firmware“ -Stil Daten - semi-permanent wie eine Liste der Server - anstatt dynamische Daten, aber Sie zahlt Ihr Geld, Sie nimmt Ihre Wahl ...

+0

Danke, ich vermute, du hast Recht, aber ich freue mich darauf, es auszuprobieren und sie beide zu times. Das Schlimmste, was passieren könnte, ist, dass ich eine neue Technik lernen werde. –

3

Ich denke, das ist der einfachste Weg ist:

@echo off 

for %%g in (file1 file2 file3 "A long file name with spaces" 
      fileN fileM) do (
    del "%%~g.jpg" 
) 
+0

Es sei denn, es gibt ein Komma oder ein Semikolon in einem der Dateinamen. Dann müssten Sie alle Dateinamen angeben. – Squashman

Verwandte Themen