Сравнение части имени файла в пакетном файле Windows

Сравнение части имени файла в пакетном файле Windows

Рассмотрим этот сценарий:

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

вызывается какthisscript 11111.9100.csv

Я хочу сделать следующее: переместить файл в правильную папку, основываясь на втором сегменте имени файла (9100), так что если он больше 9200, переместить его в одну папку, а если нет, переместить в другую папку.

Проблема, по-видимому, в том, что сравнение не работает.

решение1

Деннис выявил одну проблему и дал решение в своем ответе. Но есть еще и другие проблемы.

1) Ваш код set partial_name = %%Gбудет включать в себя завершающий пробел в имени переменной и начальный пробел в значении. Код должен выглядеть так:set partial_name=%%G

2) Возможно, ваше %1значение уже заключено в кавычки. В этом случае вам следует удалить кавычки перед добавлением собственного значения, используя "%~1"вместо "%1".

3) Возможно, в вашем случае это не проблема, но обычно рекомендуется заключать пути к файлам в кавычки на случай, если имя содержит пробелы или специальные символы.

4) Я предполагаю, что вы хотите выполнить числовое сравнение. Команда IF использует почти те же правила, что и команда SET /A, когда она пытается разобрать число - любое число с префиксом 0 будет обработано как шестнадцатеричное представление. Если она обнаружит недопустимую шестнадцатеричную цифру, например 8 или 9, то IF вернется к сравнению строк вместо числового сравнения.

Например, if 09 lss 8 (echo true) else echo falseвозвращает true.

Поэтому, если во втором сегменте имени вашего файла потенциально могут быть начальные нули, то вам нужно проделать больше работы.

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\"
)

решение2

На самом деле вы сравниваете строку , partial_nameа 9100не содержимое переменной.

Так как p GEQ 9, это будет оценено как истинное.

Также set partial_name = %%Gустанавливает (обратите внимание partial_name на  %%Gконечные и начальные пробелы).

Чтобы исправить обе проблемы, заключите имя переменной в знаки процента ( %) и удалите пробелы вокруг знака eual ( =):

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\ )

Связанный контент