首页 > 其他分享 >for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド

for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド

时间:2024-01-27 22:46:02浏览次数:21  
标签:文字 do bat %% echo tokens num

for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド

转载自:https://qiita.com/plcherrim/items/67be34bab1fdf3fb87f9#4トークンオプション-usebackq-

標準型
for (オプション) %%アルファベット1文字 in (ループ処理の対象) do コマンド 

(オプション無し) ディレクトリ内を対象にとる
/d ディレクトリ(フォルダ)名を対象にとる
/r ディレクトリ名及びそのサブディレクトリ内(そのフォルダの中のファイル名やフォルダ名)を対象にとる
/l 値を指定して代入する
/f テキストファイル内の文章に対してトークンを取り出して代入する
1.forコマンドの基本
 1.そもそもfor文とは?
 2.for文の解剖~ (オプション) ~
 3.for文の解剖~ %%アルファベット1文字 ~
 4.for文の解剖~ in ループ処理の対象 do ~
2.forコマンドの構文①~ オプション無し…ディレクトリ内を対象にとる ~
3.forコマンドの構文②~ /d…ディレクトリ名を対象にとる ~
4.forコマンドの構文③~ /r…サブディレクトリまで対象にとる ~
5.forコマンドの構文④~ /l…指定した値で実行する ~
6.forコマンドの構文⑤~ /f…トークンを代入する ~
 1.トークンオプション~ tokens ~
 2.トークンオプション~ delims ~
 3.トークンオプション~ eol,skip ~
 4.トークンオプション~ usebackq ~
7.まとめ

1.forコマンドの基本


for文とは、「ループ」を行うコマンドです。

■for文の解剖
まとめ・注意点
 ・for文の変数は、%%iのように、アルファベット1文字を用いた特殊な記法となります。
 ・大文字と小文字は別物になります。数字の使用はサポートされていません。
 ・処理の対象は()内に記述します。
 ・inやdoを忘れないようにしましょう。

2.forコマンドの構文①~ オプション無し…ディレクトリ内を対象にとる ~

for %%アルファベット1文字 in (対象) do コマンド

例
@echo off
for %%i in (*.bat) do (
echo ファイル名:%%i
type %%i|more
)
pause


オプションがないとき、処理対象に記載された条件に該当するファイルやフォルダをカレントディレクトリから探して変数に代入します。
ちなみにカレントディレクトリとは、「現在のディレクトリ」。この場合はバッチファイル自身が存在するフォルダのことです。

分かりやすく言うと、例えばデスクトップにhoge.batとfuga.batがあったとして、hoge.batに上記の例が書かれていたとします。
ここでhoge.batを実行すると

実行の流れ:
1:オプションがないので、カレントディレクトリ(ここではデスクトップ)の中身を対象にする。
2:%%iに代入するように指示される。
3:*.batと書かれているので、拡張子がbatのファイル全てを検索する。
4:hoge.batが見つかったので、%%iにhoge.batと代入してdo以降のコマンドを実行する。
5:fuga.batが見つかったので、%%iにfuga.batと代入してdo以降のコマンドを実行する。
6:もうデスクトップにはbatはないので、終了。
(ちなみに、コマンドではファイル名を表示、その下にそのファイルの中身を出力してます。
  そしてプロンプトの1番下の行に到達するたび一時停止します。)
hoge.bat

chcp 65001
@echo off

