1

Рассмотрим этот скрипт:

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, переместите его в одну папку, а если нет, переместите в другую папку. ,

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

2 ответа2

1

Вы фактически сравниваете строковое 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\ )
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\"
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .