web-dev-qa-db-ja.com

Process.Start()が.exeファイルを開始しない(手動で実行すると機能する)

ファイルを作成した後に実行する必要がある_.exe_ファイルがあります。ファイルは正常に作成され、その後、次のコードを使用して_.exe_ファイルを実行しています。

_ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.FileName = pathToMyExe;
processInfo.ErrorDialog = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;                        
Process proc = Process.Start(processInfo);
_

シンプルなProcess.Start(pathToMyExe);も試してみましたが、_.exe_ファイルが実行されていません。私が手動でpathToMyExeを試すとWindows Explorerプログラムは正しく実行されます。しかし、プログラム経由ではありません。カーソルが数秒待ってから通常に戻ります。したがって、スローされる例外もありません。ファイルをブロックしているものは何ですか?

12
disasterkid

作業ディレクトリパスを設定していません。エクスプローラーからアプリケーションを起動する場合とは異なり、実行可能ファイルの場所は自動的には設定されません。

次のようなことをしてください:

processInfo.WorkingDirectory = Path.GetDirectoryName(pathToMyExe);

(入力ファイル、DLLなどがそのディレクトリにあると想定)

23
Luaan
    private void Print(string pdfFileName)
    {
        string processFilename = Microsoft.Win32.Registry.LocalMachine
    .OpenSubKey("Software")
    .OpenSubKey("Microsoft")
    .OpenSubKey("Windows")
    .OpenSubKey("CurrentVersion")
    .OpenSubKey("App Paths")
    .OpenSubKey("AcroRd32.exe")
    .GetValue(string.Empty).ToString();

        ProcessStartInfo info = new ProcessStartInfo();
        info.Verb = "print";
        info.FileName = processFilename;
        info.Arguments = string.Format("/p /h {0}", pdfFileName);
        info.CreateNoWindow = true;
        info.WindowStyle = ProcessWindowStyle.Hidden;
        ////(It won't be hidden anyway... thanks Adobe!)
        info.UseShellExecute = false;

        Process p = Process.Start(info);
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        int counter = 0;
        while (!p.HasExited)
        {
            System.Threading.Thread.Sleep(1000);
            counter += 1;

            if (counter == 5)
            {
                break;
            }
        }

        if (!p.HasExited)
        {
            p.CloseMainWindow();
            p.Kill();
        }
    }
1
clutch

作業ディレクトリが異なるため、作業ディレクトリを、プロセスを開始するパスに正しく設定する必要があります。

このデモの例は次のとおりです。

Process process = new Process()
{
    StartInfo = new ProcessStartInfo(path, "{Arguments If Needed}")
    {
        WindowStyle = ProcessWindowStyle.Normal,
        WorkingDirectory = Path.GetDirectoryName(path)
    }
};

process.Start();
0
Payam Lashkari