- ベストアンサー
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
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
起動時のカレントディレクトリが異なる理由や変え方は分かりませんが、 スクリプト側でしょっぱなに 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)を動かす分には 期待通りに動作するようです。
その他の回答 (2)
- lupin-333333
- ベストアンサー率31% (294/933)
>質問内容をよく読んだうえで、内容を一度ご自身で整理してから回答されることをお 勧めします 全く同じ事を、あなたにお返しします。 内容から、ちょっとぐぐれば、でてくるようなことを、いちいち質問してくるなんて・・・・ (別にぐぐらなくても、技術者なら、こうできるなんて、簡単に、別方法をやっています。) だから、素人用に、在る程度の予測される事を、全部記載したのですよ。最後まで読めば、こうすればできますよ、と言うアドバイスを記載しています。 内容をよく読んでから、反抗しましょうね。自作自演、釣り、宣伝、社員等に多い質問ですね。よくひっかかってやっています。 ちなみにNo2さんが提示したようなコードをラーパーて、いうのですがね。技術向けの質問・回答なので、おわかりになるかと。 もうひとつおまけに >、起動パラメータがうまく引き渡されない現象があるようです。 は、こんぴゅーたーの世界での表現としては、ありえません。
補足
僕は「こんぴゅーたーの世界」のことはよく分からないので、lupin-333333 さんの回答を読み飛ばしていました、すいません。 時間が空いたら日本食とかフランス料理について調べてみるのもいいですね。 どうもありがとうございました。
- lupin-333333
- ベストアンサー率31% (294/933)
それは、単に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の仕様を求めるような物です。 ショートカットなどラッパーを利用しましょう。
補足
質問内容をよく読んだうえで、内容を一度ご自身で整理してから回答されることをお勧めします。
お礼
ご指定のコードで、期待通りの動作を得ることができました。 ありがとうございます。
補足
【追記】 質問内容の修正はできないようなのでこちらに失礼します。 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特有の動作かもしれません)