【问题标题】:Execute CMD commands in C#在 C# 中执行 CMD 命令
【发布时间】:2015-04-09 15:28:33
【问题描述】:

好吧,在真正提出这个问题之前,我先简要介绍一下我正在尝试做的事情。我写了几批在这里安装东西,它们工作得很好。问题是......我想用 C# 编写一个与批处理执行相同操作的程序。批处理所做的大部分工作是调用文件并使用 /S 或 /silent 等参数触发它们。当然,还要激活 Windows/Office。 但我在运行 Office/Windows 激活器时遇到问题。下面,您将看到我们使用的批处理的结构以及 C# 程序的结构。

@echo off

::Office Installation
:AskOffice
set INPUT=
set /P INPUT=Do you want to install Office 2010 (1), Office 2013 (2) or skip this step (3)? %=%
If /I "%INPUT%"=="1" goto 1 
If /I "%INPUT%"=="2" goto 2
If /I "%INPUT%"=="3" goto eof
echo.
echo Invalid input & goto AskOffice

::Office 2010
:1

set INPUT=
set /P INPUT=Do you want to install Office (1) or just activate it (2)?
If /I "%INPUT%"=="1" goto instalar2010 
If /I "%INPUT%"=="2" goto windows2010

:instalar2010
echo Installing Office 2010...
"\\jamaica\sistemas$\INSTALL\~SOFTWARES\Office\Office 2010\setup.exe" /config "\\jamaica\sistemas$\INSTALL\~SOFTWARES\Office\Office 2010\ProPlus.WW\config.xml"
goto windows2010

:windows2010
if defined ProgramFiles(x86) (
    @echo You're running a x64 system...
    goto 2010x64
) else (
    @echo You're running a x86 system...
    goto 2010x86
)

:2010x86
::Office 2010 Activation (x86)
echo Activating Office 2010 (x86)...
c:\windows\system32\cscript "C:\Program Files\Microsoft Office\Office14\OSPP.VBS" /inpkey:XXXXXXXXX
c:\windows\system32\cscript "C:\Program Files\Microsoft Office\Office14\OSPP.VBS" /act
goto eof

:2010x64
::Office 2010 Activation (x64)
echo Activating Office 2010 (x64)...
c:\windows\system32\cscript "C:\Program Files (x86)\Microsoft Office\Office14\OSPP.VBS" /inpkey:XXXXXXX
c:\windows\system32\cscript "C:\Program Files (x86)\Microsoft Office\Office14\OSPP.VBS" /act
goto eof

::Office 2013
:2
set INPUT=
set /P INPUT=Do you want to install Office (1) or just activate it (2)?
If /I "%INPUT%"=="1" goto instalar2013
If /I "%INPUT%"=="2" goto windows2013

:instalar2013
echo Installing Office 2013...
"\\jamaica\sistemas$\Install\~SOFTWARES\Office\Office 2013\setup.exe" /config "\\jamaica\sistemas$\Install\~SOFTWARES\Office\Office 2013\proplus.ww\config.xml"
goto windows2013

:windows2013
if defined ProgramFiles(x86) (
    @echo You're running a x64 system...
    goto 2013x64
) else (
    @echo You're running a x86 system...
    goto 2013x86
)

:2013x86
::Office 2013 Activation (x86)
echo Activating Office 2013...
c:\windows\system32\cscript "C:\Program Files\Microsoft Office\Office15\OSPP.VBS" /inpkey:XXX
c:\windows\system32\cscript "C:\Program Files\Microsoft Office\Office15\OSPP.VBS" /act
goto eof

:2013x64
::Office 2013 Activation (x64)
echo Activating Office 2013...
c:\windows\system32\cscript "C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS" /inpkey:XXXX
c:\windows\system32\cscript "C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS" /act
goto eof

:eof

这是我的批次代码。它所做的只是询问您要安装哪个版本的 Office,然后将其激活。或者,您可以根据需要激活它。我想用 C# 做同样的事情,但只使用 C#。我可以创建一个方法来启动批处理文件,但是,嗯......我想学习如何使 CMD 命令在 C# 中工作。这是我的 C# 类的代码。

