如果我要向远程计算机上的共享文件夹中写入文件,我会有一种神秘的现象。
@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脚本进行了尝试,并且工作正常……因此这不是错误)。
我做错了什么,或者看错了什么?
答案 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,则命令行后面的其余部分 开关作为命令行处理,其中以下逻辑是 用于处理引号(“)字符:
如果满足以下所有条件,则用引号引起来 保留命令行上的内容:
- 没有/ S开关
- 恰好两个引号字符
- 两个引号字符之间没有特殊字符, 其中特殊的是以下之一:&<>()@ ^ |
- 之间有一个或多个空格字符 两个引号字符
- 两个引号字符之间的字符串是名称 可执行文件。
否则,旧的行为是查看第一个字符是否为 引号字符,如果是这样,则去掉前导字符并 删除命令行上的最后一个引号字符,保留 最后一个引号字符后的任何文本。
很明显,情况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" + '"' };