1

我有一个包含以下命令的批处理文件:

cd C:\myfolder
NuGet Update -self
NuGet pack mypackage.nuspec

myfolder 包含 mypackage.nuspec 和 NuGet.exe。我尝试使用以下函数使用 C# 运行此命令:

        private static int ExecuteCommand(string path)
        {
            ProcessStartInfo ProcessInfo;
            Process Process;

            ProcessInfo = new ProcessStartInfo(path);
            ProcessInfo.CreateNoWindow = true;
            ProcessInfo.UseShellExecute = false;
            ProcessInfo.WorkingDirectory = new System.IO.FileInfo(path).DirectoryName;
            ProcessInfo.EnvironmentVariables["EnableNuGetPackageRestore"] = "true";


            // *** Redirect the output ***
            ProcessInfo.RedirectStandardError = true;
            ProcessInfo.RedirectStandardOutput = true;


            Process = Process.Start(ProcessInfo);
            Process.WaitForExit();

            // *** Read the streams ***
            string output = Process.StandardOutput.ReadToEnd();
            string error = Process.StandardError.ReadToEnd();

            int ExitCode = Process.ExitCode;
            Process.Close();
            return ExitCode;

        }

但是,我的命令没有执行。是什么导致了这种行为,解决方案是什么?这些字符串将来可能会使用,然后我会更新我的问题(只是为了防止批评:))。

这是函数的最终版本:

    private static ShellCommandReturn ExecuteCommand(string path)
    {
        ProcessStartInfo processInfo;
        Process process;

        processInfo = new ProcessStartInfo(path);
        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;
        processInfo.WorkingDirectory = new System.IO.FileInfo(path).DirectoryName;
        processInfo.EnvironmentVariables["EnableNuGetPackageRestore"] = "true";


        // *** Redirect the output ***
        processInfo.RedirectStandardError = true;
        processInfo.RedirectStandardOutput = true;


        process = Process.Start(processInfo);
        process.WaitForExit();

        // *** Read the streams ***
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();

        int exitCode = process.ExitCode;
        process.Close();
        return new ShellCommandReturn { Error = error, ExitCode = exitCode, Output = output };
    }

ShellCommandReturn 是一个简单的自定义类,其中包含一些数据成员,其中存储了 shell 命令的错误、输出和退出代码。

谢谢。

4

1 回答 1

1

编辑:经过一定程度的合作:)

问题是这是在 Web 应用程序的上下文中执行的,它没有设置相同的环境变量。

显然设置:

startInfo.EnvironmentVariables["EnableNuGetPackageRestore"] = "true"

(使用下面我的最终代码的命名)解决了这个问题。


老答案(仍然值得一读)

看看这段代码:

ProcessInfo = new ProcessStartInfo(path);
ProcessInfo.CreateNoWindow = false;
ProcessInfo.UseShellExecute = true;
ProcessInfo.WorkingDirectory = new System.IO.FileInfo(path).DirectoryName;

Process = Process.Start(path);

您正在创建一个ProcessStartInfo,但随后完全忽略它。您应该将其传递给Process.Start. 您还应该重命名变量。通常,局部变量在 C# 中以小写字母开头。此外,如果可能,最好在首次使用时初始化变量。哦,还有导入命名空间,这样您就不会System.IO.FileInfo在代码中使用完全限定的名称。最后,对象初始化器对于以下类很有用ProcessStartInfo

var startInfo = new ProcessStartInfo(path) {
    CreateNoWindow = false,
    UseShellExecute = true,
    WorkingDirectory = new FileInfo(path).DirectoryName;
};
var process = Process.Start(startInfo);
于 2012-11-12T15:38:23.030 回答