Perlでスペースを含むファイルの実行方法

このQ&Aのポイント
  • Perlでファイル名を取得し、スペースを含むファイルをエディタから開く方法について調べています。
  • system関数ではエディタを閉じるまでPerlが開いたままになってしまうため、execコマンドを使用したい。
  • しかし、実行中のコマンドにスペースが含まれているため、正常に動作しないエラーが発生している。回避方法を知りたい。
回答を見る
  • ベストアンサー

スペースを含むファイルの実行(exec)

Perlでファイル名を取得し、そのファイルをエディタから開こうとしています。この時、初めsystem関数を使用していたのですが、これだと、呼び出したエディタを閉じるまで、Perlが開いたままになってしまうため、execコマンドを使用しようとしたのですが、うまく動作しません。どのようにしたらいいかお教え願います。 system関数で動作している時のスクリプトは下記の通りです。 $editor = '"C:/Program Files/Hidemaru/Hidemaru.exe" /c.txt '; #エディタの場所 $filename = 'D:/data/file.txt'; #開きたいファイルの場所 $openfile = "$editor\"$filename\""; system("$openfile"); 上記のプログラムで動作しているのですが、これを単純にexec関数へ置き換えると下記のようなエラーとなり、動作してくれません。 「>'C:/Program' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 どうやら、Program filesのスペースが問題のようなのですが、これをうまく回避する方法はありますでしょうか。 ちなみに、 exec $editor; だけですと、エディタが起動してくれます。このため、もしかしたらファイル名のスペースだけの問題ではないのかもしれませんが、よく分かりません。皆様のご助言をよろしくお願いいたします。

  • pelab
  • お礼率100% (3/3)
  • Perl
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

まったく理由はわからないんですが, 1.開きたいファイルの方から " を取り除く 2.次のようなスクリプトを作って, こいつを呼出す形にする @%* のどちらかだとうまくいく感じです. あ, 手元の perl は ActivePerl 5.8.6 で, Windows XP Professional SP2 で確認しました. perl 内部~Windows 内部のどこかがあやしいんですが, どこがあやしいかについては見当がつきません.

pelab
質問者

お礼

早速の回答ありがとうございました。 試してみましたが、うまく動作しました。私もなぜ「"」を取るとうまく動作できるのか理解できません。 ただ、確実に動作しました。 ありがとうございました。

pelab
質問者

補足

Tacosanの1.の方法で動作すると書きましたが、確かに、動作します。ただ、これですと、system関数と同様に、なぜだか、Perlシステムは待ち状態になっているようです。ActivePerlの窓がファイルを開いている間、タスクバーに現れていました。昨日は、動作したことのうれしさの余り気がつきませんでした。 また、2.の方法は具体的には、どのように書けばいいのかお教え願えないでしょうか。 何分、初心者で申し訳ありません。 なお、私が使用している環境は、 Windows XP SP2でACtive Perl 5.8.8です。 再度、お教え願えれば幸いです。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

え~, exec に成功した時点で perl の実行そのものは終わっているはずです. 実際, コマンドプロンプトから perl を実行すると, exec をした時点でプロンプトに戻ります. 「コマンドプロンプト以外から実行」したら, どうなるかは知りません. やったことがないので. ついでに 2 の方ですが, 例えば @$% という内容のファイルを c:\windows\do-ext.cmd という名前で作っておいて, perl のスクリプトでは exec "c:/windows/do-ext.cmd $editor ~"; と書けばいい... と思います.

pelab
質問者

お礼

Tacosan> そのようです。コマンドプロンプトからでしたら、うまく動作しました。どうやら、エディッタ側とのやりとりでうまくいっていないみたいです。 その辺は、今後詰めていこうと思います。この頃、急に忙しくなってしまい、ゆっくりやっていこうと思いますので、今回の質問はこれで締め切ろうと思います。 皆様、ありがとうございました。

  • hito-koto
  • ベストアンサー率53% (14/26)
回答No.1

