CMD /C 和 echo 在远程机器上调用命令

如果我要将文件写入远程计算机上的共享文件夹,则会出现一个神秘现象。


object[] theProcessToRun2 = { "CMD.EXE /C " + '"' + "echo.exe test 123 4 5 6 7" + '"' + " " + "> " + '"' + @"C:\temp10\Pythontest.py" + '"' };


using (var managementClass = new ManagementClass(serviceScope, new ManagementPath("Win32_Process"), new ObjectGetOptions()))

{

managementClass.InvokeMethod("Create", theProcessToRun2);

}

如果我在远程机器的 cmd 行上写相同的代码,它会写一个文件。


ServiceScope 等是正确的(我在远程机器上用 python 脚本尝试过它并且工作正常......所以这里不是错误)。


我做错了什么,或者没有正确地看到它?


小唯快跑啊
浏览 238回答 2
2回答

Smart猫小萌

好的,从德国论坛得到了一些启发。在这种情况下回声不起作用的原因是:echo 尝试将其值输出到 stdout - 它应该链接到 UI 元素。在远程机器上调用后,没有可以访问的 UI 元素。所以所有的输出都将进入涅盘。这就是为什么它写入文件但没有内容的原因。

郎朗坤

问题出在您为 CMD 命令行构建的字符串中。让我们看看{&nbsp;"CMD.EXE&nbsp;/C&nbsp;"&nbsp;+&nbsp;'"'&nbsp;+&nbsp;"echo.exe&nbsp;test&nbsp;123&nbsp;4&nbsp;5&nbsp;6&nbsp;7"&nbsp;+&nbsp;'"'&nbsp;+&nbsp;"&nbsp;"&nbsp;+&nbsp;">&nbsp;"&nbsp;+&nbsp;'"'&nbsp;+&nbsp;@"C:\temp10\Pythontest.py"&nbsp;+&nbsp;'"'&nbsp;}这将是实际的字符串:CMD.EXE /c "echo.exe test 123 4 5 6 7" > "C:\temp10\Pythontest.py"CMD 有自己的处理命令行参数的规则。这是来自 CMD 帮助的描述,可以通过CMD /?在命令提示符下键入来查看如果指定了 /C 或 /K,则切换后的命令行的其余部分将作为命令行处理,其中使用以下逻辑处理引号 (") 字符:如果满足以下所有条件,则保留命令行上的引号字符:没有 /S 开关正好两个引号字符两个引号字符之间没有特殊字符,其中 special 是以下之一: &<>()@^|两个引号字符之间有一个或多个空格字符两个引号字符之间的字符串是可执行文件的名称。否则,旧的行为是查看第一个字符是否是引号字符,如果是,则去掉前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的任何文本。显然,案例 1 未涵盖您的字符串,因此案例 2 将应用于您的命令行字符串。这意味着 CMD 将/C在执行 switch 之前删除第一个和最后一个引号。所以CMD会尝试执行这个:echo.exe test 123 4 5 6 7" > "C:\temp10\Pythontest.py现在您看到重定向运算符位于引号之间,它现在只是一个>用引号括起来的文字,因此不会执行重定向,这将打印在控制台上:exe 测试 123 4 5 6 7" > "C:\temp10\Pythontest.py请注意,这echo是 CMD 的内部命令,Windows 确实有任何名为echo.exe.&nbsp;通过使用,echo.exe您实际上是在使用内部echo命令,这.exe是它的参数。echo总是跳过第一个字符,因此.被消除并exe打印。所以这将是按预期工作的正确字符串:CMD.EXE /c echo test 123 4 5 6 7 > "C:\temp10\Pythontest.py"因此object[]&nbsp;theProcessToRun2&nbsp;=&nbsp;{&nbsp;"CMD.EXE&nbsp;/C&nbsp;"&nbsp;+&nbsp;"echo&nbsp;test&nbsp;123&nbsp;4&nbsp;5&nbsp;6&nbsp;7"&nbsp;+&nbsp;"&nbsp;>&nbsp;"&nbsp;+&nbsp;'"'&nbsp;+&nbsp;@"C:\temp10\Pythontest.py"&nbsp;+&nbsp;'"'&nbsp;};
打开App,查看更多内容
随时随地看视频慕课网APP