代码之家  ›  专栏  ›  技术社区  ›  Stagg

忽略批处理文件中的百分比登录

  •  28
  • Stagg  · 技术社区  · 16 年前

    我有一个批处理文件,可以将文件从一个文件夹移动到另一个文件夹。批处理文件由另一个进程生成。

    我需要移动的某些文件中包含字符串“%20”:

    move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
    

    此操作失败,因为它尝试查找具有以下名称的文件:

    \\myserver\myfolder\file0name.txt
    

    % ? 我无法更改生成的文件以逃避此操作,例如将百分比符号加倍( %% ),带着 / 或 ^ (插入符号)等。

    5 回复  |  直到 11 年前
        1
  •  -2
  •   mklement0    8 年前

    to escape a percent sign

    编者按:链接现在已经死了;不管怎样,都是这样 % % ,但仅在批处理文件中,而不是在命令提示下; ^ 逃脱 % 间接地 要防止变量扩展,请在 非上市 仅限字符串。

    原因 %2 正在消失的是批处理文件正在替换传入的第二个参数,而您的文件似乎没有第二个参数。解决这个问题的一种方法是实际尝试 foo.bat ^%1 ^%2... 在命令中遇到,它实际上被一个文本替换 .

        2
  •  57
  •   mklement0    11 年前

    你需要使用 %% ^ (插入符号)如果没有 %

    %%1 或 %%i 或 echo.%%~dp1 % ; %variable% )

    要实现您的需求:

    move /y "\\myserver\myfolder\file%%20name.txt" "\\myserver\otherfolder"
    

        3
  •  23
  •   mklement0    5 年前

    这个问题的题目很简单 通用的
    相比之下 :需要处理格式错误的自动生成的批处理文件 : % 标志没有在里面正确地漏掉。
    这个 accepted answer 具体的 通用的 问题。

    如果我们 通用的 问题 :

    你如何使用 字面意义的 批处理文件/命令行中的字符?

    • 内 ,总是逃避 % 作为 %% My %USERNAME% is jdoe

        echo My %%USERNAME%% is %USERNAME%
        echo "My %%USERNAME%% is %USERNAME%"
      
    • 上 命令行 (以交互方式)-以及在使用 属于 脚本语言 - 基本行为 不同 从批处理文件的内部 :技术上, % 在那里逃不掉 单一的 情况 :

      • 非上市 串 ,你可以使用 " ^ “名字破坏者”把戏 放置 ^ 每 % ,但请注意,从技术上讲,您并不是 逃逸 % :

         echo My ^%USERNAME^% is %USERNAME%
        
      • 在里面 不能 逃跑 变通办法

        • 你可以用 非上市 另外 ^ -避开所有其他shell元字符,这很麻烦;这些元字符是: <space> & | < > "

        • 如果 ( 二元的 可执行文件 ),你可以 代表 % "%" ; 例如。:

           echo "My "%"USERNAME"%" is %USERNAME%"
          
      • 从…起 脚本语言 呼叫 二元的 ,你可以 壳 -调用有利于“无外壳”变体的函数 using execFileSync instead of execSync in Node.js.


    可选背景信息 命令行 (交互式)使用:

    jeb 感谢他在这方面的帮助。

    命令行 (以交互方式), 技术上可以 根本逃不掉 通常地 cmd.exe 是的,是的 不 % .

    如前所述,有 字符串,但有 变通办法 串:

    原因是" 名称破坏者“把戏(类似于 ^%USERNAME^% )工作 是:

    • 变量名 ; 也就是说,在上面的例子中 查找名为的变量 USERNAME^ ,这(希望)是不存在的。

    • 在命令行上-与批处理文件中不同-引用 变量是 保留原样 .

    单一的 ^ ^ -足够,以便 %USERNAME^% 例如,就足够了,但是 ^ % ,因为它也适用于以下情况: up 20^% 有条不紊 ,而不必考虑输入字符串的细节。

    ^ 在 开放 ,虽然不是必需的,但是良性的,因为 可以 不管你逃不逃。净效果是这样的 ^ 从…起 非上市 串。

    : (见评论中jeb的例子);如果您的变量名 ^ ,只需放置“破坏性” ^ 在某处 在变量名中,只要它不直接挨着另一个 (因为那样会导致
    也就是说,在(不太可能)事件中,您的变量的名称如下 ^b^ ,你运气不好。

        4
  •  14
  •   greg    15 年前

    在批处理文件中,可以使用双百分号(%)对百分号进行“转义”。 这样,命令行中将使用一个百分号。从…起 http://www.robvanderwoude.com/escapechars.php

        5
  •  1
  •   dvatreknerd314    11 年前

    我想我已经找到了部分解决方案。如果您只希望传输名称中包含“%20”字符串的文件,而不希望传输更广泛的解决方案,则可以使用%%2作为第二个参数调用第一个批处理文件。这样,当程序在文本名中命中%2时尝试获取第二个参数时,它将用转义的%2替换%2,而文件名保持不变。

    希望这能奏效!

        6
  •  1
  •   jeb    5 年前

    如何在批处理文件中“转义”而不修改文件**

    move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
    

    这可以通过使用适当的参数调用脚本来部分解决( %1 , %2 , ...)

    @echo off
    
    set "per=%%"
    call generated_file.bat %%per%%1 %%per%%2 %%per%%3 %%per%%4
    

    arg1="%1"
    arg2="%2"
    ...
    

    如何在命令行上添加文字百分比符号

    mklement0 describes the problem

    但和往常一样,它可以用一个小技巧解决。

    for %Q in ("%") do echo "file%~Q20name.txt"
    

    %Q "%" 和 %~Q 仅扩展到 % ,独立于引号。

    %~

    for /F %Q in ("%") do echo "file%Q20name.txt"
    
    推荐文章