$editor にも $filename と同じように、ダブルクオートでくくってやればいいのではないでしょうか。

pelab
質問者

お礼

早速のご回答ありがとうございます。 ご教授いただいた内容は、 $openfile = "\"editor\"\"filename\""; exec $openfile; といった感じでよろしいのでしょうか。 これですと、確かに、開きたいファイルfile.txtは開くのですが、もうひとつ新規のファイルも起動してしまい、意図した動作とはなりませんでした。 私の理解不足でしたら申し訳ありません。

関連するQ&A

  • 秀丸の起動時パラメータで目的ファイルを指定?

    windpows10をクリーンインストールしてプログラム群をインストールしています。 秀丸の段階で、 コマンドプロンプトで、基本を確認するためフルパスで指定しましたが、編集したいファイルが表示されません。 こんなことはなかったと思うのですが、堂々巡りで分からなくなってしまいました。 c:\"program files"\hidemaru\hidemaru ---> 秀丸が起動、空白ファイル test.txtを開くことはできる c:\"program files"\hidemaru\hidemaru test.txt ---> 秀丸が起動、空白ファイル c:notepad test.txt ---> 正常に開かれます。 目的ファイルを起動時パラメータとして指定できないことはなかったと思うのですが・・・・。わからなくなってしまいました。

  • 開いたファイルを閉じるには?

    Cのプログラムで system関数を使うとDOSコマンドが使えるので、 txtファイルを(ノートパッド)開くことができます。 開いたtxtファイルを Cのプログラムまたは、DOSコマンドで 閉じるのには、どうしたら良いですか? 教えてください。 お願いしますm(._.)m (不可能ならば、不可能と教えてください。)

  • exec を使ってcmdを動かす

    現在、javaのexec関数を使ってcmdを実行したいのですが、うまく動作しなくて困っています。 ソースコードで説明すると、 try { Runtime r = Runtime.getRuntime(); Process p=       r.exec(newString[{"cmd.exe","/k","del","a.txt"}); } catch { } この様なソースでcmdを立ち上げて、a.txtというファイルを消去したいのですが、このプログラムを実際に動かすとa.txtはきえず、またcmdの画面も表示されません。 しかし、エラーは表示されずまたcmd.exeをnotpad.exeに変更するとちゃんとnotpadが立ち上がります。 どのあたりのソースがおかしいのでしょうか?ご指摘お待ちしております。

    • ベストアンサー
    • Java
  • パスからファイル名を抽出

    度々お世話になります。 C++でファイルパスからファイル名を求めるには どのようにすればよいでしょうか? 例) "C:\Program Files\Folder1\FileName.txt"という 文字列からFileName.txtだけを抽出したい 初心者で申し訳ないですが、ご教示ください。

  • テキストファイルの右クリックメニューに印刷を追加す

    win7 64bitを使っています。 pdfファイルを右クリックすると印刷という項目があるのですが テキストファイルではこれがなぜかありません。 これを追加する方法を教えてください。 印刷ジョブにD&Dにテキストファイルを入れてみても このファイルを印刷できません。正しいアプリケーションからファイルを開いてから、印刷してください。 というエラーがでて印刷できません。 レジストリを確認してみると、 HKEY_CLASSES_ROOT\txtfile\shell\print というキーには %SystemRoot%\system32\NOTEPAD.EXE /p %1 が入っています。 system32をsystemに書き換えてみましたがうまくいきませんでした。 いまテキストファイルは秀丸エディタに関連付けられているため、 HKEY_CLASSES_ROOT\hidemaru.txt を確認してみましたが "C:\Program Files (x86)\Hidemaru\Hidemaru.exe" /p %1 が入っています。 印刷できるかは別としてprintというキーは存在するため 右クリックメニューに印刷という項目は出てきても良いと思うのですが なぜうまくいかないのでしょうか?

  • 外部プログラム実行について

    PerlからMifesのマクロを動かしたいのですが、外部プログラムを実行させるにはsystem関数とexec関数があるみたいですが、どっちを使えばいいのでしょうか? また、PerlからVBAを操作したりすることはできるんですか?どのように書いたらいいか、詳しい方法を教えて頂きたいです。

    • ベストアンサー
    • Perl
  • PHPからexecを使ってGnuPGを実行できない

    GnuPGをPHPからexec関数を使って実行しようとしていますが、exec関数がエラーになって GnuPGが実行されません。 ただしexec関数に渡すコマンドをコマンドラインから直接打ち込むと正常に実行されます。 具体的には $cmd = "/usr/local/bin/gpg --always-trust --batch --no-secmem-warning -e -a -r ユーザー名 ファイル名のフルパス"; $ret = exec( $cmd, $output, $ret_val ); ここで$retにFALSEが、$ret_valには2が返ってきます。 $cmdのコマンドをコマンドラインから実行すると正常に実行されます。 環境 Apache/1.3.27 (Unix) (Red-Hat/Linux) GnuGP 1.4.6 PHP Version 4.3.11(セーフモードはOff) 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • exec()で他ディレクトリのexeプログラムを実行したい

    url2bmpという、指定したURLのスクリーンショットを作成できるコマンドライン対応のソフトを使用しています。これをPHPから実行させたく、exec()関数を使っています。PHPプログラムとexeプログラムは同じ階層にあり、コードは exec("url2bmp.exe 以下、引数"); のようにしており、問題なく動作していました。 その後、url2bmp.exeを1階層下のフォルダに移し、コードも修正したのですが、動かなくなってしまいました。コードは以下の通りで exec("kasou/url2bmp.exe 以下、引数"); ディレクトリ指定は間違っていないはずであり、原因は明らかにurl2bmp.exeがPHPプログラムと同じディレクトリにないことなのですが、これの対処法は存在しないのでしょうか?同じコードをコマンドプロンプトで実行するとうまくいくのに、exec()関数では動かないという点に納得がいきません。

    • ベストアンサー
    • PHP
  • PHP(Windows)でコマンド実行

    Windows上のapacheとPHPで、ベーシック認証のIDとパスワードを登録する仕組みを作成しているのですが、execが思ったように動きません。 以下にその部分だけを実行できるものを書きます。 <?php $com="C:\\Program Files\\xampp\\apache\\bin\\htpasswd.exe C:\\Program Files\\xampp\\apache\\.htpasswd id pass"; //$com="\"C:\\Program Files\\xampp\\apache\\bin\\htpasswd.exe\" \"C:\\Program Files\\xampp\\apache\\.htpasswd\" id pass"; //$com="dir"; exec($com,$output); print_r($output); ?> 原因はなんとなく、プログラムとパスワードファイルのパスの中にあるスペース(Program Files)だと思い、二重引用符で囲ってみたりした(一つ目のコメントのように)のですが、結果は同じでした。 二つ目のコメントのようなdirコマンドはちゃんと動きます。 どのようにすれば、パスを指定した実行ファイルが動作するのでしょうか?

    • 締切済み
    • PHP
  • コマンドライン実行とPHPのEXEC実行

    C言語プログラムの不具合に悩んでいます。 ◇以下抜粋ソース static int a=0; ・・・ int 関数A(){ /*別ファイルで使用*/ ・・・   a=256; ・・・ } int 関数B(){ int i; ・・・ for(i=0;i<a;i++){ if(for文を抜ける条件){break;} } if(i==a){ printf(エラー!);} ・・・ } ◇以上抜粋ソース 上記のソースより常にi=a=0になってしまうので常にエラーとなる気がするのですがいまいち確信が持てません。 というのも、このソースは他の人から頂いたもので、コマンドラインから実行すると何故か100パーセント正常動作するのです。 しかしブラウザを起動して、PHPファイルにアクセスし、PHPのEXEC関数から実行すると3回に1回ほどの割合で(エラー!)がでます。 3回に2回は正常動作します。 似たような不具合を御経験の方がおられれば何卒御教示ください。 よろしくお願いします。

専門家に質問してみよう