CMD / C和远程计算机上的回显调用命令

时间:2018-08-20 10:39:58

标签: c# cmd

如果我要向远程计算机上的共享文件夹中写入文件,我会有一种神秘的现象。

@ECHO ON
REM Run as admin
powershell.exe /c Get-NetConnectionProfile;
powershell.exe /c Set-NetConnectionProfile -NetworkCategory Private;
powershell.exe /c netsh advfirewall firewall set rule group=”Deteção de Rede” new enable=yes
cmd.exe /c winrm quickconfig -q
cmd.exe /c winrm set winrm/config/service @{AllowUnencrypted="true"}
cmd.exe /c winrm set winrm/config/service/auth @{Basic="true"}

@ECHO Done.

如果我在远程计算机的cmd行上写了相同的代码,它将写一个文件。

ServiceScope等是正确的(我在远程计算机上使用python脚本进行了尝试,并且工作正常……因此这不是错误)。

我做错了什么,或者看错了什么?

2 个答案:

答案 0 :(得分:0)

好的,从德国论坛上获得了一些启发。

在这种情况下回声不起作用的原因是:

echo尝试将其值输出到标准输出-应该链接到UI元素。在远程计算机上进行呼叫之后,无法访问任何UI元素。所以所有的输出都进入了必杀技。

这就是为什么它写入文件但没有内容的原因。

答案 1 :(得分:0)

问题出在为CMD命令行生成的字符串中。让我们看看

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

这将是实际的字符串:

CMD.EXE /c "echo.exe test 123 4 5 6 7" > "C:\temp10\Pythontest.py"

CMD具有处理命令行参数的规则。这是CMD帮助中的描述,可以通过在命令提示符下键入CMD /?来看到

  

如果指定了/ C或/ K,则命令行后面的其余部分   开关作为命令行处理,其中以下逻辑是   用于处理引号(“)字符:

     
      
  1. 如果满足以下所有条件,则用引号引起来      保留命令行上的内容:

         
        
    • 没有/ S开关
    •   
    • 恰好两个引号字符
    •   
    • 两个引号字符之间没有特殊字符,    其中特殊的是以下之一:&<>()@ ^ |
    •   
    • 之间有一个或多个空格字符    两个引号字符
    •   
    • 两个引号字符之间的字符串是名称    可执行文件。
    •   
  2.   
  3. 否则,旧的行为是查看第一个字符是否为      引号字符,如果是这样,则去掉前导字符并      删除命令行上的最后一个引号字符,保留      最后一个引号字符后的任何文本。

  4.   

很明显,情况1未覆盖您的字符串,因此情况2将应用于您的命令行字符串。这意味着CMD将在执行/C切换后删除第一个和最后一个引号。因此,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的可执行文件。通过使用echo.exe,您实际上是在使用内部echo命令,其中.exe是它的参数。 echo总是跳过第一个字符,因此排除了.并打印exe

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

CMD.EXE /c echo test 123 4 5 6 7 > "C:\temp10\Pythontest.py"

因此

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