Может кто-нибудь сказать, пожалуйста, что не так с этим циклом FOR? - PullRequest
0 голосов
/ 29 марта 2019

Извиняюсь, если дублирую, но другие ответы пока не помогли.

Все, что я пытаюсь сделать, это перебрать файлы в папке и переименовать последнюю часть файла / расширения.

Проще говоря - это может быть 1-90 файлов, [имя_файла] _01 - [имя_файла] _90, и каждый день (с помощью планировщика событий Windows) число должно увеличиваться на единицу.

Ничего из того, что я делаю, кажется, не достигает этого.

Файлы также должны вести себя немного иначе, когда они достигают определенных этапов (30-60-90), но я считаю, что это должно уже работать, если переменные обновляются должным образом.

Я перепробовал так много возможных комбинаций адресации переменных (! Variable! /% Variable% / etc.), И хотя я могу войти в цикл, он не повторяется и не обновляет номер переменной для конца файлов.

SetLocal EnableDelayedExpansion
set cnt=0
for %%A in (*) do set /a cnt+=1
set /A fileNumber = %cnt%-1
set /A newFileNumber = %cnt%
echo %fileNumber%
echo %newFileNumber%
for /l %%F in (%fileNumber%,1,1) do (
    if %newFileNumber%==90 (
        ren "*_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    if %newFileNumber%==60 (
        ren "*_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    if %newFileNumber%==60 (
        "ren *_%fileNumber%.don" "*_%newFileNumber%.csv"
        )
    ren "*_%fileNumber%.don" "*_%newFileNumber%.don"
    set fileNumber=%fileNumber%-1
    set newFileNumber=%newFileNumber%-1
    )

Это должно просто обновить все файлы в каталоге, чтобы увеличить на 1 в имени файла. Если кто-то может указать, где я иду не так, я был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019
@ECHO OFF
SetLocal EnableDelayedExpansion
:: target directory name in variable for convenience.
SET "targetdir=U:\sourcedir"
:: switch to target directory
pushD "%targetdir%"
:: Start count at 100 so that it is 3 digits long
set cnt=100
dir
for %%A in (*) do set /a cnt+=1
set /A fileNumber = %cnt%
set /A newFileNumber = %cnt%+1
:: echoing last 2 characters (will be digits) of variables
echo %fileNumber:~-2% (%filenumber%)
echo %newFileNumber:~-2% (%newfilenumber%)
:: Assign %%F to values 100+actual descending by 1 to 101
for /l %%F in (%fileNumber%,-1,100) do (
 rem note need REM remarks within the loop
 REM use !varname! for current value of variable VARNAME
    if !newFileNumber:~-2!==90 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
    if !newFileNumber:~-2!==60 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
    if !newFileNumber:~-2!==30 (
        ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.csv"
        )
 rem Since you've just renamed (eg) _59.don to _60.csv, _59.don is missing  
    IF EXIST "*_!fileNumber:~-2!.don" ECHO ren "*_!fileNumber:~-2!.don" "*_!newFileNumber:~-2!.don"
    set /A fileNumber=fileNumber-1
    set /A newFileNumber=newFileNumber-1
    )
:: return to original directory
popd
GOTO :EOF

Необходимые команды REN просто ECHO отредактированы для целей тестирования. После того как вы убедились, что команды верны , измените ECHO REN на REN, чтобы фактически переименовать файлы.

К сожалению, вы показали нам, КАК вы НЕ смогли сделать какую-то операцию, которая немного расплывчата. Таким образом, нам необходимо выяснить, что вы намереваетесь сделать, что является дополнительной работой и склонно к преследованию диких гусей.

Вы не говорите, что делать с файлами * _90, поэтому мы ничего не можем поделать.

Похоже, вы хотите изменить * _59.don на * _60.csv, но ваше переименование хочет изменить * _60.DON при следующем вызове, поэтому, если имя не было изменено с _ * 60.CSV обратно на * _60 .ДОН, это не сработает.

Обратите внимание, что основой этой подпрограммы является работа с последними двумя символами переменных. Это должно соответствовать ведущему 0, указанному в схеме нумерации.

Это стандартная практика, предполагающая, что вы будете выполнять любую процедуру с проверочным каталогом для проверки.

Обратите внимание, что каждый REN имеет значение ECHO, поэтому он НЕ ИСПОЛНЯЕТСЯ, а просто сообщается. Измените ECHO REN на REN, чтобы фактически выполнить команду.

Обратите внимание, что партия в значительной степени не зависит от регистра. Это означает, что вам не нужно носить свой ключ SHIFT, если вы не хотите.

0 голосов
/ 29 марта 2019

Для математики вы должны использовать /A с SET

SET x=1
SET /A x=%x%+1
ECHO %x%

Параметр / A указывает, что строка справа от знака равенства является числовым выражением, которое оценивается. Оценщик выражений довольно прост и поддерживает следующие операции, в порядке уменьшения порядок старшинства:

Для вложенных переменных вам нужно использовать ! вместо %

SetLocal EnableDelayedExpansion

Setlocal EnableDelayedExpansion 
for /f %%G in ("abc") do ( 
    set _demo=%%G & echo !_demo!
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...