DOSバッチ処理上級編 第5章 setコマンド詳細編
I. setコマンドでカスタム変数を設定する
cmd.exeの環境変数を表示、設定、削除します。
SET [変数=[文字列]]の場合
変数 環境変数名を指定します。
string 変数に代入する一連の文字列を指定します。
現在の環境変数を表示するには、引数なしで SET と入力します。
SETコマンドは、変数名に等号を含めることができません。
注)以下の使い方は、変数 variable の値を未定義の状態にクリアします。
SET variable=
上記の等号の後に記号がない場合、SET variable="" と記述すると、変数値は空ではなく、引用符2つ分、つまり "" に等しくなります。
例
@echo off
set var=I am the value
echo %var%
pause
set var=I am valueをご覧ください。これは、BATがバッチ内で直接変数を設定する方法です。
set はコマンド var は変数名 "I am the value" の右側の = 記号は変数の値です。
この変数を一括で参照するには、%var%のように、var変数名を%(パーセント記号)2つで展開します。
SETは、ユーザーが自分で変数の値を入力し、その値に基づいて適切なアクションを行うことができるインタラクティブなインターフェースも提供できます。今度は、このSETの構文についてお話します。パラメータに "/P" を追加するだけです
SET /P variable=[promptString]です。
例
@echo off
set /p var=Please enter the value of the variable:
echo You have entered %var% ~_~
pause
set /p はコマンドの構文 var は変数名 "変数の値を入力してください: "の右側の = 記号、これはプロンプトで、もう変数の値ではありません!(笑)
実行後、プロンプトの直後に1を打つと、1を打ったという行が表示されます ~_~。
さて、復習はこれくらいにして、残りのSET関数を紹介します。
setを使う /? SET のヘルプを見ると、SET は上記で説明したこと以外にもいろいろなことができることがわかります。
SET [変数=[文字列]]
SET /P variable=[promptString]である。
この2つの構文に加え、以下の構文が利用可能です。
SET /A式
環境変数の置き換えが以下のように強化されました。
%PATH:str1=str2%です。
PATH:~10,5
PATH:~10
PATH:~0,-2%です。
この構文で何ができるのか?ひとつひとつ解説していきましょう
II. setコマンドを使った簡単な計算
構文 SET /A式
Aコマンドラインスイッチは、等号の右側の文字列を評価すべき数値式として指定します。式評価器はシンプルで、優先順位の高い順に次の操作をサポートしています。
() -グループ
! ~ 単項演算子
* / % - 算術演算子
+ - - 算術演算子
<< >> - 2進論理シフト
バイナリ・バイ・ビット(quot;with".)
^ -Binary by bit "different"
-Binary by bit "or"
= *= /= %= += -= -算術の代入
&= ^= |= <= >= >= -二進数演算の代入
式分離器
SET /A をコマンド スクリプト以外のコマンド ラインで実行すると、式の最後の値が表示されます。接頭辞が 0x の 16 進法と接頭辞が 0 の 8 進法以外は、数値は 10 進数です。したがって、0x12 は 18 や 022 と同じです。8進数の式は混乱することがあるので注意しましょう。8と9は有効な8進数ではないので、08と09は無効な数字です。
上記はシステム・ヘルプからの引用で、ちょっとめまぐるしいですが、簡単に説明しますと、setの/Aパラメータは、setが足し算や引き算などの数学記号をサポートできるようにするものなのです
注)一般的な演算は10進数であることが多く、数字列の左端が0になると8進数とみなされ、間違ってしまうので、注意が必要です。例えば、0812のような数字は10進数の演算に参加できないので、次のように変換されます。10812-10000
例
set aa=0812
set /a aa=1%aa%-10000
echo %aa%
その結果、次のようになります。812
例
@echo off
set /p input=Please enter the calculated expression.
set /a var=%input%
echo Calculation result: %input%=%var%
pause
上記の例はTornadoによって設計され、うまく動作しています、以下の操作を参照してください。
注意:DOSの計算では整数演算しかできないので、一番近い整数で計算します
計算式を入力してください:1+9+20+30-10
計算結果:1+9+20+30-10=50
続行するには、いずれかのキーを押してください。. .
計算式を入力してください:10/3 #割り算は整数に対してのみ可能です。
計算結果:10/3 = 3
続行するには、いずれかのキーを押してください。. .
計算式を入力してください:-100+62 # 負の数
計算結果:-100 + 62 = -38
続行するには、いずれかのキーを押してください。. .
計算式を入力してください:100%3 # 余りを求める
計算結果:100%3=1
続行するには、いずれかのキーを押してください。. .
注)上記の%%余り演算子は、バッチプログラムでは、%%と記述する必要があります。
計算式を入力してください。(25+75)*2/(15+5) # カッコ
計算結果 (25+75)*2/(15+5) = 10
続けるにはいずれかのキーを押してください . . .
計算式を入力してください:1234567890*9876543210 # range
無効な数値です。数値の精度は32ビットに制限されています。
計算結果:1234567890*9876543210=。
続けるにはいずれかのキーを押してください。. .
注)上記の計算手順から、DOSの計算が正確にできるのは32ビットまでであることがわかります。これは2進数で32ビット、最上位ビットが符号ビット(0が正、1が負)、下位31ビットが値となります。31個の1は10進数に変換すると2147483647となりますので、DOS計算の有効値範囲は-2147483648~2147483647となり、それ以上は以下の計算手順を参照してください。
式を入力してください:2147483647-1 #最大値から1を引いた有効値
計算結果:2147483647-1 = 2147483646
続行するには、いずれかのキーを押してください。. .
計算式を入力してください:2147483647+1 #最大値+1、エラー、結果は最小値
計算結果:2147483647+1 = -2147483648
続行するには、いずれかのキーを押してください。. .
計算式を入力してください:-2147483648-1 #min min min min min min min min min min min min min min min min min min min min min min min min min min min min min min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Man Man Man Min Man Man Man Man Man Min Man Man Min Man Man Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min
計算結果:-2147483648-1=2147483647
続行するには、いずれかのキーを押してください。. .
set /a a=1+1,b=2+1,c=3+1 を実行すると 4 が表示されますが、echo %a% %b% %c% の後の結果を見てみると、他の数学演算も影響していることがわかります! そこで、式分離記号 "カンマ"の出番です!
時には、元の変数から直接足したり引いたりする必要があるので、この構文を使います set /a var+=1 この構文は、元の構文である set /a var = %var% + 1 に相当します。
元の変数の値に対する数学的演算という結果は同じですが、こうやって書くと簡単ですね。
set /a var*=2
構文がヘルプに書いてある限り、他のものはすべてこの方法で動きます!
また、論理演算子や剰余演算子を使用する記号がありますが、上記と同じように使用するとエラーになります
例えば、CMDでset /a var=1 & 1 "と入力すると、彼は1を表示しませんが、エラーになりますが、なぜですか?このような"論理または余り演算子"のために、我々は二重引用符でそれらを置く必要があり、また、エスケープ文字^を使用することができ、例を参照してください。
結果が表示されるように /a var= 1 "&" 1 を設定する、他の論理演算子または余剰演算子の使用法
set /a var= 1 "+" 1 異機種混在演算
set /a var= 1 "%" 1 モジューロ演算
set /a var= 3 "<<" 2 左シフト操作、3は2進数で11、2ビットの左シフトは1100、10進数に変換すると12、自分で確認する
set /a var= 4 ">>" 2 右シフト操作、4のバイナリは 100、2 ビット右シフトは 1、結果は 1 です。
トルネード追加:すべてのビット演算は2進数に変換する必要があります。
思考問題:2のn乗を求めよ
参考回答
@echo off
set /p n=Please enter the number of times 2:
set /a num=1^<^<n
echo %num%
pause
実行中の結果
2を何度か入力してください。3
8
続行するには、いずれかのキーを押してください。. .
何回か入力してください 2: 10
1024
いずれかのキーを押して、続けてください。. .
回数を入力してください 2: 15
32768
何かキーを押して続けてください。. .
III. setコマンドによる文字列処理
1. 文字列の置換
さて、シンボルの話はこれくらいにして、次は %PATH:str1=str2% とします。
上記の構文は、「文字列変数 %PATH% の str1 を str2 で置き換える」という意味です。
これは、変数値の内容を置き換えるもので、次の例を参照してください。
@echo off
set a= bbs. verybat. cn
echo Value before replacement: "%a%"
set var=%a: =%
echo The value after replacement: "%var%"
pause
実行中の表示です。(トルネード追加)
置換前の値: " bbs.verybat.cn"
置換後の値: "bbs.verybat.cn"
比較のために、変数 %a% のスペースを置換していることがわかりますが、この例から、次のことがわかります。
PATH:str1=str2% アクションは、%PATH% 変数内のすべての str1 を str2 に置き換えます。
たとえば、上の例を次のように変えてみましょう。
@echo off
set a=bbs.verybat.cn
echo The value before replacement: "%a%"
set var=%a:. =brainwashed%
echo The value after replacement: "%var%"
pause
実行中の表示。
置換前の値: "bbs.verybat.cn"
置換後の値: "bbs.verybat.cn"
説明 セット var=%a:. =brainwashed%.
set はコマンド var は変数名 a は置換される変数の値 " は置換される文字 " は置換される値。
"hurt"が置換する値です!
実行すると、変数 %a% 内の " が " に置換されます。 " はすべて "brainwashed" に置換されます。
これは、setの置換文字の機能がとても優れているのです! まず置換機能、次に文字列のインターセプト機能です。
なお、文字列の置換や傍受は、setコマンドに限らず、変数が参照される場所であればどこでも可能です
例
@echo off
set a=bbs.verybat.cn
echo The value before replacement: "%a%"
echo The value after replacement: "%a:. =brainwashed%"
pause
この例では、echo文の中の文字列を右に置き換えるが、同じ効果がある。
2. 文字列のインターセプト
**********************************************
切片関数の統一された構文フォーマットは次の通りです: %a:~[m[,n]]%.
**********************************************
角括弧はオプション、%は変数識別子、aは変数名、コロンで変数名と説明を分離、記号~は簡単に"offset"と理解できる、mはオフセット(デフォルトは0)、nはインターセプト長(デフォルトは全て)です。
%PATH:~10,5% これはどういう意味ですか、例をご覧ください。
インターセプト機能例1。
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
実行後、"bs"の文字だけが表示されていることがわかります。変数 %a% の値は bbs.verybat.cn ではないでしょうか?
2文字目と3文字目の "bs" しか表示されないのはなぜでしょうか?結果を分析すると、%PATH:~10,5% は、変数 PATH の 11 位置(オフセット 10)から始まる 5 文字を表示するということが簡単にわかりますね
解析セット var=%a:~1,2% の場合
setはコマンド、varは変数値、aは文字操作する変数、"1"は変数"a"から最初の数桁、"2"は何桁目に表示されるかを表します。
組み合わせると、変数aの値を変数varの2番目の位置(オフセット1)から2文字で与えることになります
これなら納得できるはずだ。
他の2つの構文
%PATH:~-10%
PATH:~0,-2%です。
また、指定された変数の値を指定されたビット数だけ表示することを意味します
%PATH:~-10% 例を参照してください。
インターセプト機能例 2.
@echo off
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
実行結果: .
これは、変数aの逆3桁の値を変数VARの
もちろん、このように変更することもできます。
インターセプト機能例3.
@echo off
set a=bbs.verybat.cn
set var=%a:~3%
echo %var%
pause
実行中の表示:.verybat。
これは、変数VARに3位以降の変数aの値をすべて与えるというものです
%PATH:~0,-2% 例
インターセプト機能例 4.
@echo off
set a=bbs.verybat.cn
set var=%a:~0,-3%
echo %var%
pause
実行後、"bbs.verybat"と表示され、".cn"が抜けていることが分かります。
この結果の分析から、ビット0から始まる変数aの値であることは容易に分析できる。
変数aの値は、0位置から最後から3番目の位置までのvarに与えられている
このように変更した場合
インターセプト機能例 5.
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
実行表示:s.verybat
そして、3番目(オフセット2)から最後の3文字を引いた値を表示し、変数varに代入している。
良い点です。この例は説明用で、記憶のために、トルネード小節は次のようになっています。
a=bbs.verybat.
%a:~1,2% = "bs" オフセット1、2ビット目から右へ2ビット分
%a:~-3% = ".cn" オフセットマイナス3、つまり3ビット後退(3ビット残すとも解釈できる)、すべてのビットを右側に持っていく。
%a:~3% = ".verybat.cn" オフセット3(左3ビットを削除すると解釈することもできます)、右すべて取得します。
%a:~0,-3% = "bbs.verybat" オフセット0、右からマイナス3までの長さ、つまり最後の3ビットを取ります。
%a:~2,-3% = "s.verybat" オフセット2、右からマイナス3までの長さ、つまり逆3桁の数字
**********************************************
つまり、切片関数の統一構文形式は、%a:~[m[,n]]%となります。
**********************************************
角括弧はオプション、%a%は変数名、コロンは変数名と説明を分けるために使用、記号~は簡単に"offset"と理解できる、mはオフセット(デフォルトは0)、nはインターセプト長(デフォルトはすべて)です。
上記の使い方は、実はvbsの関数mid, left, rightと同等である。
a:~0,n% は、左 n ビットを取る関数 left(a,n) と同じです。
a:~-m% は、右側 m ビットを取る関数 right(a,m) と同じです。
a:~m,n% は、m+1 ビットから n ビットを取る関数 mid(a,m+1,n) と同じです。
a:~m,-n% は関数 mid(a,m+1,len(a)-m-n) と同じで、m+1 ビットで始まり、n+1 ビットの逆数で終わります。
a:~m %は、m+1ビットから始まって右辺全体を取る関数 mid(a,m+1,len(a)-m) または right(a,len(a)-m) と等価です。
任意の文字列を入力し、その文字列の長さを求めるという問題を考えてみよう
参考答案
@echo off
set /p str=Please enter a string of any length:
echo You entered string:"%str%"
call :stringlenth "%str%" num
echo The length of the string is: %num%
pause
exit
:stringLenth
::--------- string length calculation subroutine
The %1 parameter of ::--------- is the string (if there are spaces, please enclose them in quotation marks)
::--------- parameter %2 is the return variable name, no spaces or special characters
::@echo off
set theString=%~1
if not defined theString goto :eof
set Return=0
:StringLenth_continue
set /a Return+=1
set thestring=%thestring:~0,-1%
if defined thestring goto StringLenth_continue
if not "%2"=="" set %2=%Return%
goto :eof
setコマンドについてもっと詳しく知りたい場合は、以下の方法を参考にしてください。
関連
-
ワンクリックで jdk 環境変数を設定するバッチコード
-
DOS比較演算子(LSS,LEQ,GTR,GEQ,EQU,NEQ)
-
プリントキャッシュをクリアして、プリントサービスを再起動する(dos環境)。
-
DOSリダイレクトコマンドの使い方とセキュリティへの応用
-
Windowsでバッチファイル.batを使用して古いファイルを削除する。
-
ワンクリックcmdでJavaの環境変数を表示、変更(上書き、追加)などを設定。
-
DOS(バット)文字列置換の原理
-
cmdでdドライブまたはdドライブ内のフォルダーを入力する
-
フォルダバット内の全ファイルの個数と合計サイズの一括統計処理
-
bat, vbs, js ネイティブミックス (bat は vbs, js コードを実行可能)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
単語頻度統計(繰り返し行数/各行繰り返し回数)用バッチコード
-
管理者権限でbatバッチを実行させる方法
-
Windowsのバッチバットはローカルのmysqlに接続し、定式化されたデータを作成し、SQLファイルを実行します。
-
cmdコマンドのリダイレクト出力 2>&1 解説
-
指定したディレクトリにある全ファイルの一覧を取得するバッチ処理(bat)です。
-
指定されたディレクトリからファイル名を一括で抽出します。
-
バッチやvbsコードによるiniファイルの修正
-
DOS共通コマンド(find findstr)のバッチ処理マニュアル
-
DOS共通コマンド(echo, rem, cd, dir)の一括処理マニュアル
-
DOS高度活用バッチ処理チュートリアル 第6章 ifコマンドの解説