For loop 如何处理循环批处理文件名的空间
现在my.ini.bak文件位于D:\Program Files\my.ini.bak中For loop 如何处理循环批处理文件名的空间,for-loop,batch-file,dos,space,filepath,For Loop,Batch File,Dos,Space,Filepath,现在my.ini.bak文件位于D:\Program Files\my.ini.bak中 错误:系统找不到Files\mysql\my.ini.bak文件 如何使此代码正常工作,以便将每一行从my.ini.bak复制到my.ini问题在于文件路径中的空间。我现在无法测试这一点,但相信引用路径可以解决这一问题: @echo off echo processing please wait... setlocal enabledelayedexpansion set txtfile=%~dp0mysq
错误:系统找不到Files\mysql\my.ini.bak文件
如何使此代码正常工作,以便将每一行从my.ini.bak复制到my.ini问题在于文件路径中的空间。我现在无法测试这一点,但相信引用路径可以解决这一问题:
@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%
)
下面是我测试的完整代码。为了进行测试,我在“MySQL”中添加了一个空格,并创建了一个同名文件夹
set txtfile="%~dp0mysql\my.ini.bak"
set newfile="%~dp0mysql\my.ini"
路径中的空间确实阻止FOR/F成功打开文件。您需要在文件名周围加引号,但还需要FOR/F“USEBACKQ”选项,以便将加引号的名称视为文件名而不是文本字符串 使用
“TOKENS=*”
与“DELIMS=“
保留整行“DELIMS=“
在首先剥离任何前导空格和/或制表符后保留行的剩余部分“TOKENS=*”
“DELIMS=“
”,除非我有理由去掉前导空格
如果.INI文件可能包含代码>字符,然后您将希望在循环中打开和关闭延迟扩展。%%a的值如果包含,将被损坏代码>和延迟扩展已启用
将整个FOR循环包含在另一组参数中,并将输出重定向一次,而不是每次迭代重定向一次,这样更有效。如果文件已经存在,则无需先删除该文件
@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%
)
我不认为您需要引用路径,您可以在扩展路径中使用短名称。因此,请使用%%dps而不是%%dp
@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
)
)
顺便说一句,我从您的原始代码中得到的错误与您的错误略有不同,不确定原因
@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%
)
为什么不使用copy
、xcopy
或robocopy
?实际上,我正在对文本文件进行一些更改,这些更改在这里没有简单描述。实际上,我已经尝试过了,但它没有处理从my.ini.bak到my.ini的每一行。。。它将my.ini.bak文件的完整路径复制到my.ini中。我刚刚尝试过。在我的Windows7机器上运行良好。我在上面发布了我的版本。这在禁用短名称的卷上不起作用。此外,它也不起作用,因为您无法始终预测短文件名将是什么。
The system cannot find the file C:\Program.