Windows 10 runas转义

时间:2016-02-14 10:47:16

标签: cmd escaping windows-10 runas

这更多是理论构造,或者是一个有趣的问题,而不是现实世界的场景 - 在这种情况下,我会使用批处理文件来防止出现问题。

  1. 假设我们想以某种方式在Windows 10上运行runas:

    runas /user:John "cmd.exe /k echo %path%"
    

    这不起作用,因为%path%已展开,我们收到错误:

    尝试启动cmd.exe / k echo C:\ Program Files(x ...   ...   RUNAS错误:无法运行 - cmd.exe / k ech ...   ...   1734:数组边界无效。

    有可能解决这个问题吗?即如何逃脱%? 如果我们尝试

    runas /user:John "cmd.exe /k echo ^%path^%"
    

    新shell窗口中的输出只是

    %path%
    

    这不是我们想要的(我们希望将PATH变量的值打印到控制台)。

  2. 假设我们想要其他一些东西,我们需要使用“在我们的命令中:

    runas /user:John "cmd.exe /k dir c:\Program Files"
    

    这不起作用 - 显然是因为Program和Files之间的空间,出现的新shell窗口两次显示“File Not Found”。

    人们会期望解决方案是

    runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
    

    但这不起作用(runas打印使用帮助)。问题是为什么?

    这里的真正解决方案是使用\"

    runas /user:John "cmd.exe /k dir \"c:\Program Files\""
    

    这种转义可以在runas用法帮助示例部分中看到。但这不是逃避报价的常用方法,是吗?这里的问题 - 为什么^"不起作用?

1 个答案:

答案 0 :(得分:2)

我们有三个实体:

  • 外部cmd外壳,您在其中键入runas ...
  • runas.exe,获得了信用,开始了一个新的过程,等等。
  • 内部cmd shell,这是runas被告知执行
  • 的内容

键入runas ... "cmd.exe /k echo %path%"

  • 外壳看到%path%并展开它
  • runas接受扩展命令,以参数
  • 启动内部shell
  • 内壳回声它看到了什么

键入runas ... "cmd.exe /k echo ^%path^%"

  • 外壳在引号中看到^%path^% ,并将插入符号解释为转义百分号,因此它不会展开path 并离开插入符号
  • runas将命令视为cmd.exe /k echo %^path^%
  • 运行
  • 内壳看到echo ^%path^%,您会在新窗口中看到%path%

因此,当插入符号在引号内时,它们会被保留。但是如果没有使用引号,runas不会起作用 - 该命令必须被视为单个参数。怎么办?

一种方法是使用批处理文件,就像你说的那样。

另一种是使用不同的环境变量:

set aa=echo ^%path^%
runas /user:rpres "cmd.exe /k %aa%"
  • 外壳在set命令中看到插入符号不在引号中,并生成值为echo %path%的变量
  • 外壳看到要在runas线上展开的变量,并展开它。一旦。内部%path%未展开
  • runas将命令视为cmd.exe /k echo %path%并将runas视为
  • 内壳看到echo %path%。它扩展了道路。您会在新窗口中看到展开的路径。

最后一种方法是在转出插入符号之前先删除引号:runas.exe ... "cmd.exe /k echo "^%path^% 但重要的是,没有空格不在引号中!

  • 外壳在runas行上看到插入符号不在引号中,并在删除插入符号时转义百分号。
  • runas将命令视为cmd.exe /k echo %path%并将runas视为
  • 内壳看到echo %path%。它扩展了道路。您会在新窗口中看到展开的路径。

请注意,您可以"返回报价"在完成逃脱的百分比之后。例如runas /user:rpres "cmd.exe /k echo here is my path :::"^%path^%":::"将显示here is my path,后跟三个冒号中包含的路径。