• ベストアンサー

VB.NETからPerlを呼び出す

メール自動送信機能をPerlで作成しました。 (仮にhello.plとします)hello.plを「C:\」においています。 コマンドプロンプトから次のようにperlコマンドを実行してた場合、 メールが自動送信されたことは確認できています。 perl hello.pl 同じようにVB.NETから実行したいのですが、上手くいきません。 ソース記述は以下の通りです。 Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("C:\hello.pl") p.WaitForExit() どなたか分かる方がいらしたら、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • AlexSuns
  • ベストアンサー率67% (78/115)
回答No.2

>perl hello.pl >System.Diagnostics.Process.Start("C:\hello.pl") 確認はしていないですが、下記のようにしてみては? System.Diagnostics.Process.Start("perl 'C:\hello.pl'")

misaki029
質問者

お礼

ご教授頂いた通り、実行しましたが駄目でした(><)

その他の回答 (1)

noname#74310
noname#74310
回答No.1

hello.plの中でファイルを相対パスで記述し、hello.plがVB実行ファイルあるパスと異なるとか? perlファイルの関連ずけがないとか?

misaki029
質問者

お礼

確認しましたが、間違いないです(><)

関連するQ&A

  • VBプログラムから「管理者として実行」したい

    コマンドプロンプトで実行したいコマンドが 「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP) だとします。 XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、 そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。 上記を、手作業で行う場合は、それで解決しますが、 同じ事を、VBのコードから実行したい場合、 System.Diagnostics.Process.Start を使い、(以下サンプルコード) --------------------------- Dim psi As New System.Diagnostics.ProcessStartInfo() psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") psi.UseShellExecute = False psi.CreateNoWindow = True psi.Arguments = "/c route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***" Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi) p.WaitForExit() ----------------------------------------------------------- とすると、XPでは、管理者権限を問われないので実行できますが、 Vista以降だと、コマンドが管理者権限で実行されていないためか実行が完了せず、コマンドの内容も行われていません。(route addコマンドの記述にミスは無いとします。) Vista以降の場合、手作業で、コマンドプロンプトを右クリックして「管理者として実行」を選んで起動し、コマンドを実行するのと同じ事を、 VBのコードから行うには、どうしたらいいのでしょうか? 分かる方、教えてください。お願いします。

  • VB.NETでのDOSコマンドを実行について

    VB.NETでのDOSコマンドを実行について いつも大変お世話になっています。 VB.NET上でバイナリデータを DOSコマンド「copy」で結合させたいのですが うまくいきません。ご助言ください。 Dim results As String Dim psi As New System.Diagnostics.ProcessStartInfo() 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) psi.Arguments = _ "/c copy /b /y "C:\Program Files\test\Data\out0001.bin"+"C:\Program Files\test\Data\out0002.bin" "C:\Program Files\test\Data\TEST.jpg"" '※コマンドの前後のダブルクォーテーションを省き、コマンドプロンプトで ' 直接実行した場合は成功しました。 '起動 Dim p As System.Diagnostics.Process=_ System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit()

  • VB.NETでDOSコマンドの複数実行

    VB.NETでバッチファイルを使わずにDOSコマンドの複数実行をしたいのですが、 試しに Dim results As String 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) 'psi.Arguments = "/c " & asCmd & " /w" psi.Arguments = "/c " & "CD C:\" & " /w" '起動 p = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) psi.Arguments = "/c " & "DIR" & " /w" '起動 p = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit() というプログラムを作成したのですが、DIRは実行されるのですが、 Cドライブに移動ができません。   何が悪いのでしょうか? 実現できる方法があればご教授ください。

  • Cygwin上でperlスクリプトの実行

    Cygwin上で、例えば「hello.pl」というperlスクリプトを 実行するのに $ perl hello.pl や $ ./hello.pl では実行できるのに $ hello.pl だと bash: hello.pl: command not found と なってしまって実行できません。 $ hello.pl でコマンド化して実行したいのですが どのようにすればよいか教えてください。

  • perlの起動法

    perl起動法について質問なのですが、 perlでファイルを作り、一番上に#!/usr/bin/perlと書いて、perl.plという名前で保存しました。 ターミナルで$chmod 755 perl.pl $./perl.pl とコマンドをうったのですが、print文で書いたhello worldというが表示されません。 でもperl perl.plとコマンドを打つと実行されます。 一体この違いはなんなのでしょうか?学校の課題で、どうしても./perl.plとして実行させなければならないので是非解答お願いします。

    • ベストアンサー
    • Perl
  • 【VB2005】コンソールアプリ実行時のコマンドプロンプトの非表示方法

    22歳男性です。 vb2005で開発してます。 コンソールアプリケーション実行時に表示されるコマンドプロンプトを非表示(タスクバーにも表示されない)にしたいのですがやり方がわかりません。 私が調べたところ「System.Diagnostics.Process」クラスを使用すると外部アプリ(コマンドプロンプトなど)の操作はできるようです。ですが、私は外部アプリの操作ではなく、実行ファイル自身が実行時に表示するコマンドプロンプトを非表示にしたいので、「System.Diagnostics.Process」クラスでは実現不可と考えています。 それと、このことを実現するために、新たに実行ファイルを作るのではなく、あくまで既存の実行ファイルに「コマンドプロンプトを非表示にする」コードを埋め込むことを理想としています。そのため、実行ファイルが2つ以上になる(実際に実行するファイルと、その実行ファイルのコマンドプロンプトを操作する実行ファイル)ような考えは求めてません。 もし知っている方がいらっしゃいましたら、「使用するクラス」「具体的なコード」などを記述していただけたらありがたいです。 宜しくお願いします。

  • コマンドプロンプトの出力をテキストボックスへ表示する方法について

    コマンドプロンプトの出力をテキストボックスへ表示する方法について 現在、VBを使ったプログラミングを行っています。 以下に質問内容を示しますので、回答を宜しくお願いします。 <環境> OS:Windows XP 開発ソフト:VB2008 express edition 質問:コマンドプロンプトの出力をテキストボックスへ表示する方法について リダイレクトを使って、コマンドプロンプトの出力結果をVBのフォーム上(テキストボックス) に表示したいのですが、常に出力が更新されるコマンドの場合、実行後にフリーズが起きてしまいます。 以下の例ではpingを送っていますが、テキストボックスには常にコマンドの出力結果が更新されません。(実行が終わるまで待つ必要がある) 理想としては、pingコマンドを実行したときの結果が、そのままテキストボックス上にリアルタイムに表示されることです。 リアルタイムにテキストボックスにコマンドプロンプトの結果を表示するには、 どのような設定が必要になるのでしょうか? ご教授願います。宜しくお願いします。 ----- 以下サンプルソース ----- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim results As String Dim psi As New System.Diagnostics.ProcessStartInfo() 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) psi.Arguments = "/c ping 192.168.1.1" '起動 Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 TextBox1.Text = results 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit() End Sub End Class

  • C#.net FTPでホームディレクトリより上へ

    いつもお世話になっております。 C#.netでWebClientやFtpWebRequestを使用して FTPツールを開発していますが、ホームディレクトリより上の階層を参照する方法が見つかりません。 流れとしてはプロキシ サーバーまたはファイアウォールを経由してあるサーバにアクセスして一つ上の階層にあるフォルダにデータを送たいのです。アクセス権限はあります。 また、DOBONさんのところや他の方のプログラムなどを参考にしてプログラムからコマンドプロンプトを操作してFTPを使用してみようと思いましたがフリーズして上手くいきませんでした。 string[] strCmds = {@"/c ftp", @"/c localhost"@"/c user",@"/c password" }; for ( int i = 0; strCmds.Length; i++ ) { psi.Arguments = strCmds[i]; System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi); string results = p.StandardOutput.ReadToEnd(); p.WaitForExit(); Console.WriteLine(results); } このプログラムの修正方法、または他の方法がありましたら教えていただけるとありがたいです。

  • WindowsでPerlをする際,1行目の"#! ~"はどのように?

    Perlの参考書・本等ではプログラムファイルの第1行目は #! /usr/local/bin/perl という1行がよく有りますが,WindowsXPを用いている場合では,この1行をどう直せばよいのでしょうか? #! (perl.exeが存在するフォルダのパス) でよいのでしょうか? 私はWindowsXPを使っていて,この1行を使わずにプログラムを書いておりましたので,この1行の意味がよく分かりません。 ある参考書には,"#!はその行に書いたコマンドに,ファイルの残りの部分を渡して実行すると言う性質を持っている"と有りました。だから,試しにfile1.plとfile2.txtを準備し, file1.plの中身  #! (perlの存在するフォルダのパス)\perl.exe  while(<STDIN>){   print;  } file2.txtの中身  hello world として,コマンドプロンプトで file1.pl < file2.txt としたのですが正しく動作しませんでした.(perl file1.pl < file2.txt と入力した場合は正しく"hello world"となりました)

    • ベストアンサー
    • Perl
  • 初心者 Hello worldをしたい

    ActivePerl をインストールしました。 早速、Hello worldを表示させようと思うのですが メモ帳に「print "Hello world!!\n";」と記載して 「hello.pl」という名前で保存しました。 それをデスクトップにおきました。 その状態で コマンドプロンプトで「perl hello.pl」を実行しても Can't open perl script "hello.pl": No such file or directory (和訳:開いたperlは、「hello.pl」のスクリプトを書くことができません:そのようなファイルまたはディレクトリ) が返って来ます。 多分、デスクトップにおくのが間違いだと思うのですが どこに「hello.pl」を置いて 「perl hello.pl」を実行すればいいのでしょうか? ご教授よろしくお願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう