【问题标题】:For loop to parse files with spaces in path, Command PromptFor循环解析路径中带有空格的文件,命令提示符
【发布时间】:2015-10-08 22:07:16
【问题描述】:

有一个 Windows 命令提示行:

for /F %i in ('dir /s /b D:\MyDirectory\filepath\File.xml') do (C:\progra~1\xmlstarlet\xml.exe ed --inplace -d "//xmlTag[data/url[contains(text(),'shop.companyname')]]" %i)

100 多个目录中的一个在路径中有空格,并且该行在该目录上失败。必须保留名称。

尝试将delims 选项更改为^n,但在多个目录上都失败了。

也试过%~dp0但不理解语法,还有"%~dp0\File.xml",这让我“找不到指定的文件”。

如何让 Windows 用空格解析该行?有delims=[not space?] 选项吗?

【问题讨论】:

  • 宁愿不搜索和替换空格,除非这是唯一的方法。

标签: batch-file for-loop xmlstarlet


【解决方案1】:

要扫描for loop 中带有dir 的文件夹,您必须使用"delims=",因为默认的delimsspace

for /f "delims=" %i in ('dir /s /b "D:\MyDirectory\filepath\*.xml"') do @( echo "%~i" )

我更新了示例,%i 现在用双引号括起来。因此,您的外部软件将被视为单个参数

如@aschipfl 所述,您可以更改为"%~i"。请参阅 call /?for /? - 示例更新

【讨论】:

  • 加载实体同样失败。 :(
  • for /F "delims=" %i in ('dir /s /b "D:\MyDirectory\filepath\File.xml"') do (C:\progra~1\xmlstarlet\xml.exe ed --inplace -d "//xmlTag[data/url[contains(text(),'shop.companyname')]]" %i) 的结果相同。
  • @motorbaby:我会说“%i”左右
  • 消息是“加载外部实体失败”。下面的解决方案使用令牌而不是 delims 和 "%i %j"
  • do 之后,使用for 变量,如"%~i" -- ~ 会从值中删除任何周围的引号,然后引号被明确地包围,所以结果是 始终 引号内的值;因此接收该值的命令不再将其视为多个参数,以防值中有空格...
【解决方案2】:

除了delims= 之外,还有tokens= 可以用来限制返回的令牌数量。尝试将其设置为1,*。这将为您提供%i 用于第一个空格之前的所有内容,并为您提供%j 用于第一个空格后面的所有内容。

然后,在do 部分,合并%i %j

例子:

for /F "tokens=1,*" %i in ('set') DO @echo %i %j

【讨论】:

  • 仍然无法为一个文件加载外部实体。使用for /F "tokens=1,*" %i in ('dir /s /b D:\MyDirectory\filepath\File.xml') do (C:\progra~1\xmlstarlet\xml.exe ed --inplace -d "//xmlTag[data/url[contains(text(),'shop.companyname')]]" %i %j)
  • @motorbaby:在您的情况下,请在 "%i %j" 周围加上引号,因为它可能必须是 xml.exe 的单个参数
  • 成功了!谢谢@托马斯!!!! [thumbsup] 解决方案:for /F "tokens=1,*" %i in ('dir /s /b D:\MyDirectory\filepath\File.xml') do (C:\progra~1\xmlstarlet\xml.exe ed --inplace -d "//xmlTag[data/url[contains(text(),'shop.companyname')]]" "%i %j")
  • @motorbaby:请在do 部分使用"%i" 尝试Paul 的解决方案。如果这样有效,那就更清洁了。
【解决方案3】:

实现此目的的另一种方法是告诉 FOR 整行、空格和所有内容都进入 %i 变量。

FOR /F "usebackq tokens=*" %i in (`DIR /S /B *.xml`) do (ECHO "%~i")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2020-01-23
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多