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:数组
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用法帮助示例部分中看到。但这不是转义引号的常用方法,是吗?这里的问题是为什么^“
不起作用我们涉及三个实体:
- 外部
shell,在其中键入cmd
runas…
,它获取凭据,启动新进程,等等runas.exe
- 内部的
shell,它是cmd
被告知要执行的runas
runas…”cmd.exe/k echo%path%“
- 外壳将看到
,并将其展开%path%
接受扩展命令,以该命令作为参数启动内部shellrunas
- 内壳与它所看到的相呼应
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%"