- PR -

ASP.NET(C#)からのバッチファイル起動

1
投稿者投稿内容
うみの
常連さん
会議室デビュー日: 2006/08/23
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 2007-01-23 19:27
いつもお世話になっています。

ASP.NET(C#)からDosのバッチファイルを起動しようと試みているのですが、どうもうまくいきません・・・

諸所のスレッドを参考に、下記のコードを組んで実行しています。

 string stExeName = @"xxx\\yyy\\test.bat";
 Process process = new Process();
 process.StartInfo.UseShellExecute = false;
 process.StartInfo.RedirectStandardOutput = true;
 process.StartInfo.FileName = stExeName;
 process.StartInfo.Arguments = "4 ARGUMENTS";
 process.Start();

test.bat の中は以下の簡単な内容でテストしています(本来の目的はFTPコマンドをたたくことですが)

 ECHO a > log.txt
 notepad.exe
 exit

上記を実行すると、エラーなど何も表示されないのですが、log.txtも作成されず、notepadも起動しません(タスクマネージャのプロセスに表示されていない)
開発環境なので、サーバー=自端末です。

batファイルを直接実行すると正常に動作する(log.txt作成され、notepad起動する)のですが・・・

何か見落としがあるのでしょうか。


以上です。よろしくお願いいたします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-01-23 19:43
まず、バッチファイルはバッチファイルそのものを Process に渡しても実行できません。
バッチファイルはコマンドプロンプト(例えば cmd.exe )がバッチファイルの内容を解釈し
て実行しているので、StartInfo.FileName には cmd.exe のフルパスを指定して
やる必要があります。
その上で StartInfo.Arguments にバッチファイル名を設定します。こんな感じ。

コード:

string stExeName = @"xxx\yyy\test.bat";
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.FileName = "cmd.exe /c";
process.StartInfo.Arguments = "\"" + stExeName + "\"";
process.Start();


(これはあくまで例なので、実際は環境変数 COMSPEC などを利用して、コマンドプ
ロンプトのフルパスを与えてやります)

また、ASP.NET から実行するとなると、権限の設定なども正しく行う必要があります。
そのあたりも考慮してみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-23 20:02
局所的反応。

引用:

ぽぴ王子さんの書き込み (2007-01-23 19:43) より:

まず、バッチファイルはバッチファイルそのものを Process に渡しても実行できません。


関連付けさえしてあれば、実行できます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-01-23 20:14
stExeNameはどのように指定してますか?
絶対パス?相対パス?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-23 20:28
引用:

関連付けさえしてあれば、実行できます。



process.StartInfo.UseShellExecute = true;

しないと駄目。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-23 22:25
引用:

渋木宏明(ひどり)さんの書き込み (2007-01-23 20:28) より:

process.StartInfo.UseShellExecute = true;


元のコード、false になっていたんですね。
これじゃ、起動できませんね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-01-24 06:52
引用:

じゃんぬねっとさんの書き込み (2007-01-23 20:02) より:

関連付けさえしてあれば、実行できます。


mjd?!
…と思ったら、UseShellExecute = true の時の話ですね。
確かにそれだったら普通に起動できるはずですね。
あえて何らかの理由があって(例えば出力結果をリダイレクトするとか) false
にしていると思い込んでいたので、その件はすっかり頭から離れていました。
思い込みはいけませんという例でした。
ってゆーか反面教師?

それだけだとなんなので。
ASP.NET からの実行だとデバッグが大変そうなので、一度 Windows
フォームから同じようなコードを動かしてみて、正しく動くことを確認してから
ASP.NET 側に持っていったほうがいいかもしれません。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
うみの
常連さん
会議室デビュー日: 2006/08/23
投稿数: 20
お住まい・勤務地: 千葉・埼玉
投稿日時: 2007-01-24 13:20
お世話になります。
皆様、ご返答ありがとうございます。

アドバイスを元に下記のコードに組み替えて実行してみましたが、やはり現象は変わりませんでした・・・orz

 string stPath = @"C:\Inetpub\wwwroot\test\BATC\";
 string stExeName = "test.bat";

 Process KJProcess = new Process();

 KJProcess.StartInfo.UseShellExecute = false;
 KJProcess.StartInfo.RedirectStandardOutput = true;
 KJProcess.StartInfo.FileName = @"C:\WINDOWS\system32\cmd.exe";

 KJProcess.StartInfo.Arguments = @" /c " + stPath + stExeName;

 KJProcess.Start();

 string results = KJProcess.StandardOutput.ReadToEnd();

 KJProcess.Close();

上のコード実行時、resultsの内容は空("")でした。
test.batの内容を "dir /w" のみのより簡素なものに変更してみてもやはり同じです。

しかし、試しに上記コードをWindowsフォームアプリにて実行した場合、うまく動作しました。
このことからアクセス権限の問題と考え、test.batと格納しているフォルダに「ASPNET」ユーザのアクセス権(フルコントロール)を与えてみましたがダメでした。
えいやっと思って「Everyone」もフルコンにしてみましたがダメでした・・・

また、上記コードの stExeName の内容を「notepad.exe」など他のexeに変更するとちゃんと動きます。

何か根本的な設定などを見落としている気がするのですが・・・


※別件ですが、ファイルのアクセス権を与えるとき、私のPCは何故かファイルのプロパティで「セキュリティ」タブが出ません・・・ 表示タブの「簡易ファイルの共有をし使用する(推奨)」を外しても出ないです。何故でしょう。。。
アクセス権はcacls.exeを叩いて変更しています。

長文になってしまいました。
よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)