我环顾四周,却找不到任何东西可以使我的脚本在文件路径或文件名中使用特殊字符(例如!;^)正常工作。

我的脚本可以工作,但前提是上述字符不在任何扫描的文件夹或文件名中。如果任何文件夹或文件具有这些字符,则脚本会崩溃。我需要帮助弄清楚如何使我的脚本在路径或文件名内使用特殊字符(如上)工作。这是我的脚本:

set srcdir=%~dp0%src

set desdir=%~dp0%des

setlocal EnableDelayedExpansion
for /r "%srcdir%" %%f in ("*.txt") do (
    set "subdir=%%~f"
    set "subdir=!subdir:%srcdir%=%desdir%!"
    echo !subdir!
    pause
)
endlocal


感谢您的协助!

最佳答案

在设置变量时启用延迟扩展时,感叹号会变得混乱。您可以通过等待延迟扩展直到检索变量值来避免这种情况。有时,这需要一些技巧才能使它起作用。在这种情况下,仅禁用延迟扩展并使用call延迟扩展可能会更容易。



@echo off
setlocal

set "srcdir=%~dp0%src"
set "desdir=%~dp0%des"

for /r "%srcdir%" %%f in ("*.txt") do (
    set "subdir=%%~f"

    rem // use call to avoid delayed expansion and preserve exclamation marks
    call set "subdir=%%subdir:%srcdir%=%desdir%%%"

    rem // use set /p rather than echo to exploit quotation marks and preserve carets
    call set /P "=%%subdir%%"<NUL & echo;
    pause
)


或者,如果您更喜欢延迟扩展,那么我想用来切换延迟扩展为一行的一个技巧是使用for循环,如下所示:

@echo off
setlocal

set "srcdir=%~dp0%src"
set "desdir=%~dp0%des"

for /r "%srcdir%" %%f in ("*.txt") do (
    set "subdir=%%~f"
    setlocal enabledelayedexpansion
    for %%I in ("!subdir:%srcdir%=%desdir%!") do endlocal & set "subdir=%%~I" & echo(%%~I
    pause
)

07-24 16:55