/* Office's installers' paths */
string varCaminhoOffice2010 = @"\\romenia\install$\~SOFTWARES\Office\Office 2010\setup.exe";
string varCaminhoOffice2013 = @"\\romenia\install$\~SOFTWARES\Office\Office 2013\setup.exe";

/* Local folders */
string varCaminhoOffice2010x86 = @"C:\Program Files\Microsoft Office\Office14\OSPP.VBS";
string varCaminhoOffice2010x64 = @"C:\Program Files (x86)\Microsoft Office\Office14\OSPP.VBS";
string varCaminhoOffice2013x86 = @"C:\Program Files\Microsoft Office\Office15\OSPP.VBS";
string varCaminhoOffice2013x64 = @"C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS";

/* Methods */
public void mtdAtivaOffice2010()
{
    /* Office Activation */
    if (mtdCheckArc == false) // Checking system's architecture
    {
        // x86
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2010x86 + "/inpkey:XXXX");
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2010x86 + "/act");
    }
    else
    {
        // x64
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2010x64 + "/inpkey:XXXX");
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2010x64 + "/act");
    }
}

public void mtdAtivaOffice2013()
{
    /* Office activation */
    if (mtdCheckArc == false) // Checking system's architecture
    {
        // x86
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2013x86 + "/inpkey:XXXX");
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2013x86 + "/act");
    }
    else
    {
        // x64
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2013x64 + "/inpkey:XXXX");
        System.Diagnostics.Process.Start("CMD.exe", "/C %systemroot%\system32\cscript" + varCaminhoOffice2013x64 + "/act");
    }
}

每次我尝试运行项目时,Visual Studio 都会给我提供编译错误消息。我尝试了一些事情,并尝试搜索论坛寻求帮助,但没有任何帮助。我也试过了:

尝试将每个命令设置为变量,然后让方法运行它们:

string varCScript = @"%systemroot%\system32\cscript";
string varSerial2010 = "/inpkey:XXXX";
string varSerial2013 = "/inpkey:XXXX";
string varActivate = "/act";
System.Diagnostics.Process.Start("CMD.exe", "/C" + varCScript + varCaminhoOffice2010x86 + varSerial2010);
System.Diagnostics.Process.Start("CMD.exe", "/C" + varCScript + varCaminhoOffice2010x64 + varSerial2010);
System.Diagnostics.Process.Start("CMD.exe", "/C" + varCScript + varCaminhoOffice2013x86 + varSerial2013);
System.Diagnostics.Process.Start("CMD.exe", "/C" + varCScript + varCaminhoOffice2013x64 + varSerial2013);

还尝试将 wole 命令作为单个字符串插入:

string varCommand = "%systemroot%\system32\cscript \"C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS\" /inpkey:XXXX";

我还尝试在文件夹之间的最后一行代码中添加更多“\”。像“C:\\windows\\system32”,但没有任何效果。有时我得到编译错误,有时我的程序运行......但是当 CMD 窗口打开时,它会闪烁一秒钟然后消失。我只能从其中之一读到“语法问题”。所以,嗯......看起来 CMD 没有正确读取我的字符串。我的意思是,我没有正确地声明它们。

你们能帮我解决这个问题吗?

【问题讨论】:

  • 除其他外,您还需要UseShellExecute msdn.microsoft.com/en-us/library/…
  • 谢谢你,乔德雷尔。我刚刚使用您的建议创建了一个方法,明天我会看看它是否有效。如果你想检查整个代码,你可以找到它here

标签: c# windows batch-file cmd


【解决方案1】:

您需要在参数之间使用空格,并在有空格的参数周围加上引号。

另外,要获取更多信息:在 Process.Start 行上放置一个断点,获取脚本和参数,然后将它们粘贴到 cmd 窗口中。

【讨论】:

  • 对。我会尝试在参数中添加空格。既然你提到了它,它听起来很明显......不幸的是,我只能在明天下午尝试它,因为我无法在大学以外的家里访问这些服务器。我也会尝试 Jodrell 的方式。我刚刚使用他的建议创建了一个方法,我将在明天之前对其进行测试。谢谢你们俩!另外,如果你想检查整个代码,你可以找到它here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 2018-12-31
  • 2012-11-23
  • 2021-02-01
  • 1970-01-01
相关资源
最近更新 更多