0

这是情况。我们有一个非常旧的 COBOL exe,只能在 Windows XP 上运行。为了运行这个 exe,我们设置了一个虚拟 XP 机器。用户每周都会运行一系列 BAT 文件。

我正在尝试编写一个将在 VM 上运行然后执行 COBOL exe 的 C# Windows 应用程序。计划是使用 Process.Start 来调用 EXE。如果 MY WINDOWS C# EXE 与 COBOL exe 在同一目录中运行,一切正常。

当我将 C# exe 移出文件夹时,我得到一个错误的返回码,并且 cobol 没有被执行。

无需赘述,我希望能够从文件夹外部运行 COBOL。原因是我们有几个区域办事处,每个办事处都有自己的文件夹和每个文件夹内的 cobol exe 副本。这里的目标是让用户选择每个区域办事处,然后 C# 程序将执行每个目录中的每个程序。

总之。如果我在 COBOL exe 所在的文件夹中运行 C#,它就可以工作。但是,如果我将 C# 移出该文件夹,则不会

我希望这一切都有意义。以下是一些额外的细节:

  1. 在 Visual Studio 2012 中作为 C# Windows 应用程序创建
  2. 平台目标 x86(我也使用过 Any CPU)
  3. 目标框架 .NET Framework 4
  4. COBOL 是 1997 年的 Microfocus(是的,我知道。我们需要摆脱它)
  5. 虚拟机是 Windows XP
  6. 如果我将 exe 更改为记事本,它运行良好
  7. 如果我确实从 Windows 开始运行并粘贴:K:\AMSapp\MYTESTFOLDER\AMSBLD.exe它运行良好

  8. 按钮单击事件的 C# 代码(注意:如果我将文件名更改为此 K:\AMSapp\MYTESTFOLDER\AMSBLD.exe 我得到相同的结果。它不运行)此外,消息框显示 255 时返回代码不起作用。如果将 C# 程序移动到 cobol 文件夹内,则返回零。

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
    
            int exitCode;
    
    
                Process process = new Process();
                process.StartInfo.FileName = @"\\SERVER23021\PRODDATA\AMSapp\MYTESTFOLDER\AMSBLD.exe";
    
    
    
                process.StartInfo.ErrorDialog = true;
    
                process.Start();
                process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.
    
                exitCode = process.ExitCode;
                MessageBox.Show("My exit code = " + exitCode.ToString());
    
                MessageBox.Show("my path and file name: " + process.StartInfo.FileName);
    
    
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
    
        }
    }
    
4

2 回答 2

-1

尝试将进程工作目录设置为与 cobol exe 文件相同的路径。

process.StartInfo.WorkingDirectory = System.IO.Path.GetFullPath(process.StartInfo.FileName);
于 2016-10-11T20:23:11.223 回答
-2

我认为,您应该使用ProcessStartInfo.Domain设置域并在该路径之后设置 .exe 中的 exe ProcessStartInfo.FileNameProcessStartInfo传入Process.Start方法的实例

ProcessStartInfo psi = new ProcessStartInfo();
psi.Domain = @"SERVER23021";
psi.FileName = @"\PRODDATA\AMSapp\MYTESTFOLDER\AMSBLD.exe";

Process.Start(psi);

如果您需要模拟您的呼叫,您可以设置UsernamePassword。但您必须记住,您需要成对提供它们。UseShellExecute必须设置为false并且WorkingDirectory还必须提供。更多:https ://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password(v=vs.110).aspx

于 2016-10-11T21:37:11.770 回答