• ベストアンサー

windowsサーバでのディレクトリ削除方法

有料で作成していただいたPerlスクリプトについてですが、管理室でフォルダの削除ボタンを押すと「'rm' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示され、フォルダが削除できません。Linuxサーバでは正常に削除されます。作成して頂いた会社に連絡をしましたが、長期間お返事を頂けておりません。どうにかしてWindowsサーバでも正常に削除できるようにしたいと考えておりますが、私はPerlに疎いため、皆さんのお知恵をおかりしたく質問させて頂きました。著作権問題が生じますので、何処までスクリプト内容を書き込んでいいのかわかりませんが、取り敢えず以下の部分を書き込んでみます。 ------------------------------------- # ロック開始 &lock if ($lockkey); @new=(); open(IN,"$memfile") || &error("Open Error : $memfile"); while (<IN>) { ($type,$num,$name,$email,$url,$id) = split(/<>/); if ($in{'id'} eq $id) { unlink("$logdir$id\.log");#こちらは正常に削除されてます。 unlink("$logdir$id\.dat");#こちらは正常に削除されてます。 if ($type ne 'p') { use Shell qw(rm); rm("-rf","$htm_dir$us_dir/$id");#これが削除できません。 } next; } push(@new,$_); } close(IN); ------------------------------------- $htm_dirは変数宣言です。 $htm_dir = 'P:\public_html\cgi-bin/'; $us_dirは各ID($id)の入っているフォルダです。 $idはIDフォルダです。この$idフォルダの削除を試みています。 rmはLinux専用らしいので、その部分を変更するのだとは思いますが。ご存知の方がおられましたらご指導を宜しくお願い致します。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2で自作関数といっていましたが、標準モジュールで同等の関数がありましたので紹介します。 use File::Path; rmtree("$htm_dir$us_dir/$id"); を使えば、使用しているシステムに関係なく動作すると思います。

cocolink
質問者

お礼

ご回答有難うございます。おかげさまで解決することができ、本当に助かりました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

スクリプトの変更ができないということであれば、 rm コマンドのwindows 版がフリーソフトでいくつかあると思うのでそれをインストールするのがいいかもしれません。 フリーソフトのインストールができないということであれば、 スクリプトを変更するしかないです。 OSを判別して(OSの判別には、$^O 特殊変数が使えます。) #1の言われるような rmdir パス /s /q に置き換えるとか あるいは、再帰的にフォルダとファイルを削除するような関数をPerl で自作するか、(それほど難しくはありません) だと思います。 どちらかというと、色々外部コマンドに依存するより この際自作関数を作るのがいいような気がします。

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

Windows(DOS)ではrmdirです。 > 著作権問題が生じますので でしたら作者さんに直接訊きましょう。 なぜ、第三者に尋ねるのでしょうか?

cocolink
質問者

お礼

ご回答有難うございます。作成していただいた当時にもご連絡しましたが、別バグは修正して頂けましたが、この問題に関しては回答が得られず、また数週間前にも再度ご連絡いたしましたが、お返事を頂けておりません。試行錯誤していろいろ試してみましたが、自力ではどうしても解決することができませんでしたので、著作権に関係なさそうな一部分のみの投稿でしたら問題ないとの判断で質問させて頂きました。しかし著作権問題がまったく無いとも言えませんので、削除依頼を出しておきます。