我正在尝试编写执行以下操作的批处理脚本:
将文件夹拖放到批处理脚本时,它将处理该文件夹中的每个文件。
我遇到某些包含感叹号的文件名的问题。例如:
!.txt
或!!!.txt
现在,我只是想重命名文件以演示该问题:
@echo off
SetLocal EnableDelayedExpansion
set folder=%~1
set count=0
for /r "%folder%" %%G in (*) do (
set fullpath=%%G
set fileExtension=%%~xG
call :processFile
)
goto end
:processFile
echo "fullpath = %fullpath%"
echo "fileExtension = %fileExtension%"
rename "%fullpath%" "temporary_filename_500%fileExtension%"
set /a count+=1
echo.
goto :eof
:end
echo "%count% files processed."
pause
出现错误“系统找不到指定的文件”。但是,如果我将文件名更改为诸如“ test.webm”之类的简单文件,它将起作用,如何使脚本更健壮?
答案 0 :(得分:1)
我看不到您正在使用某个延迟扩展的地方。因此,可以在批处理文件的开头使用setlocal DisableDelayedExpansion
禁用它,也可以通过删除setlocal EnableDelayedExpansion
行来删除它。
但是,如果要保留它,请执行以下操作:
@echo off
SetLocal EnableDelayedExpansion
rem Code above (^^) if exists.
Setlocal DisableDelayedExpansion
set "folder=%~1"
set "count=0"
for /R "%folder%" %%G in (*) do (
set "fullpath=%%~fG"
set "fileExtension=%%~xG"
call :processFile
)
goto end
:processFile
echo "fullpath = %fullpath%"
echo "fileExtension = %fileExtension%"
ren "%fullpath%" "temporary_filename_500%fileExtension%"
set /a "count+=1"
echo/
goto :eof
:end
echo "%count% files processed."
pause
setlocal EnableDelayedExpansion
rem Your code below with active delayed expansion:
请注意:
set
命令中引用变量名和值,例如set "var=value"
,在set /a
中引用变量名和值,例如set /a "var+=1"
等。有关更多信息,请参见set /?
。for
循环中确定文件/文件夹的完整路径,请使用f
修饰符,例如%%~fG
。echo.
;使用echo/
进行更好的练习。另请参阅this的第5阶段(延迟扩展)答案,以了解批处理文件的解释方式。