- 締切済み
バッチファイルの変数引継ぎについて
行き詰ってしまったので、どなたか知恵を授けていただければと思います。 現在、あるソフトウェアの「バッチモード」という機能を使用したバッチを作成していて、構文が > sdcmd batch ***.txt 上記のようにコマンドを羅列したテキストファイルを指定した実行コマンドになります。 sdcmd以降はソフト指定のコマンド以外は使用できず、変数設定ができない為に変数設定とログ保存を兼ねて上記コマンドを記載したバッチを > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > call aaa.bat %* >> aaa.log 2>&1 という内容の呼び出しバッチを作成たのですが、テキストファイル内の変数が代入されずに 実行されてしまいます。 cmd上から直接 > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > sdcmd batch ***.txt >> aaa.log 2>&1 を実行しても変数の代入は行われませんでした。 cmd上で変数とテキストファイル内のコマンドを手動実行すれば変数は解決できます。 設定した変数を、テキストファイル内の変数値に代入する方法はあるでしょうか。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Toshi0230
- ベストアンサー率51% (836/1635)
---<quote> ソフトのヘルプファイルでは、sdcmd以降の変数(%囲い)の認識には「^%変数%^」とするよう書かれており、実際に手動コマンド実行ではこの形式で反映できております。 </quote>--- ヘルプに記載されている「変数」は、OSの環境変数ですか? それともソフトウェアのバッチ処理で使える別の変数ですか? この2つを混同してはダメですよ? > 遅延変数処理を行おうとしたのですが、 遅延変数処理の使い方が全然違います。(というか多分理解を間違えています) 詳しくはWEBの検索などを検索して調べていただくとして、環境変数の遅延展開がわかりやすい例としては、以下のような例があります。 --- normal-var.bat --- set VAR = 0 for /L %%i in (1,1,10) do set /a VAR = %VAR% + %%i echo %VAR% ----------------------- --- delayl-var.bat --- setlocal enabledelayedexpansion set VAR = 0 for /L %%i in (1,1,10) do set /a VAR = %VAR% + %%i echo %VAR% endlocal ----------------------- 実際に実行してみるとわかりますが、両者の結果は全く異なります。 %変数%は構文を読み取ったときに変数が代入されるのに対して、!変数!は実行される直前に変数に値が代入されます。ループの中で使うと違いがわかりやすいかと思います。
- Toshi0230
- ベストアンサー率51% (836/1635)
本題とは関係ないですが… newman5 さん > 情報不充分な質問、後の態度もよくない、で回答つくのかな。 バッチファイルの作成の仕方から見て、質問者さんはあまりコンピュータに詳しくない(慣れていない)人と見ました。 最初から「補足」の精度で情報が出ていたらもっと早く答えられましたけど、いちおう「何をやって、どういう結果を期待してどのように失敗した」というのが出てましたんで、まだ良い方じゃないですか?
- Toshi0230
- ベストアンサー率51% (836/1635)
えーと…突っ込みたいところはいくつかあるんですが、本題をまず処理してしまいましょう。 まず確認: 以下の構文のコマンドがあって、このコマンドで "software-command.txt"内の特定ソフトウェア上の処理を連続実行できる、ということですね? ------------------ sdcmd batch "software-command.txt" ------------------ で、この"software-command.txt" 内のコマンドに、環境変数を組み込んだんだけどそれが実行時に意図した結果に反映されない、というのが質問の趣旨ですね? 答え: このコマンドで実行されるバッチ処理が、どういう仕様で実装されているか解らないので答えようがありません。ソフトウェアを作成したメーカーのサポートに問い合わせてください。 もう少し言うと、"sdcmd batch " コマンドが実行する「バッチモード」がWindows/DOSのバッチ処理と同じという保証はどこにもありません。なので、"software-command.txt" 内のコマンドに環境変数を使えるかどうかは、"sdcmd batch " コマンドの仕様に拠ります。 > コマンドプロンプトから下記を手動実行 > set YM=%date:~-10,4%%date:~-5,2% > software-command.txt内の変数を使用するコマンド1つを単体で手動実行 これはたぶん、 C:\> sdcmd software-command option %YM% みたいな実行をしたんじゃないんですか? この場合、"sdcmd" に引数が渡される前に環境変数が処理されるので、sdcmd が処理する引数は "software-command option 200909" となり、質問者さんが期待する結果になるわけです。 どうしてもやりたければ、"software-command.txt" を毎回自動生成するようにしないと駄目なんじゃないんですかね?
no.1です > 説明が下手でお手数をお掛けします。 と言う割にお詫びのひとつもないんですね。 情報不充分な質問、後の態度もよくない、で回答つくのかな。 (って書くとつく場合もあるので期待しとけば?)
- Toshi0230
- ベストアンサー率51% (836/1635)
状況がよくつかめていないのですが… 質問者さんが バッチファイル実行時に指定した引数を、バッチファイル内のコマンドで使用したい場合、つまり、以下のような形でバッチファイルを実行したときに、 ------------- C:\> aaa.bat foo bar ------------- バッチファイル内で以下のようなコマンドが実行されるようにしたいときは、 ------------- sdcmd batch ***.txt foo bar ------------- バッチファイル内の記述を以下のようにする必要があります。 ------------- sdcmd batch ***.txt %1 %2 ------------- それから、 set var=hoge のように設定した環境変数の値を呼び出す場合は、%var% の様に"%"で変数を囲む必要があります。 以上、一般論です。 あとはもう少し詳しく状況を説明頂かないと回答できません。 (Windows/DOSのバッチファイルの話でいいんですよね?)
補足
補足および・修正、不要箇所を除去します。 [aaa.bat] sdcmd batch "software-command.txt" [software-command.txt] software専用コマンドがリストされており、一部に%YM%を使用 [call.bat] setlocal EnableDelayedExpansion set YM=%date:~-10,4%%date:~-5,2% call aaa.bat %* 簡略化すると上記のような感じになります。 >set example=sample >echo %example% sample 上記の使用方法は承知しており、software-command.txt内でも変数は%囲いで書いてあります。 テスト操作 (1) コマンドプロンプトから下記を手動実行 setlocal EnableDelayedExpansion set YM=%date:~-10,4%%date:~-5,2% sdcmd batch "software-command.txt" (2) call.batを起動 (3) コマンドプロンプトから下記を手動実行 set YM=%date:~-10,4%%date:~-5,2% software-command.txt内の変数を使用するコマンド1つを単体で手動実行 テスト結果 (1)、(2)は変数解決NG (3)は変数解決OK 説明が下手でお手数をお掛けします。
お礼
コメントいただきました皆様、ありがとうございます。 そして文章の不備等、申し訳ありません。 Toshi0230さんの認識でほぼ間違いありません。 ソフトのヘルプファイルでは、sdcmd以降の変数(%囲い)の認識には「^%変数%^」とするよう書かれており、実際に手動コマンド実行ではこの形式で反映できております。 呼び出したテキストファイル中の変数適用になる為に、通常の変数処理(%囲い)では無理だと考えて setlocal enabledelayedexpansionで遅延変数処理を行おうとしたのですが、 ソフト上で変数遅延処理の(!囲い)が適用されず、ヘルプにも記載がありませんでした。 ソフトバージョンが古すぎて、サポート契約外と言われてしまった為、ヘルプ閲覧と試行錯誤を繰り返していましたが、何をやってもバッチモードで変数適用ができないので、変数適用後のコマンド文をテキストファイルに出力させ、そのテキストファイルを使ってバッチモードで実行する、というような複数のバッチ処理に小分けして対応しようと思います。 自分の知識・認識不足により分かり辛い文章だったかと思いますが、質問して 回答を見ていくことで自分の中でも状況の再認識ができました。 本当にありがとうございました。