Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 如何处理循环批处理文件名的空间_For Loop_Batch File_Dos_Space_Filepath - Fatal编程技术网

For loop 如何处理循环批处理文件名的空间

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

现在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=%~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.