C# 调用命令的远程计算机上的CMD/C和echo
如果我要将文件写入远程机器上的共享文件夹,我会遇到一个神秘的现象C# 调用命令的远程计算机上的CMD/C和echo,c#,cmd,C#,Cmd,如果我要将文件写入远程机器上的共享文件夹,我会遇到一个神秘的现象 object[] theProcessToRun2 = { "CMD.EXE /C " + '"' + "echo.exe test 123 4 5 6 7" + '"' + " " + "> " + '"' + @"C:\temp10\Pythontest.py" + '"' }; using (var managementClass = new ManagementClass(serviceScope, new Man
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脚本进行了尝试,效果很好……所以这里没有错误)
我做错了什么,或者没有正确地看到它?好的,从一个德国论坛上得到了一些启示 在这种情况下,echo不工作的原因是: echo试图将其值输出到标准输出,标准输出应该链接到UI元素。在远程计算机上调用后,没有可以访问的UI元素。所以所有的输出都进入涅盘
这就是它编写文件但不包含内容的原因。问题在于为CMD命令行生成的字符串。让我看看
{ "CMD.EXE /C " + '"' + "echo.exe test 123 4 5 6 7" + '"' + " " + "> " + '"' + @"C:\temp10\Pythontest.py" + '"' }
这将是实际字符串:
CMD.EXE/c“echo.EXE测试123 4 5 6 7”>“c:\temp10\Pythontest.py”
CMD有自己的处理命令行参数的规则。这是CMD帮助中的描述,可以通过在命令提示下键入CMD/?
来查看
如果指定了/C或/K,则在
开关作为命令行处理,其中包含以下逻辑
用于处理引号(“)字符:
- no/S开关
- 正好两个引号字符
- 两个引号字符之间没有特殊字符, 其中,special是以下之一:&()@^|
- 字符之间有一个或多个空白字符 双引号字符
- 两个引号字符之间的字符串是名称 一个可执行文件的名称
/C
开关后的第一个和最后一个引号。因此,CMD将尝试执行以下操作:
echo.exe测试123 4 5 6 7”>“C:\temp10\Pythontest.py
现在您可以看到重定向操作符位于引号之间,它现在只是一个用引号括起来的文本
,因此不会执行重定向,这将在控制台上打印:
exe测试123 4 5 6 7“>”C:\temp10\Pythontest.py
请注意,echo
是CMD的一个内部命令,windows确实有任何名为echo.exe
的可执行文件。使用echo.exe
实际上是使用内部echo
命令,该命令的参数是.exe
。echo
始终跳过第一个字符,因此
被删除并CMD.EXE/c echo test 123 4 5 6 7>“c:\temp10\Pythontest.py”
因此
错误是什么?没有文件,或者异常?我没有异常。它没有写入任何文件,神秘现象可能被称为“权限”“我很确定您需要
CMD.EXE
和/C
作为独立的参数。所以数组应该至少由3个字符串组成,不需要双引号。我不完全确定您需要如何分离重定向。我想如果没有任何异常,那么这就不是权限问题。为什么不将处理器un2
更改为Notepad.exe
,看看它是否启动。可能是您的CMD.EXE
不正确。
object[] theProcessToRun2 = { "CMD.EXE /C " + "echo test 123 4 5 6 7" + " > " + '"' + @"C:\temp10\Pythontest.py" + '"' };