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

Batch file 忽略批处理文件中的百分比登录,batch-file,escaping,Batch File,Escaping,我有一个批处理文件,可以将文件从一个文件夹移动到另一个文件夹。批处理文件由另一个进程生成 我需要移动的某些文件中包含字符串“%20”: 此操作失败,因为它尝试查找具有以下名称的文件: \\myserver\myfolder\file0name.txt 有没有办法忽略%?我无法更改生成的文件以转义,例如通过加倍百分号(%%),使用/或^(插入符号)转义等。您应该能够使用插入符号(^) 编者按:链接现在已经死了;无论哪种方式:都是%本身转义%,但仅在批处理文件中转义,而不是在命令提示下转义^从不转

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

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

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

\\myserver\myfolder\file0name.txt

有没有办法忽略
%
?我无法更改生成的文件以转义,例如通过加倍百分号(
%%
),使用
/
^
(插入符号)转义等。

您应该能够使用插入符号(^)

编者按:链接现在已经死了;无论哪种方式:都是
%
本身转义
%
,但仅在批处理文件中转义,而不是在命令提示下转义
^
从不转义
%
,但在命令提示下,它可以间接用于防止变量扩展,仅在不带引号的字符串中使用


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

替换,百分比符号可以使用双百分号(%%)进行“转义”。
这样,命令行中将使用一个百分号。在本例中,您需要从使用
%%
。通常情况下,使用插入符号可以工作,但是对于
%
符号,您需要加倍

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

要实现您的需求:

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

我希望这有帮助

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

希望这能奏效

这个问题的标题非常通用,这不可避免地吸引了许多寻找通用解决方案的读者。
相比之下,OP的问题是异国情调的:需要处理自动生成的批处理文件,该文件格式错误且无法修改:
%
符号未正确转义。
该方法为特定的和奇异的问题提供了一个聪明的解决方案,但必然会造成与一般问题相关的混淆

如果我们把注意力集中在一般问题上:

如何在批处理文件/命令行中将
%
用作文本字符?
  • 在批处理文件中,始终以
    %%
    的形式转义
    %%
    ,无论是否以不带引号的字符串转义;例如,以下内容产生的
    My%USERNAME%是jdoe

      echo My %%USERNAME%% is %USERNAME%
      echo "My %%USERNAME%% is %USERNAME%"
    
  • 在命令行上(以交互方式),以及在使用脚本语言的shell调用函数时的行为与批处理文件中的行为有根本的不同:技术上,
    %
    无法在那里转义
    ,并且没有一种解决方法在所有情况下都有效

    • 在不带引号的字符串中,您可以使用
      ^
      名称中断器”技巧
      :为简单起见,在每个
      %
      字符
      之前放置一个
      ^
      ,但请注意,从技术上讲,您并不是以这种方式转义
      %
      (详见下文);e、 例如,下面再次生成类似于
      My%USERNAME%is jdoe

       echo My ^%USERNAME^% is %USERNAME%
      
    • 在双引号字符串中,您根本无法转义
      %
      ,但有解决方法:

      • 您可以如上所述使用不带引号的字符串,这需要您另外转义所有其他shell元字符,这很麻烦;这些元字符是:
        &<>“

      • 或者,如果目标程序支持它(应使用大多数二进制可执行文件,但不能使用批处理文件),则可以表示
        %
        字符。如
        “%”
        ;例如:

         echo "My "%"USERNAME"%" is %USERNAME%"
        
    • 通过脚本语言,如果您知道自己在调用二进制可执行文件,您可以通过放弃shell调用函数而使用“无shell”变体来避免整个问题,例如


可选背景信息重新命令行(交互式)使用: 感谢他在这一部分的帮助

在命令行上(以交互方式),
%
在技术上完全不能转义
;虽然
^
通常是
cmd.exe
的转义字符,但它不适用于
%

如前所述,双引号字符串没有解决方案,但无引号字符串有解决方法:

之所以“
^
名称破坏者”伎俩(类似于
^%USERNAME^%
)有效
是因为:

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

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

从技术上讲,变量名中的一个
^
,只要它不在另一个
^
旁边,就足够了,因此
%USERNAME^%
,f
 echo "My "%"USERNAME"%" is %USERNAME%"
move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
@echo off

set "per=%%"
call generated_file.bat %%per%%1 %%per%%2 %%per%%3 %%per%%4
arg1="%1"
arg2="%2"
...
for %Q in ("%") do echo "file%~Q20name.txt"
for /F %Q in ("%") do echo "file%Q20name.txt"