检查文件是否存在,然后在名称后附加数字

问题描述 投票:1回答:2

如标题所示,我想知道是否可以通过验证位于同一文件夹中的其他文件来命名.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,所以我需要一个程序来像我之前所说的那样实际检查其他文件。

batch-file
2个回答
1
投票
@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标签循环获取索引文件名。一旦找不到第一个索引文件名,就将filename设置为可用于创建索引文件名的值。


1
投票

如果数字后缀始终是连续的,则可以对文件名进行排序,以便可以检索最大的数字。由于批处理脚本只能进行纯字母排序,因此您需要在数字后缀左边加零以得到固定的宽度,然后按与字母数字一相同的顺序进行字母排序。

这里是我的意思的示例:

@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
© www.soinside.com 2019 - 2024. All rights reserved.