为了账号安全,请及时绑定邮箱和手机立即绑定

忽略批处理文件中的百分号

/ 猿问

忽略批处理文件中的百分号

隔江千里 2019-07-30 17:36:48

忽略批处理文件中的百分号

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

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

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

这会失败,因为它试图找到一个名称为的文件:

\\myserver\myfolder\file0name.txt

有什么办法可以忽略%吗?我无法改变生成的文件以逃避这种情况,例如加倍百分号(%%),逃避/^(插入符号)等。


查看完整描述

3 回答

?
湖上湖

 无论哪种方式:它%本身就是逃逸%,但只在批处理文件中,而不是在命令提示符下; ^ 永远不会逃脱%,但在命令提示符下,它可以间接地用于防止变量扩展,仅用于不带引号的字符串。

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


查看完整回答
反对 回复 2019-07-30
?
森栏

%%在这种情况下你需要使用。通常使用^(插入符号)会起作用,但是对于%需要加倍的符号。

%%1or %%i或的情况下echo.%%~dp1,因为%指示来自命令或变量的输入(当用%; 包围时%variable%

为了达到你的需求:

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

我希望这有帮助!


查看完整回答
反对 回复 2019-07-30
?
呼啦一阵风

问题的标题非常通用,这不可避免地吸引了许多寻求通用解决方案的读者。
相比之下,OP的问题是奇特的:需要处理自动生成的批处理文件,该文件格式错误且无法修改%标记未正确转义。
接受的答案提供了一个巧妙的解决特定的 -和异国情调的-问题,但势必会关于制造混乱通用的问题。

如果我们关注通用问题

如何在批处理文件/命令行中%用作文字字符?

  • 批处理文件%%%,无论是否在未加引号的字符串中,始终以转义 ; 以下产量My %USERNAME% is jdoe,例如:

    echo My %%USERNAME%% is %USERNAME%echo "My %%USERNAME%% is %USERNAME%"
  • 命令行上(交互式) - 以及使用脚本语言shell调用函数 - 行为从根本上不同于批处理文件内部:从技术上讲,% 不能在那里进行转义,并且没有单一的解决方法适用于所有情况

    • 您可以使用上面提到的不带引号的字符串,然后需要您额外地 ^覆盖所有其他shell元字符,这很麻烦; 这些元字符是:<space> & | < > "

    • 或者,如果目标程序支持它应该使用大多数二进制可执行文件,而不是批处理文件),则可以表示%字符。作为"%" ; 例如:

      echo "My "%"USERNAME"%" is %USERNAME%"
    • 在不带引号的字符串中,您可以使用“ ^名称 - 破坏者”技巧:为简单起见,在每个字符之前放置一个字符^%,但请注意,即使您在技术上没有以这种方式转义 %(请参阅下面的详细信息); 例如,以下再次产生如下My %USERNAME% is jdoe

      echo My ^%USERNAME^% is %USERNAME%
    • 双引号字符串,你无法逃避%的一切,但也有变通方法

    • 脚本语言,如果你知道你正在调用二进制可执行文件,你可以通过放弃shell -invoking函数来支持“无shell”变体,例如使用而不是在Node中避免整个问题。 JS。execFileSyncexecSync


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

对本节提供帮助的jeb帽子的提示。

命令行上(交互式地),%技术上根本不能被转义 ; 虽然^一般 cmd.exe的转义字符,它并没有应用到%

如前所述,有没有为解决双引号的字符串,但也有变通方法不带引号的字符串:

“ ^名称破坏者”技巧(类似的东西^%USERNAME^%)的作用是:

  • 它“扰乱” 变量名称 ; 也就是说,在上面的示例中cmd.exe查找名为的变量USERNAME^,(希望)不存在。

  • 在命令行上 - 与批处理文件不同 - 对未定义变量的引用保持原样

从技术上讲,单一 ^变量名内-内的任何地方,只要它不是旁边另一个^-就足够了,让%USERNAME^%举例来说,就足够了,但我建议采取的有条不紊放置约定^ 每前 % 为简单起见,因为它也可用于诸如up 20^%甚至不需要中断但是良性的情况,因此您可以有条不紊地应用它,而不必考虑输入字符串的细节。

^的前开放 %,而不是必需的,是良性的,因为^逃逸第二天字符时,它是否需要逃避-或者,在这种情况下,可以进行转义-与否。实际效果是这些^实例最终会从不带引号的字符串中删除

很大程度上假设的警告^实际上是变量名称中合法字符(参见评论中的jeb示例); 如果你的变量名结尾 ^,只需将“颠覆性” ^的某处其他变量名,只要它不直接旁边另一个^(因为这将导致^出现在结果字符串中)。
也就是说,在(非常不可能)事件中,你的变量有一个名字,比如^b^,你运气不好。


查看完整回答
反对 回复 2019-07-30

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信