C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#から外部バッチファイルを実行させるときのエラー

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■103672 / inTopicNo.1)  C#から外部バッチファイルを実行させるときのエラー
  
□投稿者/ inak (1回)-(2025/05/14(Wed) 16:46:46)

分類:[C#] 

いつも参考にさせていただいております。

今回、C#でちょっと行き詰っている点があり、質問させてもらうことにしました。

Visual Studio 2022
.NET 8.0
C#
Windows11

C#アプリケーションから外部プログラム(バッチファイル)を実行させようとしていて、以下のように記述しています。

string exeBatchFile = AppDomain.CurrentDomain.BaseDirectory + @"run.bat";

ProcessStartInfo pInfo = new()
{
FileName = exeBatchFile,
CreateNoWindow = true,
UseShellExecute = true,
};

Process p = Process.Start(pInfo);
p.WaitForExit();

バッチファイルの中身はこんな感じです。

C:
cd C:\temp\test
cal_program.exe

Fortranで作成されたDOS版の古いプログラム "cal_program.exe" が存在しているフォルダーに移ってから実行させるようにしています。

このコードを実行すると「System.ComponentModel.Win32Exception」「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」というエラーが発生します。メッセージを見るとバッチファイルが別プロセスで使用中というメッセージみたいで、バッチファイルも中身の記述が消えてファイルサイズがゼロになってしまっています。

いろいろと試しているのですが、どうも原因がわかりません。何かヒントでもわかる方がおられましたら、ご教示ください。よろしくお願いします。
引用返信 編集キー/
■103673 / inTopicNo.2)  Re[1]: C#から外部バッチファイルを実行させるときのエラー
□投稿者/ 魔界の仮面弁士 (3845回)-(2025/05/14(Wed) 18:16:17)
No103672 (inak さん) に返信
> string exeBatchFile = AppDomain.CurrentDomain.BaseDirectory + @"run.bat";
このパスが正しいことは確認済みでしょうか?
(上記が、実行ファイルのフォルダーを指すとは限らないそうで)
https://dobon.net/vb/dotnet/vb6/apppath.html

> C:
> cd C:\temp\test
CD /D C:\temp\test
と 1 行にまとめることもできますね。

> cal_program.exe
> Fortranで作成されたDOS版の古いプログラム "cal_program.exe" が存在しているフォルダーに移ってから実行させるようにしています。
古いプログラムなら、32bit プロセスであることを前提にしていそうに思いますが、
そのバッチファイルは、32bit プロセスと 64bit プロセスのどちらで実行させていますか?
環境変数「PROCESSOR_ARCHITECTURE」と「PROCESSOR_ARCHITEW6432」の値を確認してみてはいかがでしょう。

> このコードを実行すると「System.ComponentModel.Win32Exception」「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」というエラーが発生します。
> メッセージを見るとバッチファイルが別プロセスで使用中というメッセージみたいで、バッチファイルも中身の記述が消えてファイルサイズがゼロになってしまっています。
UAC によるフォルダー仮想化の影響を受けていないでしょうか。
C# アプリを管理者モードで実行した場合とそうでない場合とで、動作が変化しますか?

> いろいろと試しているのですが、どうも原因がわかりません。
Process Monitor でレジストリ / ファイルへのアクセス状況を追跡できないでしょうか。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