代码之家  ›  专栏  ›  技术社区  ›  laggingreflex

在批的输入参数中转义“双引号”

  •  25
  • laggingreflex  · 技术社区  · 14 年前

    我想在批处理脚本中运行以下内容,其中包含一个参数(路径)

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

    但是争论 %1 已包含 " (因为这是一个路径,由上下文菜单的“发送到”传递——我对此没有太多控制权)。 因此,当命令在批处理脚本中运行时,其运行方式如下:

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

    所以很明显我需要逃离 ” s创建者 %1个 .如何在 %1个 以至于它逃脱了引用?

    5 回复  |  直到 14 年前
        1
  •  26
  •   nick    14 年前

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

    要执行字符串替换,请执行以下操作:

    set temp=%1
    set temp=%temp:"=\"%
    echo %temp%
    
        2
  •  7
  •   laggingreflex    12 年前

    每个回答都包含部分答案。使用反斜杠组合它们&引用: \" 您可以:

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

    或者您可以使用双引号来转义它们:

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

    作为旁注 ^ 偶尔用于转义特殊字符,例如 < , | , > , || , && 和 & 例如:

    echo ^|
    

    但这种情况非常罕见。

        3
  •  2
  •   dbenham    14 年前
    SET myPath=%1
    SET myPath=%myPath:"=\"%
    runas /user:abc "icacls %myPath% /grant Everyone:(F) /T"
    

    编辑-变量名称已从更改 path 到 myPath .PATH是一个保留的系统变量,不应用于除预期之外的任何其他用途。

        4
  •  0
  •   Drarakel xmechanix    14 年前

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

    runas /user:abc "icacls \"%~1\" /grant Everyone:(F) /T"
    
        5
  •  0
  •   Mike Q    5 年前

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

    好的一面

    • 处理从任务列表输出的多个结果
    • 如果需要,用空格处理应用程序名称
    • 可以很容易地更改为区分大小写/不区分大小写

    缺点

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

    密码

    @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
    )
    

    进一步考虑

    您可以将更改为&&()||()格式化而不是检查错误级别。此外,如果通过引用使用错误级别不止一次,则可以使用“setlocal enabledelayedexpansion”!错误级别!。

    tasklist /NH /FI "imagename eq %EXE%" | find /i "%EXE%" >nul 2>&1 && (
        echo %EXE% Is Running
    ) || (
        echo %EXE% is Not Running
    )