195) 配列変数 フロレンティア 2003/03/26(水) 00:59 |
|
こんにちは 基本的な質問で恐縮なのですが、 DOSに配列(1個の変数に複数の値を格納数)はありますでしょうか? 過去の書き込みにありましたfoeachのような処理で、 処理する値をファイルからではなくて変数からもってきたいのですが・・ |
|
196) Re:配列変数 YanaKen 2003/03/30(日) 05:41 |
|
フロレンティア さん こんにちは。 >基本的な質問で恐縮なのですが、 >DOSに配列(1個の変数に複数の値を格納数)はありますでしょうか? DOSにせよ、WindowsNT系のコマンド・プロンプトにせよ、環境変数には(という趣旨の質問かと思いますが)配列とかの概念は特にないです。 擬似的に TEST1 TEST2 TEST3 みたいに連番の環境変数を使うことぐらいならできますけど、それをひとまとめに扱うようなコマンドや文法はないので、あまりうまくは扱えないと思います。 >過去の書き込みにありましたfoeachのような処理で、 >処理する値をファイルからではなくて変数からもってきたいのですが・・ 具体的な処理がよくわかんないのでなんともいえないですが、逆に「ファイル」の扱いということを少し広く考えれば、いろいろな方法が考えられるんではないかという気がしました。 たとえば"TEST"というディレクトリを仮に作って"0"..."99"という名のファイルをそこに作り、それぞれの中身にテキストデータを格納したとすれば、実用上それは100個の要素を持つ TEST という名の配列変数と同様に扱うことができます。 少なくともWindowsNT系ではFORコマンドで随時それらの「配列変数」の内容をバッチファイル内から参照することが可能ですし、ランダムにどれか1つを選びだすことなどもできます。 そういう観点でなら「配列」は扱える(ただしファイルシステムの活用が前提な)わけで、しかし、それと似たことをファイル入出力抜きでやることは極めて困難だと思います。 YanaKen [個人homepage ]http://homepage3.nifty.com/yanaken/ [@pay窓口 ]http://pay.nifty.com/pay/servlet/pr?i=BDKQ048560 [@pay導入について]http://bbs1.nifty.com/mes/cf_wrent/FPCU_B017/ |
|
205) Re:配列変数 ふぇむ 2003/04/18(金) 08:30 |
|
>過去の書き込みにありましたfoeachのような処理で、 >処理する値をファイルからではなくて変数からもってきたいのですが・・ フロレンティアさま ふぇむです。結構強引ですが、書けなくはないですよ。 ただそこまでして配列アクセスにこだわる必要があるとは思いませんが... ふぇむは下記のようなサブルーチンを書いてます。 :POINTER_EXPAND rem ## rem ## 変数の間接展開 rem ## rem ## %1 で指定された文字列の名称の変数の内容を変数名に持つ変数の値を rem ## %2 で指定された文字列の名称の変数にセットしてリターン rem ## rem ## 例: 変数 %ABC% が XYZ で、%XYZ% が 12345 の場合 rem ## call :POINTER_EXPAND ABC VALUE rem ## の結果は %VALUE% で指定された変数に 12345 がセットされる rem ## rem ## ただし、^ や | 等の、コマンドライン上で意味のある分離文字を含まないこと! set __ARG1=%1 set __ARG2=%2 set __EXPAND_1= for /f %%z in ('echo %%%%__ARG1%%%%') do set __EXPAND_1=%%z set __EXPAND_2= for /f %%z in ('echo %__EXPAND_1%') do set __EXPAND_2=%%z if "%__EXPAND_2%" == "%%%__ARG1%%%" ( rem ## %__EXPAND_2% と %%%__ARG1%%% の内容が同じ場合は rem ## 空だったとみなして空にセット set __EXPAND_2= ) set %__ARG2%=%__EXPAND_2% goto :eof これを使うと、こんな感じでかけます。 @echo off setlocal set BASE=ARRAY set ARRAY_0=ABC set ARRAY_1=DDD set ARRAY_2=EEE set ARRAY_3=AFF set ARRAY_4=ACC set ARRAY_5=XXC set ARRAY_6=VGG set ARRAY_7=DGR set ARRAY_8=BHH set ARRAY_9=1234 for /l %%z in (0,1,9) do ( call :ARRAY_ACCESS_ROOT %%z %BASE% ) goto :end :ARRAY_ACCESS_ROOT set _INDEX=%~1 call :ARRAY_ACCESS "%~1" "%~2" RET echo index -- %_INDEX% = %RET% goto :eof :ARRAY_ACCESS set __INDEX=%~1 set __BASE=%~2 set __RET=%~3 set __ARRAY_ELEMENT=%__BASE%_%__INDEX% call :POINTER_EXPAND %__ARRAY_ELEMENT% __VALUE set %__RET%=%__VALUE% goto :eof :end endlocal かなり強引ですよね。(^^; |