トップ 差分 一覧 ソース 検索 ヘルプ ログイン

《Win》バッチ処理(〜.bat)

[Win]

基本

リファレンス

DOS コマンド一覧 - Programming Field
https://www.pg-fl.jp/program/dos/doscmd/

バッチファイル基礎文法リファレンス - Qiita
https://qiita.com/kshibamo/items/9368b0b2a4a2f40b61f1

Windowsのバッチファイルの基本的な使い方 (1/4):Tech TIPS - @IT
https://www.atmarkit.co.jp/ait/articles/1506/26/news026.html

実行したいコマンド列を列挙し、文字コードを「ANSI」あるいは「Shift-JIS」形式にして保存すればよい(「Unicode」や「UTF-8」形式は不可)。
ファイルの拡張子は「.bat」か「.cmd」のいずれかにしておく。どちらでも違いはないが、今なら.cmdでよいだろう。
コマンドの実行を途中で一時的に止めたい場合は、[Ctrl]+[S]や[Pause]キーを押すと表示が止まる
(何も画面に表示しないコマンドは、その作りにもよるが、止めるのは難しい)。
そこで何かキーを押せば実行は再開するし、
[Ctrl]+[C]や[Ctrl]+[Break]キーを押すと「バッチ ジョブを終了しますか (Y/N)?」と表示されるので、
[y]を入力すると中断できる。

バッチファイルで処理を自動化する
https://pc-more.fimplex.com/article/batch_file/

コマンドプロンプトで動くWindows10のバッチファイルの作成と実行 | サービス | プロエンジニア
http://proengineer.internous.co.jp/content/columnfeature/5104

Windowsバッチまとめ - Qiita
https://qiita.com/tomotagwork/items/5b9e08f28d5925d96b5f

今さら聞けない!コマンドプロンプトの使い方【初心者向け】 | TechAcademyマガジン
https://techacademy.jp/magazine/5318

基本コマンドプロンプト25選!逆引きコマンド一覧 | サービス | プロエンジニア
https://proengineer.internous.co.jp/content/columnfeature/5007

Windowsコマンド集
https://tech.nikkeibp.co.jp/it/free/NT/WinKeyWord/20040805/1/list2.shtml

共通

【Windows】バッチファイルの引数 at softelメモ
https://www.softel.co.jp/blogs/tech/archives/2140

修飾子 説明
%~1 %1 を展開し、囲んでいる二重引用符 (“”) がある場合は削除します。
%~p1 %1 をパスに展開します。
%~n1 %1 をファイル名に展開します。
%~x1 %1 をファイル拡張子に展開します。
%~t1 %1 をファイルの日付と時刻に展開します。
%~dp1 %1 をドライブ文字とパスに展開します。
%~nx1 %1 をファイル名と拡張子に展開します。
%~z1 %1 をファイルサイズに展開します。

コマンド拡張機能

https://www.pg-fl.jp/program/dos/doscmd/cmd.htm

/E:ON | /E:OFF | /X | /Y
プロンプト起動時のコマンド拡張機能を有効にするかどうかを設定します。「/E:ON」を設定すると有効に、「/E:OFF」を設定すると無効になります。指定しない場合はレジストリのEnableExtensionsの設定が使用され、これらも存在しない場合は有効になります(未確認)。
コマンド拡張機能はバッチファイル内のSetlocalコマンドで動的に変更することもでき、このコマンドによる設定が優先されます(ただしプロンプト上ではSetlocalで変更しても効果がありません)。
「/X」は「/E:ON」と、「/Y」は「/E:OFF」とそれぞれ同じ意味を持ちます。

@

「@」 (アットマーク) - DOS/コマンドプロンプト コマンド一覧 - Programming Field
https://www.pg-fl.jp/program/dos/doscmd/str_at.htm

コマンドの先頭に「@」を付加することでコマンドラインの出力を抑制

for

forループの中で値を変化させる
https://jj-blues.com/cms/wantto-changevalueinfor/

for文の中で値を変化させたい場合はfor文全体を、「setlocal enabledelayedexpansion」と「endlocal」で挟みます。
また、for文内で使用する変数は「%」ではなく「!」で囲みます。

定型

処理をするか確認する

バッチ実行時にメッセージを出して処理の続行を確認する方法 - Project Group
https://www.projectgroup.info/tips/Windows/cmd_0028.html

SET /P ANSWER="実行します。よろしいですか (Y/N)?"

if /i {%ANSWER%}=={y} (goto :yes)
if /i {%ANSWER%}=={yes} (goto :yes)
EXIT

:yes
echo 処理開始

ファイルリストを作成する

バッチコマンドで定型処理を行う (1/3):超入門コマンドプロンプト - @IT
https://www.atmarkit.co.jp/ait/articles/1709/15/news034.html

改変して、ファイルを書き出す

dir *.png /B /W > filelist_png.txt

ファイルリストをotbeditで開く

dir *.* /A:-D /B /W /S > filelist.txt
start "" "C:\data\software\otbedit\otbedit.exe" "filelist.txt"

フォルダリスト

dir /A:D /B /W > folderlist.txt
/A ファイルの属性を絞る
/A:D ディレクトリのみ
/A:-D ディレクトリ以外
/A:R 読み取り専用属性
/A:A アーカイブ属性
/A:S システム ファイル属性
/A:H 隠しファイル属性
/B 一行に1つずつファイル名、またはディレクトリ名が表示されます
/O:<sort> ソート順(N:アルファベット順/S:サイズ昇順/E:拡張子アルファベット順/D:日時が古い順/G:ディレクトリから先に表示)
/S サブディレクトリもすべて表示
/W この表示では更新日時やファイルサイズは表示されません

改行しない場合

windows - dirコマンドで取り出したファイル名を連結させたい - スタック・オーバーフロー
https://ja.stackoverflow.com/questions/4745/dir%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E9%80%A3%E7%B5%90%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84

for(バッチファイルで繰り返し処理をする)
https://jj-blues.com/cms/command-for/

echoコマンドと行末スペース
http://chaichan.lolipop.jp/vbtips/VBMemo2006112101.htm

setlocal enabledelayedexpansion
set filetxt=
for /f "delims=" %%A in ('dir *.jpg *png /B') do (
    set filetxt=!filetxt!,%%A
 )
echo %filetxt:~1%> file.txt

クリップボードにファイルのフルパスをコピーする

rem ドラッグしたファイルのフルパスを「clipfullpath.dat」に一時的に記入し、クリップボードにコピーする
rem 「clipfullpath.dat」は作業前後に消去する

rem 一時ファイル「clipfullpath.dat」の場所(サーバ上のフルパスも取得できるよう自端末内にする、%USERPROFILE%\Desktop は自分のデスクトップ)
set pathclip=%USERPROFILE%\Desktop

@echo off

rem 一時ファイル「clipfullpath.dat」があったら削除する
if exist %pathclip%\"clipfullpath.dat" del %pathclip%\"clipfullpath.dat"

rem ドラッグしたファイル名を「clipfullpath.dat」に追記する
for %%f in (%*) do (
  echo.%%~f>> %pathclip%\clipfullpath.dat
)

rem クリップボードに「clipfullpath.dat」の内容をコピーする
clip < %pathclip%\clipfullpath.dat

rem 一時ファイル「clipfullpath.dat」を削除しておく
del %pathclip%\"clipfullpath.dat"

% (パーセント) - DOS/Windows コマンド一覧 - Programming Field
https://www.pg-fl.jp/program/dos/doscmd/str_percent.htm

フォルダ

フォルダのリネーム

rem ドラッグしたフォルダの3文字目から6文字分にリネーム(YYYYMMDD〜 → YYMMDD)

@echo off
set fn=%~n1
ren "%fn%" "%fn:~2,6%"

フォルダを開く

指定のサーバの指定のフォルダを開く

start \\172.20.101.4\Exchange\%date:~-5,2%%date:~-2,2%\企画01

エクスプローラーで開きたい場合

  1. 開きたいフォルダのショートカットを作る
  2. 作成したショートカットのプロパティでリンク先を下記にする(〜〜〜はファイルのパス)
