写一个bat将当前文件夹下非文件夹的文件名修改为创建时间,如果时间重复在后面加上序号,并且每个步骤加上0.1s的延时
时间: 2023-06-25 07:05:49 浏览: 139
@echo off
setlocal enabledelayedexpansion
set "counter=0"
for %%a in (*) do (
if not "%%~a"=="%~nx0" (
set "filename=%%~na"
set "ext=%%~xa"
set "datestring=%%~ta"
set "datestring=!datestring: =_!"
set "datestring=!datestring::=-!"
set "newname=!filename!_!datestring!!ext!"
if exist "!newname!" (
set /a "counter+=1"
set "newname=!filename!_!datestring!_!counter!!ext!"
)
echo Renaming "%%a" to "!newname!"
timeout /t 1 /nobreak > nul
ren "%%a" "!newname!"
timeout /t 0.1 > nul
)
)
echo Done.
timeout /t 2 > nul
```
将以上命令保存为一个后缀名为 .bat 的文件,放到想要修改文件名的文件夹中运行即可。
相关问题
写一个bat将当前文件夹下非文件夹的文件名修改为创建时间,如果时间重复在后面加上序号,并且每个步骤执行后需要手动按空格确认。
### 回答1:
@echo off
setlocal enabledelayedexpansion
for %%a in (*) do (
if not "%%~a"=="%~nx0" (
set "filename=%%~na"
set "extension=%%~xa"
set "creationtime=%%~ta"
set "creationtime=!creationtime:/=-!"
set "creationtime=!creationtime::=-!"
set "newfilename=!filename!_!creationtime!!extension!"
if exist "!newfilename!" (
set "counter=1"
:loop
set "newfilename=!filename!_!creationtime!_!counter!!extension!"
if exist "!newfilename!" (
set /a "counter+=1"
goto loop
)
)
echo Renaming "%%a" to "!newfilename!"
pause
ren "%%a" "!newfilename!"
pause
)
)
echo All files have been renamed.
pause>nul
### 回答2:
可以使用以下的bat脚本来实现你的需求:
```bat
@echo off
setlocal enabledelayedexpansion
rem 获取当前文件夹路径
set "folder=%cd%"
rem 循环遍历当前文件夹下的所有文件
for /R "%folder%" %%f in (*) do (
rem 判断是否为文件夹
if not "%%~df"=="%folder%" (
rem 获取文件的创建时间
for %%a in ("%%~tf") do set "time=%%~ta"
rem 检查是否已存在相同时间的文件
set "count=0"
:check
if exist "%folder%\!time: =_!!count!.%%~xf" (
set /a "count+=1"
goto check
)
rem 重命名文件
echo 文件名:"%%~nxf",创建时间:%time%
ren "%%f" "!time: =_!!count!.%%~xf"
rem 等待用户确认
pause
)
)
```
请将以上代码复制到一个文本文件中并将其保存为`rename_files.bat`,然后将此bat文件放置在你想要修改文件名的文件夹中。运行bat文件后,它将遍历当前文件夹下的所有非文件夹文件,并将它们的文件名修改为创建时间,如果有多个文件具有相同的创建时间,则在后面添加一个序号。每次修改文件名后,bat文件会等待你按下空格键以继续执行下一个文件的处理。
### 回答3:
首先,你需要创建一个批处理脚本(.bat文件),并在其中添加以下代码:
```bat
@echo off
setlocal enabledelayedexpansion
REM 遍历当前文件夹下所有非文件夹的文件
for /r %%A in (*) do (
if not "%%~xA"=="" (
REM 获取文件的创建时间
for /f "delims=" %%B in ('wmic datafile where "name='%%~fA'" get creationdate ^| findstr [0-9]') do (
set "ctime=%%B"
)
REM 判断文件名是否已存在,如果已存在则在后面加上序号
set "count=1"
set "newname=!ctime:~0,8!-!count!%%~xA"
:checkname
if exist "!newname!" (
set /a "count+=1"
set "newname=!ctime:~0,8!-!count!%%~xA"
goto checkname
)
REM 重命名文件
echo 将文件 "%%~fA" 重命名为 "!newname!"
ren "%%~fA" "!newname!"
)
)
echo 执行完成,按下空格键退出...
pause > nul
```
这个批处理脚本实现了以下功能:
1. 遍历当前文件夹下的所有非文件夹的文件。
2. 获取每个文件的创建时间。
3. 判断文件名是否已存在,如果已存在则在后面加上序号。
4. 重命名文件。
在每一步操作完成后,脚本会输出相应的信息,然后等待按下空格键进行下一步操作。最后一步输出"执行完成,按下空格键退出..."后,脚本会等待按下空格键确认,然后自动退出。
请在需要执行的文件夹中创建一个新的.bat文件,将以上代码粘贴进去,然后双击运行该.bat文件即可。记得要按照脚本输出的提示按下空格键才能继续执行下一步操作。
写一个bat将当前文件夹下所有图片和视频文件的文件名修改为对应文件的创建时间,如果时间重复在后面加上序号,并且每个步骤加上0.1s的延时,同时防止获取不到文件出现异常
### 回答1:
@echo off
setlocal enabledelayedexpansion
REM 遍历当前文件夹下的所有文件
for /f "delims=" %%f in ('dir /b /a-d *.*') do (
echo 处理文件: %%f
REM 获取文件创建时间
set "filetime="
for /f "usebackq delims=" %%d in (`wmic datafile where name^=".\%%f" get creationdate ^| findstr /b [0-9]`) do (
set "filetime=%%d"
goto :filetime_found
)
:filetime_found
REM 处理文件名
set "filename=%%~nf"
set "ext=%%~xf"
set "newname=!filetime:~0,4!-!filetime:~4,2!-!filetime:~6,2!_!filetime:~8,2!-!filetime:~10,2!-!filetime:~12,2!!ext!"
REM 检查是否存在同名文件
set "i=1"
:check_next
if exist "!newname!" (
set "newname=!filetime:~0,4!-!filetime:~4,2!-!filetime:~6,2!_!filetime:~8,2!-!filetime:~10,2!-!filetime:~12,2!_!i!!ext!"
set /a i+=1
goto :check_next
)
REM 重命名文件
echo 重命名为: !newname!
ren "%%f" "!newname!"
REM 延时0.1s
ping -n 1 -w 1000 127.0.0.1 >nul
)
echo 处理完成!
pause >nul
### 回答2:
以下是一个批处理脚本,实现了将当前文件夹下所有图片和视频文件的文件名修改为对应文件的创建时间,并且如果时间重复,则在后面加上序号。同时,增加了0.1秒的延时来防止获取不到文件出现异常。
```bat
@echo off
setlocal enabledelayedexpansion
:: 设置延时时间(单位:毫秒)
set delay=100
:: 遍历当前文件夹下的所有文件
for %%A in (*) do (
:: 检查文件是否是图片或视频文件
for /F "tokens=1 delims=." %%B in ("%%~xA") do (
if /I "%%B"=="jpg" (
call :renameFile "%%A"
) else if /I "%%B"=="png" (
call :renameFile "%%A"
) else if /I "%%B"=="mp4" (
call :renameFile "%%A"
)
)
:: 延时0.1s
ping -n 1 -w %delay% 127.0.0.1 >nul
)
goto :eof
:renameFile
:: 获取文件的创建时间
for %%C in ("%~1") do set "ctime=%%~tC"
:: 判断文件的创建时间是否已经存在
if defined name_!ctime! (
:: 获取已存在的序号
set /a count=!name_!ctime!+1
:: 修改文件名
ren "%~1" "!ctime!_!count!_%%~nx1"
:: 更新已存在的序号
set "name_!ctime!=!count!"
) else (
:: 修改文件名
ren "%~1" "!ctime!_%%~nx1"
:: 记录文件的创建时间和序号
set "name_!ctime!=0"
)
goto :eof
```
该脚本遍历文件夹下的所有文件,并以嵌套循环的方式筛选出图片和视频文件。然后,通过获取文件的创建时间来作为新的文件名。如果创建时间重复,就在后面加上序号。在重命名文件之前,增加了0.1秒的延时来防止获取不到文件或者存在其他异常。
注意:将该脚本保存为后缀为`.bat`的文件,并将其放置在需要修改文件名的文件夹中。运行脚本后,会按照上述规则修改文件名。
### 回答3:
以下是一个实现上述要求的bat脚本:
```batch
@echo off
setlocal enabledelayedexpansion
:: 设置延时
ping -n 1 -w 100 > nul
:: 获取当前时间
for /f "tokens=2 delims==" %%a in ('wmic os get LocalDateTime /format:list') do set "datetime=%%a"
set "datetime=%datetime:~0,14%"
:: 遍历当前文件夹下的所有文件
for /r %%i in (*) do (
:: 判断文件是否为图片或视频文件
set "ext=%%~xi"
if "!ext:~1!"=="jpg" goto rename
if "!ext:~1!"=="png" goto rename
if "!ext:~1!"=="bmp" goto rename
if "!ext:~1!"=="gif" goto rename
if "!ext:~1!"=="jpeg" goto rename
if "!ext:~1!"=="mp4" goto rename
if "!ext:~1!"=="mov" goto rename
if "!ext:~1!"=="avi" goto rename
goto next
:: 重命名文件
:rename
:: 获取文件创建时间
for %%j in ("%%i") do set "createdtime=%%~tj"
set "createdtime=%createdtime:~0,14%"
:: 判断创建时间是否与当前时间重复
if exist "!createdtime: =_!%%~ni!ext!" (
set "counter=1"
:loop
set /a "counter+=1"
if exist "!createdtime: =_!%%~ni!_!counter!%%~xi" goto loop
set "newname=!createdtime: =_!%%~ni!_!counter!%%~xi"
) else (
set "newname=!createdtime: =_!%%~ni!%%~xi"
)
:: 重命名文件
ren "%%i" "!newname!"
goto next
:next
:: 延时0.1秒
ping -n 1 -w 100 > nul
)
:: 完成后显示消息
echo 文件重命名完成!
ping -n 3 > nul
```
请将以上内容复制到一个文本文件中,并将其后缀名改为`.bat`,然后将该bat文件放置到你想要重命名文件的文件夹中。运行该bat文件后,它将按要求重命名该文件夹下的所有图片和视频文件。重命名后的文件名格式为`创建时间_文件名`,如果有多个文件在同一时间创建,则会在文件名后面加上序号。
另外,为了确保能正确获取文件的创建时间,我在每个步骤之间都添加了0.1秒的延时,并使用`ping`命令来实现。这样可以让bat脚本更加稳定,防止获取不到文件或发生异常。
阅读全文