24

我想在批处理脚本中运行以下命令,它需要一个参数(路径)

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

但是参数%1已经包含一个" (因为它是一个路径,由上下文菜单的发送到传递 - 我对此没有太多控制权)。因此,当命令在批处理脚本中运行时,它会像这样运行:

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

所以很明显我需要逃避"s 创建的%1. 如何执行字符串操作%1以使其转义引号?

4

5 回答 5

25

您应该可以使用\" Here is a site with some other escape characters that you might find有用

要执行字符串替换:

set temp=%1
set temp=%temp:"=\"%
echo %temp%
于 2012-08-09T23:15:10.577 回答
6

每个响应都涵盖了部分答案。使用反斜杠和引号将它们组合起来:\"你会得到:

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

或者你可以加倍(双)引号来转义它们:

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

作为旁注^有时可用于转义特殊字符,例如<, |, >, ||,&&&例如:

echo ^|

但这非常罕见。

于 2014-03-05T04:02:41.143 回答
2
SET myPath=%1
SET myPath=%myPath:"=\"%
runas /user:abc "icacls %myPath% /grant Everyone:(F) /T"

编辑 - 变量名称从 更改pathmyPath。PATH 是一个保留的系统变量,不应将其用于其他用途。

于 2012-08-09T23:56:58.413 回答
0

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

runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T"
于 2012-08-12T07:02:19.677 回答
0

经过一些快速测试,这是最好的方法,因为它:

上行空间

  • 处理来自任务列表的多个结果输出
  • 如果需要,处理带有空格的应用程序名称
  • 可以轻松更改为区分大小写/不区分大小写

缺点

  • 调用多个在技术上较慢的命令

代码

@echo off    
set "EXE=authy desktop.exe"
tasklist /NH /FI "imagename eq %EXE%" | find /i "%EXE%" >nul 2>&1
If %errorlevel% EQU 0 (
    echo %EXE% Is Running
) ELSE (
    echo %EXE% is Not Running
)

进一步考虑

您可以更改为 && ( ) || ( ) 格式化而不是检查错误级别。如果通过引用!errorlevel! 多次使用errorlevel,你也可以使用'setlocal enabledelayedexpansion'。

tasklist /NH /FI "imagename eq %EXE%" | find /i "%EXE%" >nul 2>&1 && (
    echo %EXE% Is Running
) || (
    echo %EXE% is Not Running
)
于 2021-08-21T19:37:51.880 回答