C:\WINDOWS\explorer.exe /n,/e,C:〜〜〜
  • これをスタートメニューなどに入れると便利

フォルダを作成する

set dirname=%date:~2,2%%date:~5,2%%date:~8,2%
mkdir D:\__inbox\__ex\%dirname%

Windowsのバッチファイル中で日付をファイル名に使用する (1/2):Tech TIPS - @IT
https://www.atmarkit.co.jp/ait/articles/0405/01/news002.html

「date」や「time」などの変数を使えばよい(環境変数として参照する場合はそれぞれ「%date%」「%time%」と記述する)
ある変数の先頭(文字列の左端)からm番目の文字からn文字だけを取り出すには、「%V:~m,n%」とする(mは0から始まる)。
mに負の数を指定すると、先頭ではなく、最後尾から数えた文字位置になる。

Windows のバッチファイルで日付をファイル名にしたディレクトリを作成する Codaholic
http://codaholic.org/?p=1829

mkdirコマンド(ディレクトリを作成する)
http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0254.HTM

rem 指定したファイルの更新日のフォルダを作成します

rem 最終更新日(lmdataに設定)を取得し、YYMMDD形式に
for %%i in (%1) do set "lmdate=%%~ti"
set dirname=%lmdate:~2,2%%lmdate:~5,2%%lmdate:~8,2%

mkdir %dirname%

ファイルのタイムスタンプの取得|/bin/shに慣れた人に贈るバッチファイルの書き方
https://zenn.dev/zetamatta/books/c84cbe23093eee1b5830/viewer/004fee

ファイルの更新日を取得する
https://commandprompt.noyokan.com/command/filedate.html

(コマンドプロンプトを使う場合)
名前が日付のフォルダを作る | 徒然日記
http://blog.tan-w.net/archives/10021

(レジストリエディタを使う方法)
右クリックメニューの新規作成から今日の日付フォルダーを一発で作れるようにする - Qiita
https://qiita.com/alg/items/55e78056c9e3e3952806

フォルダを削除する(要注意)

空ディレクトリを削除する - Darkwood’s Blog
https://darkwood.hatenadiary.org/entry/20160519/1464173644

%echo off
echo;
echo %0
echo;
set fileName=%0
if "%fileName:~1,2%"=="\\" (
    echo マウントされていません。終了します。
    echo;
    pause
    @echo on
    GOTO :EOF
)

FOR /D %%i IN (*.*) DO CALL :SUB "%%i"
@echo on
GOTO :EOF

:SUB
FOR /D %%x IN ("%~1\*.*") DO CALL :SUB "%%x"
echo %1
rmdir %1

exit /b

複数のファイルをドラッグで処理する

リネーム

rem ドラッグしたファイルの末尾にaddname=以下を追加

@echo off
set addname=_r

for %%f in (%*) do (
  move /-Y %%~nxf %%~nf%addname%%%~xf
)

更新日を修正

for %%f in (%*) do (
  copy /B "%%~nxf" + ,,
)

パスに空白を含む複数ファイルを一括処理するバッチを書く(for〜in〜do) | TeraDas
https://www.teradas.net/archives/8873/

バッチファイルにドラッグアンドドロップした時のファイル名の扱い方 - oimohのブログ
https://higa.hateblo.jp/entry/2019/04/24/181204

Windowsバッチファイルに複数のファイルをドラッグ&ドロップ - 日曜プログラマーの個人的覚書
https://mas-inagaki.hatenadiary.org/entry/20100201/1265007622

ファイル名 一括変換 バッチファイル 備忘録
https://www.google.co.jp/amp/s/nw-engineer.work/filename/amp/

ファイルの一覧とファイルサイズの取得

rem ドラッグしたファイルと同じフォルダ内のファイルのサイズを一覧で取得する(クリップボードにコピー)

