Windows批处理脚本“系统找不到指定的文件。”带有惊叹号的文件名?

时间:2019-03-03 06:43:04

标签: windows batch-file

我正在尝试编写执行以下操作的批处理脚本:

将文件夹拖放到批处理脚本时,它将处理该文件夹中的每个文件。

我遇到某些包含感叹号的文件名的问题。例如:

!.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”之类的简单文件,它将起作用,如何使脚本更健壮?

1 个答案:

答案 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
  • 由Mofi here提及:请勿使用echo.;使用echo/进行更好的练习。

另请参阅this的第5阶段(延迟扩展)答案,以了解批处理文件的解释方式。