@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
发布于 2012-09-19 23:54:22
我认为您不需要引用路径,只需在扩展路径中使用短名称即可。因此请使用%~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-19 10:35:34
路径中的空格确实阻止了/F成功打开文件。您需要用引号将文件名引起来,但还需要FOR /F "USEBACKQ“选项,以便将带引号的名称视为文件名,而不是文本字符串。
使用"TOKENS=*"与"DELIMS="几乎相同,但并不完全相同
"DELIMS="保留整个line"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-19 10:06:58
问题出在文件路径中的空格。我现在不能测试这一点,但我相信引用路径可以解决它:
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%
)https://stackoverflow.com/questions/12487491
复制相似问题