2
@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%
)

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

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

4

3 回答 3

8

路径中的空格确实阻止了 FOR /F 成功打开文件。您需要在文件名周围加上引号,但您还需要 FOR /F "USEBACKQ" 选项,以便将带引号的名称视为文件名而不是文本字符串。

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

  • "DELIMS="保留整行

  • "TOKENS=*"在第一次去除任何前导空格和/或制表符后保留该行的其余部分

"DELIMS="除非我有理由去掉前导空格,否则我通常更喜欢。

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

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

@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
  )
)
于 2012-09-19T02:35:34.187 回答
2

我认为您不需要引用路径,您可以在扩展路径中使用短名称。所以使用 %~dps 而不是 %~dp

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

顺便说一句,我用你的原始代码得到的错误与你的错误略有不同,不知道为什么。

The system cannot find the file C:\Program.
于 2012-09-19T15:54:22.037 回答
0

问题是文件路径中的空间。我现在无法对此进行测试,但相信引用路径会解决它:

set txtfile="%~dp0mysql\my.ini.bak"
set newfile="%~dp0mysql\my.ini"

这是我测试的完整代码。为了测试,我在“my sql”中添加了一个空格,并以此名称创建了一个文件夹。

@echo off
echo processing please wait...
setlocal enabledelayedexpansion
set txtfile="%~dp0my sql\my.ini.bak"
echo %txtfile%
set newfile="%~dp0my sql\my.ini"
echo %newfile%
if exist "%newfile%" del /f /q "%newfile%"
for /f "tokens=*" %%a in (%txtfile%) do (
   set newline=%%a
   echo !newline! >> %newfile%
)
于 2012-09-19T02:06:58.410 回答