1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

バッチBATスクリプトセットコマンド使用詳細(バッチハウスバッチャー)

2022-02-07 12:27:50

I. setコマンドを使った値の割り振り

SET [変数=[文字列]]の場合

1. 等号の両端にスペースを入れない

正しい書き方

<ブロッククオート

C:\&g;set str=ScriptHome
C:\>echo %str%。
スクリプトホーム

間違った書き方

<ブロッククオート

C:\&g;set str = ScriptHome
C:\>echo %str%.
%str%。

2、特殊文字を含む変数値には二重引用符を使用する必要がある

正しい書き方

<ブロッククオート

C:୧⃛(๑⃙⃘◡̈︎๑⃙⃘)
C:\>echo "%str%"
"Bat&Home"

間違った書き方

<ブロッククオート

C:♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
'Home'は内部コマンドでも外部コマンドでもない
は、実行可能なプログラムまたはバッチファイルではありません。
C:\>echo "%str%"
"バット"。

変数値をNULLに設定すると、変数値がクリアされ、変数の初期化が実行されます。

3. システム環境変数と同じ名前のカスタム変数を使用しないようにする

例えば

パス , 日付 , エラーレベル など

4. この構文は動作しますが、この構文で

複数の変数を数値に代入する場合は連結を使用する

set /a x=y=100

カンマで区切られた複数の変数の数値への代入 set /a x=1,y=2

上記はdosインターフェースでの書き方、以下はバッチでの書き方で、考え方は、変数

例1.

すべての変数の値を表示する

@echo off  
set
pause  

例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を%(パーセント記号)2つで展開し、%var%というようにします。

set /pコマンドで入力を読み込む

対話的にユーザー入力を取得する

@echo off
set /p input=Please enter a string:
echo,%input%
pause

ファイルの1行目を読む

C:\>echo BatHome>1.txt
C:\>set /p input=<"1.txt"
C:\>echo %input%。
バットホーム

出力文字列の後に改行がない

@echo off
for %%i in (bat home) do (
echo,%%i
)
pause

出力

バット
ホーム
続けるには、いずれかのキーを押してください。. .

@echo off
for %%i in (bat home) do (
set /p =%%i<nul
)
pause

出力

bathome 何れかのキーを押して続けてください。. .

カーソル一括巻き戻し(非クリア画面)アニメーション効果デモ

@echo off
echo bbs.bathome.net
set /p = cursor back (not cls clear) animation effect demo: <nul
for /l %%i in (1,1,10) do (
    set /p =%%i<nul
    set /p =<nul
    ping -n 2 127.1 >nul
)
echo,
pause

III. set /a コマンドを使った数学演算 (1)

等号の右側の変数はパーセント記号を省略することができます

C:\&g;set x=1
C:\&g;set y=2
C:\>set /a n=%x%+%y%。

3

C:Ⅻ×1
C:\&g;set y=2
C:\&g;set /a n=x+y

3

8進数、16進数から10進数への変換は簡単です

C:Ⅾ

10

C:\&g;set /a 0xA
10

BATファイルでの余り演算にはパーセント記号が2つ必要です。

@echo off
set /a n=3%%2
echo %n%
pause

論理演算の特殊文字には二重引用符が必要

@echo off
set /a "m=1<<10"
set /a n=1"<<"10
echo %m% %n%
pause

IV. set /a コマンドを使った数学演算 (2)

 非常に大きな数値の直接計算をサポートしない(例:ディスク容量の計算など)


2147483647
C:\&g;set /a n=2147483647+1
-2147483648
C:\/set /a n=2147483648+1

無効な数値です。数値の精度は32ビットに制限されています。

<ブロッククオート

C:\>set /a n=-2147483646-1 -2147483647
C:\>set /a n=-2147483647-1 -2147483648
C:\>set /a n=-2147483648-1
無効な数値です。数値の精度は32ビットに制限されています。

浮動小数点数の直接計算をサポートしない

独自のアルゴリズムを記述して浮動小数点演算をバッチ処理することが可能

 タイトル

任意の2つの小数(小数点以下2桁まで)を入力し、その和、差、積、商をバッチ処理で出力することができる
(積と商は小数点以下2桁まで保持)。

