• ベストアンサー

Windows 7でのカレントディレクトリについて

エクスプローラからPerlを起動する際のカレントディレクトリが、Windows 7 (x64) と Windows XPで違ってしまいます。 Windows XPの場合は起動した.plファイルの場所がカレントディレクトリとなり、特に問題はないのですが、Windows7の場合 C:\Windows\System32 がカレントディレクトリになってしまうようです。 以下の前提条件で、Windows 7 でも XPと同様の動作を実現する方法はないでしょうか。 [起動方法] .plファイルを右クリック ⇒「プログラムから開く」⇒ Perl Command Line Interpriter (既定のプログラムはメモ帳に設定) [環境] Windows (7 x64 or XP) + ActivePerl 5.14.2

  • Perl
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • e_watt
  • ベストアンサー率71% (25/35)
回答No.2

起動時のカレントディレクトリが異なる理由や変え方は分かりませんが、 スクリプト側でしょっぱなに chdir(dirname($0)); のようにして 明示的に移動してしまってはいかがでしょうか。 use Cwd; use File::Basename; my $scriptDir = dirname($0); # あるいは __FILE__ から取り出す printf("%s: %s\n", '$0', $0); printf("%s: %s\n", '__FILE__', __FILE__); printf("%s: %s\n", 'cwd', cwd()); printf("%s: %s\n", 'ENV-p', $ENV{'PWD'}); printf("%s: %s\n", 'ENV-s', $ENV{'SCRIPT_FILENAME'}); # CGIで動かすときはこれを使う?(未確認) print "\n*** chdir to $scriptDir\n"; chdir($scriptDir); printf("%s: %s\n", 'cwd', cwd()); $0 や __FILE__ に「フルパス」が入っているかどうかは環境依存らしいですが、 Windows(7(x64) および XP(x86)) で ActivePerl (5.14.2)を動かす分には 期待通りに動作するようです。

blackrod
質問者

お礼

ご指定のコードで、期待通りの動作を得ることができました。 ありがとうございます。

blackrod
質問者

補足

【追記】 質問内容の修正はできないようなのでこちらに失礼します。 ActiveStateのフォーラムに以下のような記事を見つけました。 http://community.activestate.com/forum-topic/cannot-pass-command-line- Windows Vistaにおいて「プログラムから開く」からPerl Command Line Interpreterを選択した場合、起動パラメータがうまく引き渡されない現象があるようです。 また、Process Explorerで起動方法によるプロセスの状況を調べたところ、Windows7においては以下のような構成となっていました。 [プログラムから開く⇒Perl Command Line Interpreter] svchost.exeの子プロセスとして起動(Current Directory は C:\Windows\System32\) [ファイルを開くプログラムの選択⇒Perl Command Line Interpreter(またはダブルクリック)] 親プロセスなしで起動(Current Directory なし) これが直接的な原因かどうかはわかりません。 (サンプルプログラムを作成して確認したところ、どちらのケースでも起動パラメータは正常に取得できましたので、ActivePerl特有の動作かもしれません)

その他の回答 (2)

回答No.3

>質問内容をよく読んだうえで、内容を一度ご自身で整理してから回答されることをお 勧めします 全く同じ事を、あなたにお返しします。 内容から、ちょっとぐぐれば、でてくるようなことを、いちいち質問してくるなんて・・・・ (別にぐぐらなくても、技術者なら、こうできるなんて、簡単に、別方法をやっています。) だから、素人用に、在る程度の予測される事を、全部記載したのですよ。最後まで読めば、こうすればできますよ、と言うアドバイスを記載しています。 内容をよく読んでから、反抗しましょうね。自作自演、釣り、宣伝、社員等に多い質問ですね。よくひっかかってやっています。 ちなみにNo2さんが提示したようなコードをラーパーて、いうのですがね。技術向けの質問・回答なので、おわかりになるかと。 もうひとつおまけに >、起動パラメータがうまく引き渡されない現象があるようです。 は、こんぴゅーたーの世界での表現としては、ありえません。

blackrod
質問者

補足

僕は「こんぴゅーたーの世界」のことはよく分からないので、lupin-333333 さんの回答を読み飛ばしていました、すいません。 時間が空いたら日本食とかフランス料理について調べてみるのもいいですね。 どうもありがとうございました。

回答No.1

それは、単にUACにかかわる、「管理者として実行」の弊害ではないでしょうかね? 分からなければ、”Windows7 UAC 管理者として実行” http://search.yahoo.co.jp/search?b=1&n=10&ei=UTF-8&fr=ie8sc&p=%E2%80%9DWindows7+UAC+%E7%AE%A1%E7%90%86%E8%80%85%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E2%80%9D で検索してください。 http://search.yahoo.co.jp/search?p=%22Perl%20Command%20Line%20Interpreter%22%20%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83&sp=1&n=10&ei=UTF-8&fr=ie8sc&SpellState= それと、"Shell とは" "CMD" "起動パスの変更" などで検索してください。 通常、アプリが指定していない限り、ユーザーホームが起動ホームになります。CMD環境で >set でUSERPROFILEですね。 システムのホームはsystem32ですね。 XPの仕様をWindows7に求めるのは、日本食レストランで、フランス料理を注文するほど、ばかげたことであり、意味がありません。スマホでWindows7の仕様を求めるような物です。 ショートカットなどラッパーを利用しましょう。

blackrod
質問者

補足

質問内容をよく読んだうえで、内容を一度ご自身で整理してから回答されることをお勧めします。

