- - PR -
ASP.NET(C#)からのバッチファイル起動
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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起動する)のですが・・・ 何か見落としがあるのでしょうか。 以上です。よろしくお願いいたします。 | ||||
|
投稿日時: 2007-01-23 19:43
まず、バッチファイルはバッチファイルそのものを Process に渡しても実行できません。
バッチファイルはコマンドプロンプト(例えば cmd.exe )がバッチファイルの内容を解釈し て実行しているので、StartInfo.FileName には cmd.exe のフルパスを指定して やる必要があります。 その上で StartInfo.Arguments にバッチファイル名を設定します。こんな感じ。
(これはあくまで例なので、実際は環境変数 COMSPEC などを利用して、コマンドプ ロンプトのフルパスを与えてやります) また、ASP.NET から実行するとなると、権限の設定なども正しく行う必要があります。 そのあたりも考慮してみてください。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2007-01-23 20:02
局所的反応。
関連付けさえしてあれば、実行できます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-23 20:14
stExeNameはどのように指定してますか?
絶対パス?相対パス? | ||||
|
投稿日時: 2007-01-23 20:28
process.StartInfo.UseShellExecute = true; しないと駄目。 | ||||
|
投稿日時: 2007-01-23 22:25
元のコード、false になっていたんですね。 これじゃ、起動できませんね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-24 06:52
mjd?! …と思ったら、UseShellExecute = true の時の話ですね。 確かにそれだったら普通に起動できるはずですね。 あえて何らかの理由があって(例えば出力結果をリダイレクトするとか) false にしていると思い込んでいたので、その件はすっかり頭から離れていました。 思い込みはいけませんという例でした。 ってゆーか反面教師? それだけだとなんなので。 ASP.NET からの実行だとデバッグが大変そうなので、一度 Windows フォームから同じようなコードを動かしてみて、正しく動くことを確認してから ASP.NET 側に持っていったほうがいいかもしれません。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 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