
Рассмотрим этот сценарий:
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\ )