rem for %%i in (*.bat) do (
rem for %%i in (*) do (
for /r %%i in (h?ge.bat) do (
  echo ファイル名: %%i
  type %%i | more
)

pause

3.forコマンドの構文②~ /d…ディレクトリ名を対象にとる ~

 先ほどの場合とほとんど変わりません。ただし、対象が「ディレクトリの中身」から「ディレクトリの中にあるディレクトリ」になります。
 先ほどの例を使うなら、デスクトップにあるフォルダだけが対象となります。

 それだけ。
chcp 65001
@echo off

for /d %%i in (*) do (
  echo ファイル名: %%i
  type %%i | more
)

pause

4.forコマンドの構文③~ /r…サブディレクトリまで対象にとる ~

 先ほどの場合と略
 ただし、対象がディレクトリの中身全部になります。
 先ほどのバッチファイルの例を使うなら、例えば「デスクトップにある[バッチ]というフォルダの中にあるtest.bat」とかも対象になるわけです。

 /rのあとにディレクトリを指定することで、カレントディレクトリ以外を処理の対象にできます。

こんな感じ。

for /r c:\ %%i in (*.txt) do type %%i|more

まとめ・注意点
 ・オプション無し、および/rではディレクトリの中身。/dではディレクトリ名。
 ・?と*はワイルドカード。それぞれ、1文字と複数文字が入ります。
 ・オプション無しのfor文はめったに使わないと思います。
chcp 65001
@echo off

rem for /r D:\temp %%i in (*.txt) do (
for /r D:\temp /d %%i in (sub*) do (
  echo ファイル名: %%i
rem  type %%i|more
)

pause

5.forコマンドの構文④~ /l…指定した値で実行する ~



5.forコマンドの構文④~ /l…指定した値で実行する ~

正直、ここまでに紹介した/dや/rはそこまで使用頻度は高くないと思います(あくまで体感ですが。)
次に紹介する/lは、おそらくfor文として最も使われる形ではないでしょうか。

値のループ
for /l %%i in (開始値、増分、終了値) do コマンド

例
for /l %%i in (1,2,10) do echo %%i

ラベルでも書けます。
set i=1
:loop
コマンド
set /a i+=2
if %i% leq 10 goto loop

一概にどちらが良いとは言い切れません。場合によります。
例えば、このiの値をさらに計算する場合などは、ラベルを用いたほうがわかりやすいでしょう。

こんな場合は…(余談!)
目標:10個の数字がnum[1],num[2]...num[10]に入っている。
   隣り合った数字(num[1]とnum[2]、num[2]とnum[3]...)が同じかどうかを比較したい。

for文式
for /l %%i in (1,1,9) do (
    set /a tempnum=%%i+1
    call set tempnum=%%num[!tempnum!]%%
    if !num[%%i]! equ !tempnum! コマンド
)

ラベル式
:loop
    set /a loop+=1,loop2=loop+1
    if !num[%loop%]! equ !num[%loop2%]! コマンド
    if %loop2% lss 10 goto loop

まとめ・注意点
 ・/lでは、開始値、増分、終了値を取ってループさせる。
 ・必ずしもforを使う必要はない。
 ・↑でも慣れると非常に便利。
 ・多用されるので、少なくとも/lは読めるようにしておきたい。
@echo off

rem for /l %%i in (1,2,10) do echo %%i

set i=1
:loop
echo %i%
set /a i+=2
if %i% leq 10 goto loop

pause

6.forコマンドの構文⑤~ /f…トークンを代入する ~

ラスボスです。

トークンを代入

for /f "トークンオプション" %%i in (処理の対象) do コマンド

トークンオプション一覧
tokens= 何番目のトークンを指定するか?
delims= トークンの区切り文字を指定
eol= この文字から始まる行を無視
skip= 先頭から指定された行数、スキップする。
usebackq コマンドの出力を対象にする

テストデータ:

hogehoge.txt

1 2 3 4 5
a b c d e
a:i:u:e:o
hhh o:g ee:e
1.トークンオプション~ tokens ~
 まずは、tokensについてです。

tokens
for /f "tokens=1,3" %%i in (hogehoge.txt) do echo %%i %%j

この例では、「1番目と3番目のトークンだけを取ってこい!」と言っています。
hogehoge.txtの各行から1,3番目のトークンを取得してechoするので、

tokensの結果
1 3
a c
a:i:u:e:o     (注:3番目のトークンは無いので、当然表示されない。)
hhh ee:e

ポイント
 2つ以上のトークンを指定したとき、2つ目以降のトークンは指定したアルファベットの次の文字が勝手に宣言、使用されます。
 初めにiを指定したら次はj,k,l...とトークンの数だけ続きます。
 zの次の文字は存在しない(するけど可読性が酷い)ので、x,yなどからトークンを指定するのはお勧めしません。
 
 また、例えば2,3,4,6番目のトークンを取りたいときは2-4,6と表記することもできます。
 1番目のトークンだけを取得するときは、tokensを書く必要はありません。
 
2.トークンオプション~ delims ~

delims

for /f "tokens=1,3 delims=:" %%i in (hogehoge.txt) do echo %%i %%j

実行結果
1 2 3 4 5
a b c d e
a u
hhh o e

結果を見てなんとなく察していただけるでしょうか?delimsでは、トークン同士を区切る文字を変更できます。
このとき、元々の指定であるスペースとタブは区切り文字ではなくなります。これを追加するには、

delims
for /f "tokens=1,3 delims=:  " %%i in (hogehoge.txt) do echo %%i %%j

実行結果
1 3
a c
a u
hhh g

ポイント
 区切り文字をスペースやタブ以外にも使う(空白も区切り文字に含める)場合、
  delimsはオプションの最後に、スペースはさらにその最後("の手前)に。
  スペースとタブ両方使う場合は、タブを先に書きましょう。

3.トークンオプション~ eol,skip ~
hogehoge.txt
1 2 3 4 5
a b c d e
a:i:u:e:o
hhh o:g ee:e

for /l "tokens=1,3 eol=a" %%i in (hogehoge.txt) do echo %%i %%j

実行結果
1 3
hhh ee:e

for /l "tokens=1,3 skip=2" in (hogehoge.txt) do echo %%i %%j

実行結果
a:i:u:e:o
hhh ee:e

特に語ることはありません。
eolで指定した文字から始まる行を無視、skipで指定した行数分先頭から無視です。

4.トークンオプション~ usebackq ~
 このオプションだけは、テキストファイルを通しません。

usebackq
for /f "usebackq tokens=1 delims==" %%i in (`set`) do echo %%i

usebackqを使用すると、コマンドプロンプト上で使用できるMSDOSコマンドの出力を対象とすることができます。
この例では、デフォルトで設定されている環境変数名を表示します。

実際に、以下の内容のバッチファイルを作ってみてください。

usebackq.bat

@echo off
mode con lines=40 cols=200
set
pause >nul
cls

for /f "usebackq tokens=1 delims==" %%i in (`set`) do echo %%i
pause >nul

标签:文字,do,bat,%%,echo,tokens,num
From: https://www.cnblogs.com/langQ/p/17991990

相关文章

  • PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附
    全文下载链接:http://tecdat.cn/?p=22617最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑器  %matplot......
  • 为什么使用交叉熵作为逻辑回归的损失函数?
    整理以前学习过程中的疑问。为什么使用交叉熵作为逻辑回归的损失函数?频率学派的一种估计参数的方法,这种方法适合分类回归任务。必须要提一下的是,频率学派将参数\(\theta\)​看作一个未知待估计的常数,其目标是使用带一定性质的估计方法求出。似然函数就是其中的一种方法。A......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。题目链接:24.两两交换链表中的节点-力扣(LeetCode)建议画图,会更清晰一些。同时注意交换问题要用两个临时节点。class......
  • 虚拟机vmware安装ubuntu磁盘塞满启动爆ubuntu 开机报错 piix4_smbus : SMBus Host Con
    虚拟机vmware安装ubuntu磁盘塞满启动爆ubuntu开机报错piix4_smbus:SMBusHostControllernotenabled错误解决办法  一、vmware硬件增加磁盘空间该虚拟机名称右键[设置]-虚拟机设置-【硬盘(SCSI)】-磁盘实用工具-扩展磁盘容量-【扩展】-增大适当的容量。二、重启VMWA......
  • 【专题】2022中国工业机器人市场研究报告PDF合集分享(附原数据表)
    报告链接:https://tecdat.cn/?p=33224本报告合集将基于中国工业产业升级和智能制造的背景,通过对供应端市场和产业链的分析,结合投资视角,探讨工业机器人企业如何增强自身竞争力,推动中国工业产业发展,为企业带来新的增长和转型机会,并从而思考中国工业机器人行业的现状和未来趋势。阅读......
  • NanoFramework操作ESP32(一)_基础元器件篇(三十七)_ SD读卡器模块
    二、示例代码1、代码:元器件的针脚ESP32模块的针脚GND;供电脚-GND3v3;供电脚+3v3CS MOSI SCK MISO GND ......
  • 虚树学习笔记
    虚树学习笔记虚树,顾名思义,不是真实的树。在关于树的问题中,虚树起到缩小题目规模,优化算法的作用。算法思路引入P2495SDOI2011消耗战设\(dp[i]\)为\(i\)与所有该子树内资源丰富节点不联通的代价。如果\(u\)的儿子\(v\),不是资源丰富节点。\[dp[u]+=\min(w(u,v),dp[......
  • 今日总结
    打开“文心一言”应用程序,您会看到一个简洁明了的界面,界面上有“输入文本”和“选择主题”两个选项。首先,您需要输入要生成的文本内容。在输入框中输入您要生成的文本内容,然后选择您要生成的语言和文字风格(例如普通文字、新闻报道、小说等)。接下来,您需要选择生成文本的主题。......
  • 洛谷题单指南-排序-P1923 【深基9.例4】求第 k 小的数
    原题链接:https://www.luogu.com.cn/problem/P1923题意解读:要最快的求第k小的数,O(n)的做法是利用快排的思想对数据进行划分第一步、取分界点x,通常设x=a[(l+r)/2]第二步、将小于x的挪到x左边,将大于x的挪到x右边第三步、比较,如果x左边的个数大于k,则继续递归处理左边,否则递......
  • 揭秘 Wasitai:AI 图像生成检测利器
    引言Wasitai是一款强大的工具,它允许用户检查一张图片是否由机器生成。用户只需拖拽并放置一张图片或从设备中选择一张,该工具将对图像进行处理,以确定它是由人还是机器生成的。Wasitai的功能1.图像生成检测:Wasitai主要功能是检测图像的生成方式,判断其是否由人工智能或机器生......