2012-08-09 45 views
17

我想运行批处理脚本,它需要一个参数(路径)逃生批输入内部“双引号”参数

runas /user:abc "icacls %1 /grant Everyone:(F) /T" 

以下,但参数%1已经包含了"(因为它是一个路径,通过上下文菜单的Send To传递 - 我没有太多的控制权)。 所以当命令在批处理脚本运行它运行这样的:

runas /user:abc "icacls "c:\folder" /grant Everyone:(F) /T" 

所以,很显然,我需要逃避%1创建的"秒。如何通过%1执行字符串处理以避免引号?

回答

20

你应该能够使用\"Here是与其他一些转义字符的网站,你可能会发现有用

要执行字符串替换:

set temp=%1 
set temp=%temp:"=\"% 
echo %temp% 
+0

我已经编辑了更清晰的问题 – laggingreflex 2012-08-09 23:33:54

+5

如果%1是一个包含空格的路径,该怎么办? – 2014-05-14 14:59:18

+0

你什么时候在''''上面使用'''''我发现真正的批处理文件只能用'''''转义,而'\''版本只适用于非批处理程序('runas'用C++编写或者识别\作为转义字符的语言)。所以,当传递变量到非批处理程序时,我们只使用'\“',当传递给其他批处理脚本(或批处理函数(例如'CALL:function”parameterWith“”EscapedQuote“'))时,我们只使用'\”' – 2014-11-19 17:16:08

1
SET myPath=%1 
SET myPath=%myPath:"=\"% 
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T" 

编辑 - 变量名称从path更改为myPath。 PATH是一个保留的系统变量,不应该用于除了它所设想的目的之外的其他任何内容。

+2

不要使用“路径”作为你的变量 - 它被保留在Windows中的特殊用途。修改该值可能会在稍后的脚本中导致问题。将变量名称从“路径”更改为其他内容,也许是“mypath”。编辑你的答案,然后我可以投票。 – dbenham 2012-08-10 00:10:24

0

在这种情况下甚至不需要搜索/替换。只需从您的论点中删除原始引号(使用%~1) - 然后您可以再次添加任何您想要的内容,例如逃脱的报价。在您的例子:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 
5

每个响应覆盖了部分答案。用反斜杠&报价将它们结合起来:\"你:

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T" 

,或者您可以加倍(双)援引逃脱他们:

runas /user:abc "icacls ""%~1"" /grant Everyone:(F) /T" 

作为一个侧面说明^为逃避偶尔有用特殊字符如<,|,>,||,&&&对于e xample:

echo ^| 

但这是非常罕见的。

+0

加倍的双引号对我来说不起作用,但反斜杠的确如此。 – SerG 2015-05-18 13:32:14