@echo off&setlocal enabledelayedexpansion
set /p str=The two numbers entered are.
set /a num_1=0,num_2=0,num=1,v=0
for %%a in (%str%) do (
    set /a n+=1
    for /f "tokens=1,2 delims=. " %%b in ("%%a") do (
        set "_!n!=%%b"
        if "%%c" equ "" (
           set ". !n!=00"&set /a m+=1
           if !m! equ 2 set "flag=a"
           ) else (
           set "a=%%c00"&set "a=!a:~,2!"
           set ". !n!=!a!"
        ) 
     )
)
for %%a in (+#h -#c) do (
    for /f "tokens=1,2 delims=#" %%b in ("%%a") do (
        if "%_1:~,1%" equ "-" set "k1=-"
        if "%_2:~,1%" equ "-" set "k2=-"
        set /a %%c1=_1%%b_2,%%c2=!k1!1%.1%%%100%%b!k2!1%.2%%%100
        if ! %%c1! lss 0 (
           if ! %%c2! leq -100 set /a %%c2+=100,%%c1-=1
           ) else (
           if ! %%c1! equ 0 ( if !
              if ! %%c2! lss 0 set "%%c1=-0"&set "a=! %%c2!"&set "%%c2=!a:-=! "
              ) else (
              if ! %%c2! lss 0 set /a %%c2+=100,%%c1-=1
           )
         )
         if ! %%c2! geq 100 set /a %%c2-=100,%%c1+=1 
    )
)
for %%a in (h2 c2) do (
    set "a=! %%a!"&set "a=!a:-=! "&set %%a=!a!
    if !a! lss 10 set "%%a=0!a!"
)
echo Its sum is: %h1%. %h2%&echo The difference is: %c1%. %c2%&set /a n=0
if defined flag set ".1="&set ".2="
for %%a in (1 2) do (
    if "! _%%a!" equ "0" (
       set "_%%a="&set /a . %%a=1!. %%a!%%100
       ) else (
       if "! _%%a!" equ "-0" (
          set "_%%a=-"
          ) else (
          set "a=! _%%a!"&set "a=!a:-=! "
          set /a n+=1&call :lp
       )
    )
    if "! %%a!" neq "" set "a=! %%a!"&call :loop&set ". %%a=!a!"
)
set /a num1=3-num_1+num_2,m=4-v
if defined flag set /a m=0
if %num1% leq 0 set /a num1=2
for /l %%a in (1,1,%num1%) do set /a num*=10
set /a s=%_1%%.1%*num/%_2%%.2%,j=%_1%%.1%*%_2%%.2%
if %j% lss 0 set "j=%j:-=%"&set "jk=-"
if %s% lss 0 set "s=%s:-=%"&set "sk=-" 
if %m% neq 0 if "!j:~%m%! " equ "" set "j=0000%j%"&set "j=!j:~-%m%! "
if %s% lss %num% set "s=%num:~1%%s%"&set "s=!s:~-%num1%! "
if %m% neq 0 set "j=!j:~,-%m%! !j:~-%m%,2!"
set "s=!s:~,-%num1%! !s:~-%num1%,2!
for %%a in (s j) do (
    set "a=! %%a!"
    if "!a:. =! " equ "!a!" (
       set "%%a=! %%a!.00"
       ) else (
       if "!a:~-2,1!" equ ". " set "%%a=! %%a!0"
    )  
    if "!a:~,1!" equ ". " set "%%a=0!%%a!"
)
echo whose product is: %jk%%%j%&echo whose quotient is: %sk%%%s%
pause>nul&goto :eof
:lp
set /a num_%n%+=1&set "a=%a:~1%"
if defined a goto lp
goto :eof
:loop
if "%a:~-1%" equ "0" set "a=%a:~,-1%"&set /a v+=1&goto loop

コードは非常に複雑で、あなたは間違いなく混乱に見えると思いますので、それも考えてみてください。
は、完璧なコードを与えるために高い手を楽しみにしている間、理解するために、次のコードを書くアイデアを追加することです。

