
Betrachten Sie dieses Skript:
SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )
ENDLOCAL
aufgerufen alsthisscript 11111.9100.csv
Ich möchte Folgendes tun: die Datei in den richtigen Ordner verschieben, basierend auf dem zweiten Segment des Dateinamens (9100). Wenn dieser also größer als 9200 ist, verschieben Sie sie in einen Ordner, und wenn nicht, verschieben Sie sie in einen anderen Ordner.
Das Problem scheint zu sein, dass der Vergleich nicht funktioniert.
Antwort1
Dennis hat ein Problem identifiziert und in seiner Antwort eine Lösung bereitgestellt. Aber es gibt noch weitere Probleme.
1) Ihr Code set partial_name = %%G
enthält ein Leerzeichen am Ende des Variablennamens und ein Leerzeichen am Anfang des Wertes. Der Code sollte lauten:set partial_name=%%G
2) Ihr %1
Wert steht möglicherweise bereits in Anführungszeichen. In diesem Fall sollten Sie die Anführungszeichen entfernen, bevor Sie Ihren eigenen hinzufügen, indem Sie "%~1"
anstelle von verwenden "%1"
.
3) In Ihrem Fall vielleicht kein Problem, aber generell ist es eine gute Idee, Dateipfade in Anführungszeichen einzuschließen, falls der Name Leerzeichen oder Sonderzeichen enthält.
4) Ich gehe davon aus, dass Sie einen numerischen Vergleich durchführen möchten. Der IF-Befehl verwendet beim Versuch, eine Zahl zu analysieren, fast dieselben Regeln wie der SET /A-Befehl. Jede Zahl mit der Vorsilbe 0 wird als hexadezimale Notation behandelt. Wenn eine ungültige Hex-Ziffer wie 8 oder 9 gefunden wird, greift der IF-Befehl auf einen Zeichenfolgenvergleich statt auf einen numerischen Vergleich zurück.
Beispielsweise if 09 lss 8 (echo true) else echo false
retourniert true
.
Wenn also das zweite Segment Ihres Dateinamens möglicherweise führende Nullen enthält, müssen Sie mehr Arbeit investieren.
set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)
Antwort2
Tatsächlich vergleichen Sie die Zeichenfolge partial_name
mit 9100
und nicht den Inhalt der Variablen.
Da p GEQ 9
wird dies als „true“ ausgewertet.
set partial_name = %%G
Legt außerdem partial_name
fest %%G
(beachten Sie nachstehende und führende Leerzeichen).
Um beide Probleme zu beheben, umgeben Sie den Variablennamen mit Prozentzeichen ( %
) und entfernen Sie die Leerzeichen um das Prozentzeichen ( =
):
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )