使用批处理延迟扩展在路径中带有特殊字符(感叹号!,胡萝卜^等)的问题

Nat*_*yko 5 variables cmd path batch-file substitution

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

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

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
Run Code Online (Sandbox Code Playgroud)

感谢您的协助!

roj*_*ojo 3

当您设置变量时启用延迟扩展时,感叹号会被破坏。您可以通过等待延迟扩展直到检索变量值来避免这种情况。有时这需要一些杂技才能使其发挥作用。在这种情况下,禁用延迟扩展并使用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
)
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢延迟扩展,我喜欢用来切换一行的延迟扩展的一个技巧是使用如下循环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
)
Run Code Online (Sandbox Code Playgroud)