rem ==== 設定 ====
rem 一時ファイル「clipfilelist.dat」「clipfilesizelist.dat」の場所(%USERPROFILE%\Desktop は自分のデスクトップ)
set pathclip=%USERPROFILE%\Desktop\clipfilelist.dat
set sizeclip=%USERPROFILE%\Desktop\clipfilesizelist.dat

@echo off

rem 一時ファイル「clipfilelist.dat」「clipfilesizelist.dat」があったら削除する
if exist %pathclip% del %pathclip%
if exist %sizeclip% del %sizeclip%

rem ドラッグしたファイルの一覧を「clipfilelist.dat」に記録する
pushd %~dp1
dir *.* /A:-D /B > %pathclip%

rem for文内で値を変化させる
setlocal enabledelayedexpansion

rem リスト「clipfilelist.dat」のファイル名を順に取得し、ファイル名とファイルサイズを「clipfilesizelist.dat」に記録する
rem ファイルサイズはバイト単位からキロバイト単位にする(四捨五入の代わりに、512バイト足して1024で割り、小数点以下切り捨て)
for /F %%i in (%pathclip%) do (
  set fsize=%%~zi
  set /a fsize=!fsize! + 512
  set /a fsize=!fsize! / 1024
  echo %%~nxi(!fsize!KB)>> %sizeclip%
)

endlocal

rem クリップボードに「clipfilesizelist.dat」の内容をコピーする
clip < %sizeclip%

rem 一時ファイル「clipfilelist.dat」「clipfilesizelist.dat」を削除しておく
del %pathclip%
del %sizeclip%

exit

forループの中で値を変化させる
https://jj-blues.com/cms/wantto-changevalueinfor/

バッチでファイルサイズを計算(基礎編): ハードなソフトの話
https://hardsofttalk.seesaa.net/article/201702article_3.html

バッチファイル内で計算を行う
https://jj-blues.com/cms/wantto-calculationinbatfile/

アプリを起動する

よく使うアプリを一発で起動・終了できるbat - うれしいブログ
https://kiyoshi.hatenablog.com/entry/20120816/1345072170

Chrome

set path=%~dp0
set path=%path:\=/%
set indexpath=file:///%path%html/index.html

start chrome.exe --allow-file-access-from-files "%indexpath%"

Windows Media Player

例:月別に再生動画を変える

set moviefile="C:\data\movie\movie1.mp4"
set MM=%DATE:~5,2%
if %MM% leq 03 ( goto play )
if %MM% geq 12 ( goto play )
set moviefile="C:\data\movie\movie2.mp4"
:play
start "" "C:\Program Files (x86)\Windows Media Player\wmplayer.exe" %moviefile%

Rekisaのオプション

rem バッチを起動したディレクトリの「.png」ファイルのリストを作成する
dir *.png /B /W > filelist_png.txt

rem Rekisaで、作成したファイルを開く
start "" "D:\__Application\Rekisa\Rekisa.exe" "filelist_png.txt" "-WindowPosition=(1920,0)" "-WindowSize=(1280,1000)"

ファイルのコピー

Copy - DOS コマンド一覧 - Programming Field
https://www.pg-fl.jp/program/dos/doscmd/copy.htm

rem ドラッグしたファイルに更新日_YYMMDDを追加し、「_old」以下に複製します
rem lmdate:更新日

rem 個別にファイルを順次処理、for文内で変数(!で囲む)が使える処理(setlocal〜endlocal)
setlocal enabledelayedexpansion

for %%1 in (%*) do (

rem 更新日を設定
  set mod=%%~t1
  set lmdate=!mod:~2,2!!mod:~5,2!!mod:~8,2!

rem 「_old」フォルダが無ければ生成
if not exist %~dp1_old mkdir %~dp1_old

rem ファイルに更新日を付けてコピー
rem /-Y:上書きするかどうかの確認メッセージを表示 /B:バイナリファイルとして扱います。(ファイル結合を行わない場合の既定の動作)
  copy /-Y /B "%~dpnx1" "%~dp1_old\%~n1_!lmdate!%~x1"

)
endlocal
@echo off

rem ファイル名を取得
set filename=%~n1

