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