首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理批量For循环中的文件名空格

问如何处理批量For循环中的文件名空格
EN

Stack Overflow用户
提问于 2012-09-19 09:46:46
回答 3查看 12.3K关注 0票数 2
代码语言:javascript
复制
@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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-19 23:54:22

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

代码语言:javascript
复制
@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%
)

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

代码语言:javascript
复制
The system cannot find the file C:\Program.
票数 2
EN

Stack Overflow用户

发布于 2012-09-19 10:35:34

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

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

  • "DELIMS="保留整个line
  • "TOKENS=*"在第一次删除所有前导空格和/或制表符后保留行的其余部分

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

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

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

代码语言:javascript
复制
@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
  )
)
票数 8
EN

Stack Overflow用户

发布于 2012-09-19 10:06:58

问题出在文件路径中的空格。我现在不能测试这一点,但我相信引用路径可以解决它:

代码语言:javascript
复制
set txtfile="%~dp0mysql\my.ini.bak"
set newfile="%~dp0mysql\my.ini"

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

代码语言:javascript
复制
@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%
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12487491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档