関連するQ&A

  • カレントディレクトリについて

    MS-DOSの頃、Basicプログラミングではカレントディレクトリというのが重要・便利でした。 さて、現在のWindowsのVBプログラムでは、このカレントディレクトリはどの様に扱えば良いのでしょう? MS-DOSの時と同じ扱いで良いとか、全く考えない方が良いとか、こんな場合は考慮すると便利ですよとか。 色々意見を聞かせて下さい。

  • カレント・ディレクトリを常にタイトルバーに表示したい

    Windows XPのコマンド・プロンプト(cmd.exe)で、カレント・ディレクトリを常にタイトルバーに表示する方法はないでしょうか? プロンプト文字列を">"一文字にしてすっきりさせたいのですが、カレントディレクトリも常にわかるようにしたいと思っています。

  • カレントディレクトリ内のファイルを配列に読むには?

    カレントディレクトリ内のファイルの中で指定した拡張子のファイルを全て配列に読み込ませるプログラムを書こうと頑張っています。 しかし、方針がわからず困っています。 方針だけでも良いので教えていただけないでしょうか? よろしくお願いいたします。

  • カレントディレクトリの取得

    お世話になります。 バッチファイルでの処理中にカレントディレクトリをフルパスで取得し 変数に値を格納したいのですが、やり方が分かりません。。 いろいろ調べた結果、カレントディレクトリの取得は「CD」 変数への格納は、「==」or「set」なのかな?ってぐらいの知識レベルです。 上記のコマンド以外でも構いませんので、カレントディレクトリを取得し 変数に値を格納する方法を、記述の仕方を含めてご教示くださいませ。 宜しくお願い致します。

  • find関数が1階層(カレントディレクトリ)にしか利きません。

    find関数が1階層(カレントディレクトリ)にしか利きません。 Active Perl+MS-DOS(WindowsXP)の環境です。 深い階層を持つディレクトリAで  find(\&dirfiletotal,'.'); を実行し、特定のファイル名を検出しています。 なぜかカレントディレクトリ(A)にあるファイルに対してしか動作しません。(結果は正常です。) find関数は再帰的、つまり下の階層も含めてファイル検出するのだと思っていましたが、間違いでしょうか? もし間違いであれば、どのように書き変えればいいか、ヒントをいただけると大変助かります。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • カレントディレクトリ内のファイル検索

    Windows2003環境で、カレントディレクトリ下に存在するwmvファイル数をカウントしたい。UNIXでいう[find ./ -name *.wmv |wc -l] 何かよい方法はありませんでしょうか?

  • Cronでのカレントディレクトリについて

    3日前からVine Linuxを初めてインストールしまして、 自宅サーバをやろうとしている、初心者です。 これまではxrea.comのレンタルスペースを借りてphpでコンテンツを作っていました。 phpをCronを使って、定期的実行する際に [シェルファイル] #!/bin/sh #PHP /usr/bin/php /var/www/html/filename.php exit のようにしてファイル操作をするphpを実行させたのですが [filename.php] <?php $fp=fopen("../data/dat.txt","w"); fputs($fp,$data); fclose($fp); ?> で実行したところURLからは問題なく dat.txt の内容を編集することができるのですが cronからだと PHP Warning: fopen(../data/data.txt): failed to open stream: No such file or directory となります。 そこでカレントディレクトリを調べると /root/PHPs/ となっていたので、そのようなエラーになっていました (1)カレントディレクトリを変更するコードを毎回phpに組み込む (2)フルパスでファイルを指定する ことでこのトラブルは回避されるのですが、 xrea.comでは、相対パス、カレントディレクトリを毎回指定しなくても、実行できていました。 cronでphpを実行する際に、phpが存在するディレクトリへ 自動でカレントディレクトリを移動するようにしたいです。 そのような方法があれば、教えてくください。

  • Javaでカレントディレクトリを移動するには?

    Javaの中で、カレントなディレクトリを移動させ、相対PATHで既存ディレクトリを認識させたいのですが、期待する結果が得られません。 Javaの中でカレントディレクトリを移動する場合、System.setProperty()メソッドを利用して、"user.dir"を書き換えれば良いと思ったのですが、間違いでしょうか? 間違いである場合、Javaの中ディレクトリを移動させる方法はあるのでしょうか? 以下のプログラムは、下記状況下にて実行したものです。 C:\Java |-app ←プログラムを実行時にいるフォルダ |-sub ←相対PATHで認識させたい既存フォルダ ----------- ソース -------------------------- import java.io.*; class TestTest { public static void main(String args[]) { System.out.println("Current dir : " + System.getProperty("user.dir")); System.out.println("Move Dir !"); System.setProperty("user.dir","C:\\Java"); System.out.println("Current dir : " + System.getProperty("user.dir")); File f = new File("sub"); System.out.println("Dir existance : " + f.exists()); } } --------------------------------------------- ----------------実行結果---------------------- C:\Java\app>java TestTest Current dir : C:\Java\app Move Dir ! Current dir : C:\Java Dir existance : false ←trueにならない! --------------------------------------------

    • ベストアンサー
    • Java
  • Windows 7のインストールディレクトリ名変更

    Windows 7をインストールする際、既定のインストールディレクトリ名を変更する方法はないでしょうか? 更に「Program Files」や「Documents and Settings」などの変更もインストール段階でできればいいのですが。 XPではこれらが可能で実際やっているのですが、随分昔のことでハッキリとは方法が思い出せません。

  • カレントディレクトリの変更に関する質問

    Perlの関数で「chdir」と言うカレントディレクトリを変更する関数を使いたいのですが 今持ってる本を見ると、説明に chdir 式 と書いてあるのですが、その式(引数)には何の式を入力すればいいのでしょうか 出来れば例も示してくだされば嬉しいです (パスの事だと思いパスを引数にしてみましたが、失敗したみたいでした(Find関数内で使用)) ちなみにOSは、WINDOWSです

    • ベストアンサー
    • Perl

専門家に質問してみよう