[前の記事]« バッチ処理の終了を待たずに別の処理を続けるには
[次の記事]当日に作成されたファイルの名前を検出したい »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「バッチファイルの文法と環境変数」索引へ
▲カテゴリー「遅延環境変数の展開」索引へ

ループでのカウントの取り方

873.
ループでのカウントの取り方
2005年12月07日(水) 18時18分
HATT
●Win2000Server AND WinXP

はじめまして。HATTです。

バッチを作成したいのですが、うまくいきません。
どうか、教えてください。

ループ処理の(本当はLoopのLoop)中で、
1回目はAの処理。
2回目はBの処理。
3回目はCの処理。

と分けたいのですが・・
ループに入る前にカウントの変数を取って、
ループの中で
set /A COUNT=%COUNT%+1
とやっているのですが。。
COUNTは""のままなのです

どのようにすればよいか、お教えください。
よろしくお願いします。
874.
Re:ループでのカウントの取り方
2005年12月07日(水) 21時03分
cstlog
>●Win2000Server AND WinXP
>
>はじめまして。HATTです。
>
>バッチを作成したいのですが、うまくいきません。
>どうか、教えてください。
>
>ループ処理の(本当はLoopのLoop)中で、
>1回目はAの処理。
>2回目はBの処理。
>3回目はCの処理。
>:
>と分けたいのですが・・
>ループに入る前にカウントの変数を取って、
>ループの中で
>set /A COUNT=%COUNT%+1
>とやっているのですが。。
>COUNTは""のままなのです
>
>どのようにすればよいか、お教えください。
>よろしくお願いします。

最初に、
set /a COUNT=0
と宣言していればカウントされると思いますよ。
875.
Re:ループでのカウントの取り方
2005年12月08日(木) 13時01分
YanaKen◆c0rnJ1Q=
HATTさん こんにちは。

>ループに入る前にカウントの変数を取って、
>ループの中で
>set /A COUNT=%COUNT%+1
>とやっているのですが。。
>COUNTは""のままなのです

 最近の書き込みに「環境変数によるカウントアップ」関連の話題があります。861のツリーを参照してください。
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/4-0861.html

 forループ内での複数回実行、あるいは複数行にわたる処理を( )でくくっている場合に、同じ環境変数を複数回参照し、そのつど値を変化させるような処理を行う場合、「遅延環境変数の展開」の機能をオンにしてやらないと「思ったようにならない」ことが起きます。
 1つの論理行は、環境変数は最初に実際の値に変換(展開)されてからまとめて実行されるためです。


set key=A
set key=%key%B
set key=%key%C ←実行直前の時点で、%key%は「AB」となっている。
set key=%key%D ←実行直前の時点で、%key%は「ABC」となっている。
echo %key%
 結果:「ABCD」

set key=A
(
set key=%key%B
set key=%key%C ←( )内の%key%は事前に「A」に置き換わっている。
set key=%key%D ←( )内の%key%は事前に「A」に置き換わっている。
)
echo %key%
 結果:「AD」

 このあたりについては、SET /? 、SETLOCAL /? などで出るヘルプメッセージの中から「遅延環境変数の展開」について書かれた部分を参照してください。
 ただしset /a の演算処理だけは例外で、(otnさんに指摘されるまでぼくも認識から完全に抜け落ちてましたが(^^;)
 set /a COUNT=COUNT+1
 ……のように書くだけで期待通りに動きます。(遅延環境変数の問題も意識する必要がないようです)

 と、長めのコメントになっちゃいましたが、結論としては、
 set /a COUNT=%COUNT%+1
 ↓
 set /a COUNT=COUNT+1
 ……の修正だけで基本的にはOKなんじゃないかと思います。ただ、それだけだと数値演算以外の環境変数の扱い等でまたつまづく可能性があるかと思いますので、「遅延環境変数の展開方法」については頭に入れておいたほうがよいと思います。

YanaKen
876.
Re:ループでのカウントの取り方
2005年12月09日(金) 14時31分
HATT
cstlogさん、YanaKenさん
ありがとうございました!!

昨日・今日とネットに繋がる環境に居なかったので、
見られなくて、返事遅くなってスミマセン@

今、拝見したばかりで、まだ試してないんですけど、
「なるほど!!!」と思いました。

試したら改めて報告します☆
ありがとうございました!

HATT
877.
Re:ループでのカウントの取り方(解決しました!
2005年12月09日(金) 18時09分
HATT
こんにちは。HATTです。
教えていただいた方法を試して、問題が解決しました♪

set /A count=count+1
だけでは、うまく動作しなかったので、「遅延環境変数の展開方法」も取り入れたら解決しました!
お教えくださってありがとうございました☆

作成したものはこのような感じになりました。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
@echo off
setlocal enabledelayedexpansion

set pass1=
set name1=
set pass2=
set name2=
for /F  %%A in (C:\tmp\test.csv) do (
 set longstr=%%A
 set /A count=0
 for %%B in (!longstr!) do (
  set str=%%B
  set /A count=!count!+1
  if !count!==1 set pass1=!str!
  if !count!==2 set name1=!str!
  if !count!==3 set pass2=!str!
  if !count!==4 set name2=!str!
 )
 echo !pass1!.!name1!
 echo !pass2!.!name2!
)
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
初めてバッチに挑んだのですが、大変勉強になりました。
本当にありがとうございました。
878.
Re:ループでのカウントの取り方(解決しました!
2005年12月11日(日) 00時40分
otn
>初めてバッチに挑んだのですが、大変勉強になりました。
>本当にありがとうございました。

初めてで遅延展開を使いこなせば十二分ですね。
4カラムからなるCSVファイルを2カラムずつ区切って、ピリオド区切りで表示するという目的のようなので、ストレートに書くと、tekens オプションを使って、

@echo off
for /F  %%A in (C:\tmp\test.csv) do (
 for /f "tokens=1-4 delims=," %%B in ("%%A") do (
  echo %%B.%%C
  echo %%D.%%E
 )
)
883.
Re:ループでのカウントの取り方(解決しました!
2005年12月12日(月) 16時06分
HATT
>4カラムからなるCSVファイルを2カラムずつ区切って、ピリオド区切りで表示するという目的のようなので、ストレートに書くと、tekens オプションを使って、
>
>@echo off
>for /F  %%A in (C:\tmp\test.csv) do (
> for /f "tokens=1-4 delims=," %%B in ("%%A") do (
>  echo %%B.%%C
>  echo %%D.%%E
> )
>)
>

otnさん、ありがとうございました!
こっちの方がとてもシンプルですね!
試してみても、うまくいきました☆

%%BをCとか、Mとかから初めてもうまくいくのでしょうか・・
⇒いきました。(笑
Zまでは順に値を取得してくれるんですね。。

う~ん・・もっと勉強します。。
 
 


カテゴリー「バッチファイルの文法と環境変数」索引へ
カテゴリー「遅延環境変数の展開」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2005年12月07日 00:29に投稿されたエントリーのページです。

ひとつ前の投稿は「バッチ処理の終了を待たずに別の処理を続けるには」です。

次の投稿は「当日に作成されたファイルの名前を検出したい」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート