пакетний сценарій для циклу та якщо оператор не взаємодіє належним чином


2

Для цілей архівування, у мене є один каталог , повний файли , які називаються note_1.txt, note_3.txt, note_4.txtі т.д. Я пишу сценарій , щоб знайти найбільшу кількість Nсеред цих файлів, а також перейменувати новий note.txtфайл note_N+1.txt.

Я вперше використовую пакет для циклу і не можу змусити його працювати належним чином. Я спробував замінити %, !але я не впевнений, що розумію, як це працює.

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
for /f %%i in ('dir /b note_*.txt') do (
    SET archivename=%%~ni
    SET archivenumber=%archivename:~5%
    if %archivenumber% GTR %maxfile% SET /a maxfile=%archivenumber%+1
)
echo %maxfile%
ENDLOCAL

Антуан - Ви були справжньою близькою людиною, тому я додав приклад нижче, щоб допомогти вам вирішити цю тривіальну задачу, а також надав кілька посилань, щоб також трохи пояснити це. Це може допомогти, якщо ви переймете, наприклад, змінні з циклу в файл журналу. . . echo !archivenumber!>>log.txtдля кожної змінної, а потім перегляньте цей журнал після його запуску. Якщо ви повторюєте ті самі змінні зі %знаками, а не над !та переглядаєте журнал, тепер ви побачите відмінності. Дайте мені знати, чи можу я допомогти уточнити далі, але це має бути все, що є в цьому.
Pimp Juice IT

Відповіді:


1

Я щойно додав !до змінних в FORциклі, щоб переконатися, що всі вони розгорнуті під час виконання в циклі, щоб переконатися, що нові задані значення читаються відповідно, щоб допомогти отримати остаточне !maxfile!значення за кожною ітерацією циклу.

Крім того, я додав CD /D "%%~F0"рядок над початком FORциклу, щоб переконатися, що каталог змінено на каталог, в якому знаходиться скрипт, оскільки ви чітко не вказуєте каталог у своєму прикладі команд, але я також додав явний приклад сценарію нижче.

Пакетний сценарій (неявний)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
cd /d "%%~F0"
for /f %%i in ('dir /b note_*.txt') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

Пакетний сценарій (явно)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
SET "srcdir=C:\Folder\Path"
for /f %%i in ('dir /b "%srcdir%\note_*.txt"') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

Подальші ресурси

  • EnableDelayedExpansion

    Затримка розширення призведе до розширення змінних у пакетному файлі на час виконання, а не на час аналізу, цей параметр увімкнено командою SETLOCAL EnableDelayedExpansion.


    Коли діє затримка розширення, змінні можна негайно прочитати за допомогою! Змінної_імені! ви також можете прочитати та використовувати% змінної_імен%, яка покаже початкове значення (розгорнуте на початку рядка).

  • Для

    Змінні заміни (ЗА /?)

    Крім того, було підсилено заміну FOR змінних посилань. Тепер ви можете використовувати наступний необов'язковий синтаксис:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path namey
    

@Antoine - Див. Розділ Прийняття відповіді, щоб переконатися, що ти розумієш, як це працює на рішення, яке ти знайдеш, для будь-яких відповідей, які допоможуть вирішити проблему, просто встановивши прапорець у сірій лівій верхній частині відповіді, яка вирішує вашу проблему, припускаючи одну робить і вимкне зелений колір, щоб показати, що це відповідь, яку ви прийняли, оскільки саме так і повинно працювати; Ви ставите запитання, отримуєте відповіді, і якщо ви отримаєте відповідь, яка відповідає вашим потребам, ви просто приймаєте цю відповідь.
Pimp Juice IT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.