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是以下之一:&()@^|
    • 字符之间有一个或多个空白字符 双引号字符
    • 两个引号字符之间的字符串是名称 一个可执行文件的名称
  • 否则,旧的行为是查看第一个字符是否为 一个引号字符,如果是的话,去掉前导字符并 删除命令行上的最后一个引号字符,保留 最后一个引号字符后的任何文本

  • 显然,您的字符串不在案例1中,因此案例2将应用于您的命令行字符串。这意味着在执行之前,CMD将删除
    /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
    始终跳过第一个字符,因此
    被删除并de>exe将被打印

    因此,这将是按预期工作的正确字符串:

    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" + '"' };