Vergleichen eines Teils eines Dateinamens in einer Windows-Batchdatei

Vergleichen eines Teils eines Dateinamens in einer Windows-Batchdatei

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 = %%Genthält ein Leerzeichen am Ende des Variablennamens und ein Leerzeichen am Anfang des Wertes. Der Code sollte lauten:set partial_name=%%G

2) Ihr %1Wert 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 falseretourniert 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_namemit 9100und nicht den Inhalt der Variablen.

Da p GEQ 9wird dies als „true“ ausgewertet.

set partial_name = %%GLegt 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\ )

verwandte Informationen