浩介さん、
TMPが全角空白を含む時は "" で括るようにするつもりです。
一応、環境変数を変更することで動きました。
>浩介さんも自分で管理できるパソコンならAN HTTPDをサービスで動かせば当面問題はないということに?
ユーザ環境変数のパスをC:\WINNT\TEMPとか短いものに書き替えるという手もあります。AnHTTPDが独自に一時ファイル用のパスを持つより解決策として美しいと思います。
えむけいさん、
なるほど、Win2000 の cmd.exe がファイルパス中の全角空白をスペースと解釈するならわかりますね。
""で括ることにしましょう。
どうもありがとうございました。
いとさんの、
d:\httpd\test\井上 浩介\test.cgi
はコマンドライン引数なので、cmd.exe がファイルパスとして解釈するわけではありませんから、それでいいのだと思います。
えむけいさん。
確かにサービスとして使っています。TEMPが変わるのはそのためなのですね。
> ただ、ごくまれにユーザ環境変数が使われることがあるというのは謎が残りますが…。
こればAN HTTPDをバージョンアップしたときに、一旦アンインストールしサービスにせずに
そのまま使ったときの痕跡だとすると謎は全て解けます。
2月にWin98からWin2000に変え、まだまだ知らないことばかりで、勉強になりました。
浩介さんも自分で管理できるパソコンならAN HTTPDをサービスで動かせば当面問題はないということに?
>AN HTTPDが変えていないとするとなぜTEMPが変わる(変わらないときもある?)のか不思議です。
>さらに、浩介さんの場合にはなぜ C:\WINNT\TEMP\* にならないのか?
>えむけいさんも私とは違うようなので、私だけがおかしい?
An HTTPDをサービスとして使っていませんか?
Windows2000ではTEMPやTMPがユーザごとに切り替わりますが、サービスはシステム環境変数のTEMPやTMPを使います。システムのプロパティの「詳細」の「環境変数」で、システム環境変数とユーザ環境変数を確認できます。
ただ、ごくまれにユーザ環境変数が使われることがあるというのは謎が残りますが…。
中田さん、浩介さんの関連で情報提供します。
私のWin2000パソコンのprocess.logは、ここ1カ月を見るとほとんどが
H:\WINNT\system32\cmd.exe /C perl .\count\count.pl < H:\WINNT\TEMP\stdin.0 > H:\WINNT\TEMP\1.0
のように出ているのですが、ごくごくまれに
H:\WINNT\system32\cmd.exe /C perl .\count\count.pl < H:\DOCUME~1\yito\LOCALS~1\Temp\stdin.0 > H:\DOCUME~1\yito\LOCALS~1\Temp\1.0
となっているときもあります。
コマンドプロンプトで SET と打つと
TEMP=H:\DOCUME~1\yito\LOCALS~1\Temp
TMP=H:\DOCUME~1\yito\LOCALS~1\Temp
と出ます。Win2000のシステム情報の環境変数はTEMP,TMPとも %USERPROFILE%Local Settings\Temp
なのでその通りなのですが、AN HTTPD のREADMEの中の単純なテストでは
TEMP=H:\WINNT\TEMP
TMP=H:\WINNT\TEMP
と表示します。
AN HTTPDが変えていないとするとなぜTEMPが変わる(変わらないときもある?)のか不思議です。
さらに、浩介さんの場合にはなぜ C:\WINNT\TEMP\* にならないのか?
えむけいさんも私とは違うようなので、私だけがおかしい?
なお、「井上 浩介」というフォルダを作ってCGIを置いても何の問題もなく動きます(以下はprocess.log)。
H:\WINNT\system32\cmd.exe /C perl d:\httpd\test\井上 浩介\test.cgi < H:\WINNT\TEMP\stdin.0 > H:\WINNT\TEMP\1.0
>ユーザ名のところがショートネームに変換されていないのと、半角スペースがないのに cmd.exe がファイルの存在を認識していないのがおかしいですね。
>Win2000 の Documents and Settings\ユーザ名 のディレクトリは何か特別なのかもしれません。
面白そうだったので試してみました。私の環境ではちゃんと短い名前に変換されたのでなぜ変換されていないのかは分かりませんでしたが、Windows2000のcmd.exeはパスが全角スペースを含んでいる場合も""で括らないとパラメータを正しく解析できないようです。
これに対処すれば認識させられるような気がします。
浩介さん、
なるほど。単にロングネームの問題ではなさそうです。
ユーザ名のところがショートネームに変換されていないのと、半角スペースがないのに cmd.exe がファイルの存在を認識していないのがおかしいですね。
Win2000 の Documents and Settings\ユーザ名 のディレクトリは何か特別なのかもしれません。
というわけでそれを回避するため、次のバージョンでは一時ファイルを作成するディレクトリを別途指定できるようにしようと思います。
process.logです。
Fri Mar 17 03:56:44 2000 C:\WINNT\system32\cmd.exe /C c:\Perl\bin\perl.exe C:\work\html\lab\bbs.cgi < C:\DOCUME~1\井上 浩介\LOCALS~1\Temp\stdin.0 > C:\DOCUME~1\井上 浩介\LOCALS~1\Temp\1.0
浩介さん、
なるほど、一時ファイルのパスの問題でしたか。 失礼しました。
もっともその問題なら、1.23 で対処したので最新バージョンであれば大丈夫のはずです。
1.23 以降のバージョンを使っていてそのエラーなら、また別の原因かもしれません。
その場合は process.log をとってその中身をお知らせ下さい。
いとさん。
ズバリでした。でも、いまさらこのためだけに再インストールはできません・・・
CGI関係はしばらくWin98で作業するしかないですね。
どうか対処をお願いしたいです・・・・> 中田さん
浩介さん。
Windows2000でコマンドプロンプトなら正常、CGIだと「Error 500」&「指定されたファイルが見つかりません」が出るのは、かむかむさんのケースと似ているという気がしますが。
>perl.exe のフルパス指定が間違っていませんか?
インストール先は c:\Perl\bin\Perl.exe です。
設定画面のperlのパスをコピーして、コマンドプロンプトに貼り付けたら
ちゃんとperlが起動するんです。
これは何度も確認しました。環境はWindows2000です。
浩介さん、
「指定されたファイルが見つからない」つまり、perl.exe が見つからないのでスクリプトが動作せず、したがって Content-type を出力しないのでそういうエラーになります。
perl.exe が見つからなければスクリプトがいくら正しくても動くわけはありませんし、どんなスクリプトも動きませんね。
Perl をどこにインストールしましたか? デフォルトでは C:\Perl ですが、その場合フルパスは C:\Perl\bin\perl.exe になります。
perl.exe のフルパス指定が間違っていませんか?
>それでいいはずなのですが、500エラーに続いてどういうメッセージが出ていますか?
以下のようなメッセージが出ます。
でも、Content-Typeヘッダは間違っていません。
PerlIS.dllを使った場合はちゃんと動きますし、
そのままプロバイダのサーバに転送してちゃんと動きます。
どんな簡単なCGIでも同じエラーが出ます。
--
Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
指定されたファイルが見つかりません・p>
浩介さん、
opendirの件は、コマンドラインで確認する場合は perl.exe を使うことになるので、要は PerlIS.dll のバグでしょうということです。
>一番下のdllに関する設定のチェックをはずし、「.pl,.cgiの実行」にperl.exeのフルパス を書くだけじゃダメなのでしょうか?
それでいいはずなのですが、500エラーに続いてどういうメッセージが出ていますか?
>Autoexec.batでperl.exeのあるディレクトリのパスをセットしていますか?
>セットしていないと、そのような症状になったはずです。
インストールしなおしましたが、パスを追加するオプションをチェックしても
autoexec.batは空ファイルのままです。
自分でpathを書けばいいのでしょうか?
でも、autoexec.batの書き方は当の昔に忘却・・・
どうしたらいいのでしょうか?
浩介さんへ
私も同様の症状の経験があります。
Autoexec.batでperl.exeのあるディレクトリのパスをセットしていますか?
セットしていないと、そのような症状になったはずです。
ActivePerlをもう一度インストールすれば良いはずです。
>PerlIS.dllを使う設定でしょうか?
そうです。PerlIS.dllを使わない設定だと500エラーになってしまいます。
>だとすると PerlIS.dll ではおかしくて perl.exe では大丈夫という話だと思います。
その方法がわかりません・・・。
>opendir の前に chdir などは使っているでしょうか?
使っていません。opendirのみです。
>また、perl.exe (と、使っているなら PerlIS.dll)のバージョンは何かお知らせ下さい。
perl.exeは、ActivePerl の5.2.2.0、PerlIS.dllも同様です。
一番下のdllに関する設定のチェックをはずし、「.pl,.cgiの実行」にperl.exeのフルパス
を書くだけじゃダメなのでしょうか?
浩介さん、
PerlIS.dllを使う設定でしょうか? だとすると PerlIS.dll ではおかしくて perl.exe では大丈夫という話だと思います。 opendir の前に chdir などは使っているでしょうか?
また、perl.exe (と、使っているなら PerlIS.dll)のバージョンは何かお知らせ下さい。
いつも重宝させていただいております。
Windows2000での不思議な現象(?)を発見しました。
perlのCGIで
opendir(DIR, "abc") || die 〜;
を実行すると、必ず die のルートに行ってしまいます。
コマンドプロンプトでcgiを叩くと正常に動くのですが・・・
opendir(DIR, "./abc") || die 〜;
とすると、httpd経由でも正常に一覧取得ができます。
Windows98/NT4では再現しません。