|
760) batファイル内での変数指定 ぎゅう 2003/10/31(金) 14:31 |
|
こんにちわ いま、以下のようなコマンドを記載したバッチファイル(test01.bat)を作リました。 FOR /L %%i IN (01,1,47) DO sqlplus dbo2/***@test01 @c:\work\spool_0011_AC.sql %%i この中で、ディレクトリ名(c:\work\)を握ってしまっているのですが、これをバッチファイル実行もとのディレクトリ名を読み込むような設定にしたいと思っています。 どのような方法が考えられますでしょうか? (つまり、このtest01.batがc:\workにあれば、c:\work\spool_0011_AC.sqlを実行し、test01.batが c:\work\TESTにあるのなら、c:\work\TEST\spool_0011_AC.sqlを実行させたいのです) 何か良いヒントやお手本をお持ちの方いらしたら教えてください。 よろしくお願いいたします。 |
|
761) Re:batファイル内での変数指定 ふぇむ 2003/10/31(金) 15:20 |
|
>この中で、ディレクトリ名(c:\work\)を握ってしまっているのですが、これをバッチファイル実行もとのディレクトリ名を読み込むような設定にしたいと思っています。 >どのような方法が考えられますでしょうか? >(つまり、このtest01.batがc:\workにあれば、c:\work\spool_0011_AC.sqlを実行し、test01.batが c:\work\TESTにあるのなら、c:\work\TEST\spool_0011_AC.sqlを実行させたいのです) ふぇむ流でよければ。おおむね以下のような環境判定をバッチコマンドスクリプトの初期段階で行なっておき、後でログファイル名の元情報に使ったりしています。 簡単に言うと、%0 に実行されたスクリプト自信の起動情報があるので、それを手がかりに自分自身の存在情報をフルパスで取得し、自分の中に取り込んでいます。 また、%CD% に基づいて同じようなことをやって、起動環境のカレントディレクトリのフルパス情報も取得しておくのがふぇむ流の常道です。(さらに、与えた引数に基づい てこれらの情報をセットする汎用のサブルーチンを作ったりもしていて、実は %CD% に基づく分解はそっちを利用したりしていますが、とりあえずここでは割愛します) rem ## rem ## スクリプトの実行された環境判定 rem ## set SCRIPT=%~0 for /f "delims=\ tokens=*" %%z in ("%SCRIPT%") do ( rem ## スクリプトのあるドライブ set SCRIPT_DRIVE=%%~dz rem ## スクリプトのあるカレントディレクトリ(ドライブ除く) set SCRIPT_PATH=%%~pz rem ## スクリプトのあるカレントディレクトリ(ドライブ込み) set SCRIPT_CURRENT_DIR=%%~dpz rem ## スクリプトの名称(拡張子除く) set SCRIPT_NAME_BASE=%%~nz rem ## スクリプトの名称(拡張子込み) set SCRIPT_NAME=%%~nxz if "%%~xz" == "" ( (dir /s /b "%%~dpnxz.cmd" >nul 2>&1) && set SCRIPT_NAME=%%~nz.cmd (dir /s /b "%%~dpnxz.bat" >nul 2>&1) && set SCRIPT_NAME=%%~nz.bat ) ) if NOT "%SCRIPT_PATH:~-1%" == "\" ( rem ## ディレクトリ文字列は \ で終わるようにセット set SCRIPT_PATH=%SCRIPT_PATH%\ ) if NOT "%SCRIPT_CURRENT_DIR:~-1%" == "\" ( rem ## ディレクトリ文字列は \ で終わるようにセット set SCRIPT_CURRENT_DIR=%SCRIPT_CURRENT_DIR%\ ) |
|
762) Re2:batファイル内での変数指定 ふぇむ 2003/10/31(金) 15:28 |
|
追加です。 >>この中で、ディレクトリ名(c:\work\)を握ってしまっているのですが、これをバッチファイル実行もとのディレクトリ名を読み込むような設定にしたいと思っています。 >>どのような方法が考えられますでしょうか? >>(つまり、このtest01.batがc:\workにあれば、c:\work\spool_0011_AC.sqlを実行し、test01.bat がc:\work\TESTにあるのなら、c:\work\TEST\spool_0011_AC.sqlを実行させたいのです) 先のふぇむのサンプルに基づくと、スクリプトの存在するディレクトリのドライブ名を含むフルパス文字列が SCRIPT_CURRENT_DIR% で得られます。なおサンプル通りならばこれは必ず \ で終わっています。ので、SQLスクリプトのフルパスを set SQL_SCRIPT=%SCRIPT_CURRENT_DIR%spool_0011_AC.sql みたいにして取得できると思います。最後の \ まで含めるようにしているので、SCRIPT_CURRENT_DIR を空にすると、SQLスクリプト名が spool_0011_AC.sql だけとなります。 なお、バッチスクリプトのあるパス名は空白を含む可能性があるので、実行時に渡す引数としては、 "%SQL_SCRIPT%" と必ず "" でくくってあげる方が安全です。 |
|
763) 解決:batファイル内での変数指定 ぎゅう 2003/10/31(金) 16:00 |
|
教えていただいたように組み込んだところうまく稼動するようになりました。 しかも、詳細にご教授いただけたので、いろいろと応用がききそうです。 大変助かりました。 ありがとうございました! |
|
764) Re4:解決:batファイル内での変数指定 ふぇむ 2003/10/31(金) 17:32 |
|
>教えていただいたように組み込んだところうまく稼動するようになりました。 それはよかった。 >しかも、詳細にご教授いただけたので、いろいろと応用がききそうです。 そうですね。「スクリプトの存在するパス」や「スクリプトを起動した時のカレントディレクトリ」がは特定のスクリプトに依存するものではなく汎用的なものだし、これが取れるといろいろありがたいことが多いと思いと思いますので、ぜひご活用ください。 それから、当初スクリプト中に直接ディレクトリ名を書き込まれていらっしゃったよりは自由度は高くなっているとは思いますが、それでも「スクリプトの存在するディレクトリのものを使う」と環境的に固定されたものを参照することになりますね。 開発の初期段階や一時的な疎通レベルのテスト等も考慮すると、場合によって、一時的に起動カレントディレクトリ配下のものを使うとか、また別途指定したディレクトリのものを使うとか、環境に関する制御を外部から行なえるようにすると、もっと自由度が高まるでしょう。 例えば、スクリプトの初段において引数解析をするようにして、(スクリプトの存在するディレクトリから参照するのをデフォルトとするとして)ある時は起動 ディレクトリ配下のもの、または指定したディレクトリ配下のもの、などを実行時に指定できるようになれば、より便利になるかと思います。ロジックと環境は うまくわけるように作っておくと、後からが楽ですね。 毎回ゼロからやってると大変なので、私は、ある種雛型のようなものを育てております。バッチコマンドを組むたびに、再利用可能な汎用部分と今組みたい機能 に特化した部分をできるだけ意識してわけるようにしていて、なにか1つ組むたびにいまでも進化成長しています。上記のような機能を持つ構文やら各種汎用の サブルーチンみたいなものやらいろいろ。全て我流ですけども。(^^; コマンドバッチスクリプトは、制約は多い方ですがわりと使い勝手のいいところもあり、無理なくできる範囲の事なら書くのも結構楽なので、結構重宝しており ます。処理の心臓部はなにか外部の EXE であっても、それに渡すファイルの制御やログの制御などコントロールの部分をバッチコマンドスクリプトで書いたり、バッチコマンドの苦手な部分は awk 等他のスクリプト言語と適宜組み合わせたり。 例えば、バッチコマンドはショートカットからでも起動できるので、ショートカットを Explorer のマウス右クリックの「送る」の中に入れて使ったり。Explorer 上で選んだ複数のファイルを「送る」でショートカットに渡すと、それらが引数としてすべて渡されたバッチコマンドが起動するので、複数ファイルを引数にと るようなスクリプトを作っておくと一括処理に使えます。 これを利用して、例えば、デジカメで縦撮りしたJPEGファイルを複数選んで一気に無劣化回転させるとか、複数選んだファイルやディレクトリをそれぞれ LHA 圧縮して所定のフォルダにタイムスタンプ付きの名前をつけてバックアップとして累積保存するとか。実行ログもそれぞれ累積させており、あとから確認も容易 です。ログイン時/Daily/Weekly/Monthlyのバックアップを、バックアップエンジンは NTBackup.exe を利用するもののそのコントロールを全てバッチコマンドスクリプトで組んでいたりとか。個人的にはちょいちょいそんなふうに使っています。 すみません、余談でした。 |