LoginSignup
1
2

More than 5 years have passed since last update.

.bat(バッチファイル)で配列式変数の中身をシフトする

Posted at

 複数の変数の中身をずらしたい時、ありませんか?
 そんな時にこのラベルがあれば、万事解決!

 …というわけで、変数のシフトをするバッチラベルです。
 引数を左シフトするコマンドにはshiftというものがあるのですが、変数ではできませんし右シフトもできません。
 それをできるようにしてみました。

 ここでは、以下の変数をシフトする例として用います。

num[1]=1
num[2]=2
num[3]=3
num[4]=4
num[5]=5

使用法

call :dShift 引数1 引数2 引数3 引数4

 引数1にはシフトする変数の数字以外の部分を入力します。ここではnumです。
 引数2にはシフトする変数の数字の初項を入力します。
 引数3にはシフトする変数の数字の公差を入力します。正の値だと左シフト、負だと右シフトです。
 引数4にはシフトする変数の数字の末項を入力します。

 引数2~4は、そのまま`for /lのカッコ内の数字だと考えると分かりやすいかもしれません。

 具体例を挙げて説明します。

例1:全部を左シフトする

call :dShift num 1 1 5
結果
num[1]=2
num[2]=3
num[3]=4
num[4]=5
num[5]=5

 この例に限りませんが、シフトされた端のデータ(ここではnum[5] )はそのまま残ります。
 もしリングバッファ的に扱いたい(num[1]の値をnum[5]に持ってきたい)場合は、あらかじめ別の変数に保存しておいて、シフト後に代入する必要があります。この場合の例も後ほど紹介します。

例2:3~5番目を右シフトする

call :dShift num 5 -1 3
結果
num[1]=1
num[2]=2
num[3]=3
num[4]=3
num[5]=4

例3:奇数番目だけ左シフトする

call :dShift num 1 2 5
結果
num[1]=3
num[2]=2
num[3]=5
num[4]=4
num[5]=5

実際のラベル

 変数の数字の部分を[ ]で括っていない方は、ラベル内から[ ]を消してください!

通常のシフト(非リングバッファ)
:dShift
    set str=
    for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
    call :dShift2%str%
    exit /b
    :dShift2
        set /a %1=%2
        shift
        if "%2" == "" exit /b
        goto dshift2
シフトで押し出された数字を逆側に代入(リングバッファ)
:dShift_r
    set str=
    for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
    set temp=!%1[%2]!
    call :dShift2_r%str%
    set %1[%4]=!temp!
    exit /b
    :dShift2_r
        set /a %1=%2
        shift
        if "%2" == "" exit /b
        goto dshift2_r
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2