如何在Batch For循环中处理Filename的空间

Was*_* A. 2 for-loop space dos batch-file filepath

@echo off
echo processing please wait...
setlocal enabledelayedexpansion
set txtfile=%~dp0mysql\my.ini.bak
set newfile=%~dp0mysql\my.ini
if exist "%newfile%" del /f /q "%newfile%"
for /f "tokens=*" %%a in (%txtfile%) do (
   set newline=%%a
   echo !newline! >> %newfile%
)
Run Code Online (Sandbox Code Playgroud)

现在my.ini.bak文件位于D:\ Program Files\my.ini.bak
错误:系统找不到文件Files\mysql\my.ini.bak.

如何使这段代码工作,所以它将my.ini.bak中的每一行复制到my.ini

dbe*_*ham 8

路径中的空间确实阻止FOR/F成功打开文件.您需要围绕文件名引用,但是您还需要FOR/F"USEBACKQ"选项,以便将引用的名称视为文件名而不是文本字符串.

使用"TOKENS=*"几乎,但不完全相同"DELIMS="

  • "DELIMS=" 保留整条线

  • "TOKENS=*" 在首先剥离任何前导空格和/或制表符后保留该行的其余部分

"DELIMS="除非我有理由剥离领先的空间,否则我通常更喜欢.

如果.INI文件有可能包含!字符,那么您将需要在循环内打开和关闭延迟扩展.%%a如果包含!并且启用了延迟扩展,则该值将被破坏.

将整个FOR循环包含在另一组parens中并将输出重定向一次而不是每次迭代一次更有效.它还消除了首先删除文件(如果已存在)的需要.

@echo off
echo processing please wait...
setlocal disableDelayedExpansion
set "txtfile=%~dp0mysql\my.ini.bak"
set "newfile=%~dp0mysql\my.ini"
>"%newfile%" (
  for /f "usebackq delims=" %%a in ("%txtfile%") do (
    set newline=%%a
    setlocal enableDelayedExpansion
    rem Presumably more processing goes here
    echo !newline!
    endlocal
  )
)
Run Code Online (Sandbox Code Playgroud)