我有一个从一个文件夹移动到另一个文件的批处理文件。 该批处理文件是由另一个过程中产生的。
一些我需要移动有字符串“%20”在他们的文件:
move /y "\\myserver\myfolder\file%20name.txt" "\\myserver\otherfolder"
这将失败,因为它试图找到与该名称的文件:
\\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"
我希望这有帮助!
问题的标题是非常通用的 ,这必然会吸引很多读者寻找一个通用的解决方案。
相比之下,OP的问题是奇特 :需要处理与被虐待形成,不能修改自动生成的批处理文件: %
体征不正确的逃跑了。
该接受的答案提供了一个巧妙的解决特定的-和异国情调的-问题,但势必会相对于通用的问题造成混乱。
如果我们专注于通用的问题 :
如何使用%
在批处理文件中为文字字符/命令行上?
里面一个批处理文件 ,总是逃避%
作为%%
,无论是在未加引号的字符串或没有; 下面的产量My %USERNAME% is jdoe
,例如:
echo My %%USERNAME%% is %USERNAME% echo "My %%USERNAME%% is %USERNAME%"
在命令行 (交互式) -以及使用脚本语言的壳调用函数时为- 行为从根本上那里面的批处理文件有所不同 :在技术上, %
不能在那里逃了出来 , 没有在所有的情况下,工作单的解决方法 :
在不带引号的字符串 ,你可以使用“ ^
名称破坏者”绝招 :为了简单起见, 放置一个^
每之前%
字符 ,但请注意,即使你不是技术上逃避 %
这样(见下文的详细); 例如,下面再产生像My %USERNAME% is jdoe
:
echo My ^%USERNAME^% is %USERNAME%
在双引号字符串,你无法逃避%
可言 ,但也有变通方法 :
您可以使用不带引号的字符串作为上面,然后要求你额外 ^
-escape其他所有shell元字符,这是麻烦的; 这些元字符是: <space> & | < > "
<space> & | < > "
或者, 如果目标程序支持它 ( 应与大多数二进制可执行文件的工作 ,但不是批处理文件 ),你可以代表%
字符。 为"%"
; 例如:
echo "My "%"USERNAME"%" is %USERNAME%"
从脚本语言 ,如果你知道你调用一个二进制可执行文件 ,您可以通过放弃壳 -invoking赞成“无壳”变种的功能 ,如以避免问题的全部 使用execFileSync
代替execSync
在Node.js的
可选的背景信息的再命令行 (交互式)使用:
在帽子的提示杰布他与该部帮助。
在命令行 (交互), %
在技术上可以根本不被转义 ; 而^
通常是cmd.exe
的转义字符,它不适用于%
。
如前所述,对于双引号字符串无解,但也有不带引号的字符串的变通办法 :
说:“之所以^
名称破坏者”招(类似^%USERNAME^%
的工作原理是:
从技术上讲, 单 ^
变量名内-内的任何地方,只要它不是旁边另一个^
-就足够了,让%USERNAME^%
举例来说,就足够了,但我建议采取的有条不紊地把公约^
每之前 %
为简单起见 ,因为它也适用于情况下,如up 20^%
其中中断甚至没有必要的,但是是良性的,这样你就可以有条不紊地应用它,而不需要考虑的细节输入字符串。
一^
一开口之前%
,而没有必要的,是良性的,因为^
逃脱第二天字符时,它是否需要逃避-或者,在这种情况下, 可以躲过-与否。 净效果是,这种^
实例最终无引号字符串中移除 。
主要假设的警告 : ^
实际上是在变量名 (见杰布在评论例)的法律性质 ; 如果您的变量名称结尾 ^
,只需将“破坏性” ^
别的地方的变量名,只要它不直接旁边另一^
(因为这将导致^
出现在结果字符串中)。
这就是说,在(不太可能)的事件,你的变量,如名称^b^
,你的运气了。
在批处理文件,百分号,可以通过使用双百分号(%%)“逃脱”。 这样一来,一个百分号将在命令行中使用。 从http://www.robvanderwoude.com/escapechars.php
我想我已经得到了部分解决方案的工作。 如果你只是希望转移有其名称中“%20”的字符串,而不是寻找一个更广泛的解决方案文件,您也可以拨打第二批处理文件调用先用%% 2作为第二个参数。 这样,当你的程序试图当它击中%2在文本名称来获取第二个参数,它将与转义%2代替%2,留下的文件名不变。
希望这个作品!