Проверьте, существует ли файл, а затем добавьте номер к имени - PullRequest
1 голос
/ 20 апреля 2020

Как видно из заголовка, мне интересно, могу ли я назвать файл .txt после проверки других файлов, которые находятся в той же папке ...

Прежде чем даже создать мой новый файл , Я попробовал это, но это не работает, так как я получаю ошибку The system cannot find the file specified., и я не могу использовать Traces!i!.txt в качестве переменной, даже если я определю ее позже:

@Echo Off 
SETLOCAL EnableDelayedExpansion 
Set dir=C:\...\myFolder\
Set /A i=1 
for /f %%a in ('dir %dir%Traces*.txt /b') do ( 
   Set file=%%a 
   Set /A result=!i! - !file:~6,-4! 
   If "!result:~0,1!"=="-" ( Set /A i=!file:~6,-4! + 1 ) 
   If "!result:~0,1!"=="0" ( Set /A i=!i! + 1 ) 
) 
Echo Traces!i!.txt 
ENDLOCAL 
pause

Кроме того, есть ли как получить окончательно выбранное имя в качестве переменной?

Я хочу, чтобы файлы в моей папке выглядели так:

list1.txt
list2.txt
list3.txt

В следующий раз, когда я создайте новый файл, его имя должно быть list4.txt, поэтому мне нужна программа, которая на самом деле проверяет другие файлы, как я уже говорил.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020
@echo off
setlocal

set "dir=C:\...\myFolder\"
set "i=0"

:get_filename
Set /a "i+=1"
if exist "%dir%Traces%i%.txt" goto :get_filename
set "filename=Traces%i%.txt"

echo "%dir%%filename%"
endlocal
pause

Можно просто использовать goto метку для l oop, чтобы получить индексированное имя файла. Как только 1-е проиндексированное имя файла не найдено, filename устанавливается со значением индексированного имени файла, доступного для создания.

1 голос
/ 20 апреля 2020

Если числовые суффиксы всегда являются последовательными, вы можете отсортировать имена файлов, чтобы можно было извлечь наибольшее число. Поскольку пакетная обработка сценариев может выполнять только чистую сортировку по алфавиту c, вам необходимо добавить нуф-суффиксы с нулями влево, чтобы получить фиксированную ширину, тогда сортировка по алфавиту c приведет к тому же порядку, что и альфа-цифра c один.

Вот пример того, что я имею в виду:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_TARGET=D:\path\to\target\dir"   & rem // (path to the target directory)
set "_PREFIX=Traces"                  & rem // (constant file name prefix)
set "_EXT=.txt"                       & rem // (file name extension with `.`)
set "_TEMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (path to a temporary file)

rem // Change into target directory:
pushd "%_TARGET%" && (
    rem // Write to temporary file:
    > "%_TEMPF%" (
        rem // Loop through all matching file names:
        for /F "delims= eol=|" %%F in ('dir /B /A:-D "%_PREFIX%*%EXT%"') do (
            rem // Store current base file name:
            set "NAME=%%~nF"
            rem // Toggle delayed expansion to avoid loss of `!`:
            setlocal EnableDelayedExpansion
            rem // Remove prefix from base file name, pad number with 10 zeros:
            set "NUM=!NAME:*%_PREFIX%=!" & set "PAD=0000000000!NUM!"
            rem // Return 10-digit number plus `|` plus original number (suffix):
            echo(!PAD:~-10!^|!NUM!
            endlocal
        )
    )
    rem // Restore previous working directory:
    popd
)

rem // Reset variable that will receive the resulting highest number (suffix):
set "ITEM="
for /F "tokens=2 delims=| eol=|" %%E in ('sort "%_TEMPF%"') do (
    set "ITEM=%%E"
)
rem // Clean up temporary file:
del "%_TEMPF%"

rem // Check whether there were matching files:
if defined ITEM (
    rem // Increment found highest number:
    set /A "ITEM+=1"
    rem // Return next free file path and name:
    setlocal EnableDelayedExpansion
    echo(!_TARGET!\%_PREFIX%!ITEM!%_EXT%
    endlocal
)

endlocal
exit /B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...