I. 一般的な計算の考え方
この問題の最も重要な部分は、小数点以下の値の前後2つの部分の処理にあることが分かっています。↑では、また
一番大事なのは、小数点以下の2つの部分の処理だと思います。足し算や引き算の処理では、前値と後値を分けて数えるべきだと思っています。 {足し算と引き算の処理では、前値と後値を分けて数えるべきだと思う。
足し算、引き算は、前後の値を別々に数えてから処理(小数点以下、百分の一満点など)し、小数点は真ん中につけるべきだと思う。
乗算の場合は、小数点を削除して前後のビットを連動させ、後ろから前にずらして小数点を加算する必要があります
割り算は最も複雑です。割り算については、最も複雑です。結果に小数点以下2桁を残したい場合は、割り算の桁数が
(両方の数値が最初に小数化される)、この条件を満たさないときは、被除数に
この条件を満たさない場合、除数に十分なゼロを加え、最後に結果を前後にずらして小数点を加えます。

II. 数値の取り扱い
/{br 私のコードでは、主に各処理を行うために、if文の海を使って判断していることがわかります。
の値は、さまざまなケースを想定して、大まかに以下の12点に分類しています。
1 元の値に小数点以下がない場合の処理-後ろから.00を埋める
2 元の値が小数点以下2桁の場合の処理 - 小数点以下に00を加え、最初の2桁を抜き出す。
3 加算・減算の際、小数点以下が100を超える場合の処理-小数点以下から100を引き、全桁に1を足す
4 小数点以下が-100以下の足し算・引き算の計算に対応 - 小数点以下は100を足し、全体は1を足す
マイナス1
5 整数桁が0、小数桁が0より小さい場合の加減算の処理-整数桁が変わるV。setコマンドによる文字列の傍受

元の文字列 文字列の傍受 set sub=%str:~x,y% 結果

1文字目から3文字目までを切り捨てる

<ブロッククオート

set str=12345
set sub=%str:~0,3%に設定します。

最後から2文字目を切り捨てる

<ブロッククオート

set str=12345
set sub=%str:~1%

末尾4文字目から末尾2文字目までを切り捨てる

<ブロッククオート

set str=12345
セットサブ=%str:~-4,3%です。
set sub=%str:~-4,-1%に設定します。

最後の2文字を切り捨てる

<ブロッククオート

set str=12345
set sub=%str:~-2%

説明

xが正の場合は左から右への切片、負の場合は右から左への切片を意味する。
yが正のとき、インターセプトする文字列の長さを示し、yが負のとき、捨てるべき最後の数文字の長さを示す。
yとその前のカンマがない場合、x+1番目の文字とそれ以降のすべての文字が遮断されることを示す。

VI. setコマンドによる文字列置換

set StrNew=%StrOld:SubOld=SubNew% とする。

bbs という文字列を www に置き換える

<ブロッククオート

set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:bbs=www% とする。

 文字列bbsを削除する

set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:bbs=% とする。

最初の文字tとその左側の文字をすべて削除する(ワイルドカード*の使用)

<ブロッククオート

set StrOld=http://bbs.bathome.net
set StrNew=%StrOld:*t=% とする。

置換する部分文字列は大文字と小文字を区別しない(この機能を使って文字の大文字小文字の変換を実現することができる)

@echo off
setlocal enabledelayedexpansion
REM convert all to uppercase
set str=http://bbs.BATHOME.net
set up=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
for %%i in (%up%) do (
set str=!str:%%i=%%i!)
echo %str%
pause

すべて小文字に変換

@echo off
setlocal enabledelayedexpansion
REM all to lowercase
set str=http://bbs.BATHOME.net
set low=a b c d e f g h i j k l m n o p q r s t u v w x y z
for %%i in (%low%) do (
set str=!str:%%i=%%i!)
echo %str%
pause

七、コマンドの知識点を設定する(1)コマンドの結果を変数に代入する

UNIX/Linux Shellは、redirectやfor文の助けを借りて、Windows BATのコマンド置換をサポートしています。

<ブロッククオート

PacketLoss=`ping -c 4 127.0.0.1 | grep '%'`.
echo $PacketLoss

バット

@echo off
REM uses redirection to assign command results (single line strings) to variables
ping 127.0.0.1 | findstr "%%" > "%temp%\ping.txt"
set /p PacketLoss=<"%temp%\ping.txt"
echo %PacketLoss%
pause

シェル

PacketLoss=$(ping -c 4 127.0.0.1 | grep '%')
echo $PacketLoss

バット

@echo off
REM uses a for statement to assign the result of the command (a one-line string) to a variable
for /f "delims=" %%i in ('ping 127.0.0.1 ^| findstr "%%"') do (
set "PacketLoss=%%i"
)
echo %PacketLoss%
pause

8、コマンド知識ポイント(2)を設定し、ある文字で始まる変数を表示する。

setコマンドを直接実行することで、システム環境変数を表示することができる
set xxx コマンドは xxx で始まるすべての変数を表示します。
結果は変数名でソートされます

C:\&g;set xxx1=A
C:\>set xxx3=C
C:\>set xxx2=B
C:\>set xxx
xxx1=A
xxx2=B
xxx3=C

ソート機能を使用したフルコード・デモ

@echo off
for %%i in (a.txt c.txt b.txt e.txt) do (
set #%%i=%%i
)
for /f "tokens=2 delims==" %%i in ('set #') do (
echo %%i
)
pause

 実践的な問題解決への応用

https://www.codedevlib.com/article/223002.htm

https://www.codedevlib.com/article/223004.htm

https://www.codedevlib.com/article/223007.htm

バッチBATスクリプト(Batcher)でのsetコマンドの使い方は、この記事が全てです。setコマンドの詳細については、「スクリプトの家」の過去記事を検索するか、以下の関連記事を引き続き閲覧してください。