rem ファイル名の末尾6文字を取得し、不要なスペースを削除
set datenum=%filename:~-6%
set datenum=%datenum: =%

rem 今日の日付YYMMDDを設定
set nowdate=%date:~2,2%%date:~5,2%%date:~8,2%

rem もし今日の日付なら何もせず、小さければ置き換え、それ以外はファイル名に日付を加える
if %datenum% equ %nowdate% ( exit )
if %datenum% lss %nowdate% (
 set newname=%filename:~0,-6%%nowdate%%~x1
 goto output
 )

set newname=%filename%_%nowdate%%~x1
goto output

rem ファイルをコピーし更新日時を現在時刻に
:output
@copy /-Y /B "%~nx1" "%newname%"
@copy /B "%newname%" + ,,

更新年月日をファイル名の末尾に追加するバッチの作成 : エンジニアのメモ帳
http://blog.livedoor.jp/nao31d/archives/11975366.html

rem 「copy」フォルダがなければ作成

if not exist copy mkdir copy

rem ドラッグしたファイル名を取得

set filename=%~nx1

rem リスト「list.txt」のファイル名をつけてコピーし、更新日時を現在時刻にし、copyフォルダに移動

for /F %%i in (list.txt) do (
  copy "%filename%" /B "%%i"
  copy /B "%%i" + ,,
  move %%i copy
)

ファイル名をCSVファイルにしたがって一括置換する - Webサイトリニューアル - 専門家プロファイル
https://profile.ne.jp/w/c-59556/

rem beforeフォルダのファイルを、rename.csv に従って名前を変更(コピー)します
rem rename.csv の1列目が元のファイル名、2列目が新しいファイル名で、どちらも拡張子が必要です

rem tmpフォルダ:一時的な作業フォルダ(ファイル名交換時の上書き防止)
rem afterフォルダ:リネームしたファイルの格納フォルダ
rem tmp/afterフォルダがなければ作成します

if not exist tmp mkdir tmp
if not exist after mkdir after

rem rename.csv を読み取り、beforeフォルダからtmpフォルダに移動して名前を変え、afterフォルダに移動します

for /f "tokens=1,2 delims=," %%a in (rename.csv) do (
  copy before\%%a tmp
  ren tmp\%%a %%b
  move tmp\%%b after
)

rem tmpフォルダを削除します

rmdir tmp

リンクファイルを作成

【Microsoft Teams】ダウンロードの保存先を変更する方法 | Step1
https://alfort.online/2925

コマンドプロンプトで、ダウンロードフォルダを別のフォルダに「ジャンクション」を設定する
要は、全てのダウンロードフォルダが変更になる

- 管理者権限で、コマンドプロンプトを起動
- mklink /j "C:\Users\(username)\Downloads" "D:\data\download" などでダウンロードの変更先を指定

再起動・シャットダウン

Windowsの再起動バッチファイル - info-cache.com
http://info-cache.com/utility/restart.html

Windows10のスタートアップフォルダーを開く - WildLight
https://wildlight.blog/2015/08/16/openwindowsstartupfolder/

rem スタートアップの内容を避難して、再起動する

rem スタートアップのフォルダパス
set stpath=C:\Users\takahashi\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

rem 避難先のフォルダパス(ない場合は作成)
set escpath=C:\data\tem\スタートアップ避難
if not exist %escpath% mkdir %escpath%

set /P answer="スタートアップの内容を避難して、再起動します。y=移動して再起動 / n=避難先から戻す / m=移動だけ / f=各フォルダを開く →"

if /i {%answer%}=={y} (
	rem ファイルを移動(stpathにスペースが含まれるので、ダブルクォートで囲む)
	move "%stpath%\*.*" "%escpath%"

	rem 10秒後に再起動(警告なしオプション /f は使用せず)
	shutdown.exe /r /t 10
)

if /i {%answer%}=={m} (
	move "%stpath%\*.*" "%escpath%"
)

if /i {%answer%}=={n} (
	move "%escpath%\*.*" "%stpath%"
)

if /i {%answer%}=={f} (
	explorer %stpath%
	start %escpath%
)

exit