Cmd Windows 10运行方式转义

Cmd Windows 10运行方式转义,cmd,escaping,windows-10,runas,Cmd,Escaping,Windows 10,Runas,这更多的是理论上的构造,或者说是一个有趣的问题,而不是一个真实世界的场景——在这种情况下,我会使用批处理文件来防止逃避问题 假设我们希望在Windows 10上以某种方式运行runas: runas /user:John "cmd.exe /k echo %path%" 这不起作用,因为%path%已展开,我们得到错误: 正在尝试启动cmd.exe/k echo C:\Program Files(x。。。 ... 运行方式错误:无法运行-cmd.exe/k ech。。。 ... 1734:数组

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

  • 假设我们希望在Windows 10上以某种方式运行runas:

    runas /user:John "cmd.exe /k echo %path%"
    
    这不起作用,因为%path%已展开,我们得到错误:

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

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

    runas /user:John "cmd.exe /k echo ^%path^%"
    
    新shell窗口中的输出仅为

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

  • 假设我们需要一些其他东西,我们需要在命令中使用:

    runas /user:John "cmd.exe /k dir c:\Program Files"
    
    这不起作用-显然是因为程序和文件之间的空间,新出现的shell窗口会显示两次“未找到文件”

    人们可能会认为,解决这一问题的办法是

    runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
    
    但这不起作用(runas打印使用帮助)。问题是为什么

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

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


  • 我们涉及三个实体:

    • 外部
      cmd
      shell,在其中键入
      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^%
    • 内部shell将在新窗口中看到
      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%
      ,并将其视为
    • 内部外壳将看到
      echo%path%
      。它将展开路径。您将在新窗口中看到展开的路径
    最后一种方法是在转义插入符号之前退出引号:
    runas.exe…“cmd.exe/k echo”^%path^%
    不过,重要的是不要有不在引号中的空格

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

    请注意,您可以在完成转义百分比后“返回引号”。例如,
    runas/user:rpres“cmd.exe/k echo这是我的路径::“^%path^%”:::“
    将显示
    这是我的路径
    ,后面是用三个冒号括起来的路径。

    当然
    runas…设置路径
    是一种欺骗方式,可以让它在新窗口中显示路径:)这个技巧是结束引用的部分,并且在引用的参数之外有
    ^%path^%
    ,但没有空格,真管用!很不错的。这就是答案1。你能提供2的答案吗。也是吗?2符合我的第二个场景。shell在引号中看到插入符号,因此不会展开它们,而是保持它们不变。如果你想使用插入符号,你必须从引号中取出,添加一个插入符号的引号,然后回到引号中,然后再次从引号中取出并以插入符号的引号结束:
    runas/user:rpres“cmd.exe/k dir”^“c:\program files”^“
    更容易接受
    runas
    的建议并使用反斜杠
    set aa=echo ^%path^%
    runas /user:rpres "cmd.exe /k %aa%"