Uncle_JohnのPCの部屋

アクセスカウンタ

zoom RSS こんな事出来ます。数行のバッチファイル集

<<   作成日時 : 2013/02/25 12:24   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 5 / トラックバック 0 / コメント 0

個人的に作ったバッチファイルや他の方のリンクを紹介します。
❶特定のファイルを隠しファイルにする。
❷日付時間のファイル名のメモ帳を開く
一日に何度でもいくつでも作れる。
❸最近使ったファイルのショートカットのみを消す。
❹PCの電源を落とす。
❺PCを再起動する。
❻サブフォルダのファイル名をCSV出力
(CSV→Excelで読めるデータ形式)
❼一定の容量ファイルを抽出
❽ファイルをキーワードで整理する。
ファイル名の一部をキーワードにして整理する
❾指定した時間にプログラムを起動する
週報や月報などの処理に便利
❿特定の処理にパスワードを設定する。
ただし、高尚なものではありません。
⓫サブフォルダーデータの拡張子を纏めてスクランブル
(拡張子を変えて見れなくする。何のデータか分からなくする)
【BATファイルのワンポイント】
⓬タイムスケジューラで起動するBATファイルに必要な一行
【コマンドプロンプトやバッチを色々記載、考察している人のサイトから】
⓭ファイル名を特定の文字までを削除したい
【アレンジ1】
◆スペースやアンダーバー「_」をファイル名から抜く
【アレンジ2】
◆半角全角のアンダーバーやハイフンを統一する
⓮バッチファイルで音をだす。WAV等Winアプリを介さずファイル再生(※6)
⓯バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法 (リンクのみ添付)


過去にQ&A等で回答した事例も入れました。
詳しく検証していないけれど役立ちそうなサイトリンクも入れました。
書き込みのコマンド等は充分にダミーデータで検証して使ってください。
バッチファイルは「やり直し」は出来ません。

(当時の確認はWindows XPですが他のOSも考え方は同じです。
私はWindows XPで作成したバッチファイルを検証の上、そのまま、Windows 8で使っているバッチファイルがあります。
重要なデータの書き換え、移動は注意が必要ですのでデバッグを充分に実行してください。※3)

画面の都合上の折り返しに注意してください。




【サンプルリスト】
❶特定のファイルを隠しファイルにする。
"秘密"という文字列を含む名前のファイルで拡張子がjpで始まる任意の拡張子データ、jpgやjpegを含むファイルを隠し属性にします。
例えばファイル名
IMG_0001秘密.jpg、秘密IMG_0002.jpg
が対象となります。主に写真です。
秘密で無くても個人名とかご自由に!!
念のためbmpデータも実行。

特定のフォルダに入れて使用する。
適用範囲はそのフォルダとサブフォルダ
===<JPG_hide.BAT>===
attrib +h *秘密*.jp* /s
attrib +h *秘密*.bmp /s
exit
===ここまで3行===

元に戻すには
===<JPG_appear.BAT>===
attrib -h *秘密*.jp* /s
attrib -h *秘密*.bmp /s
exit
===ここまで3行===

サブフォルダにいれてその親フォルダのサブフォルダ全部に適用
===<JPG_hide.BAT>===
cd ..
attrib +h *秘密*.jp* /s
attrib +h *秘密*.bmp /s
exit
===ここまで4行===

元に戻すには
===<JPG_appear.BAT>===
cd ..
attrib -h *秘密*.jp* /s
attrib -h *秘密*.bmp /s
exit
===ここまで4行===

隠しファイルが見れる設定にすれば意味がありませんが…
そう言う人はファイル名拡張子を『ren』で変えてしまえば…
後述のパスワードも組み合わせると結構面白いかもしれません。




❷日付時間のファイル名のメモ帳を開く
一日に何度でもいくつでも作れる。
===<DateFileNote.BAT>===
@echo off
set fname=%TIME::=%
set fname=%fname:~0,6%
set fname=%fname: =0%
set fname=%DATE:/=%_%fname%
type nul > %fname%.txt
start notepad.exe %fname%.txt
exit
===ここまで8行===

利用の仕方はバッチファイルをディスクトップにおいて、上司の命令や電話を受けて要件をメモする代わりにクリックしてディスクトップにメモ帳が作成されると言った具合です。
要件がクリアになったら日付メモ帳を捨てます。要件を受けた時間もファイル名で分かるし…




❸最近使ったファイルのショートカットのみを消す。
WindowsXpの場合
他のOSはcdの指定など注意
===<RecentErase.BAT>===
@echo off
echo ******************************
echo 最近使ったファイルのショートカットを消す。
echo ******************************
c:
cd "c:\documents and settings\John\recent"
dir /w
set /p USER_DATA_INPUT="ショートカットを消去しますか?(y/n)"
if /i %USER_DATA_INPUT%==y (erase *.lnk) else exit
pause
exit
===ここまで11行===

注意)ショートカットの拡張子は「lnk」です。




❹PCの電源を落とす。
動作はWindowsXpで確認
===<PCShutdown.bat>===
@echo off
cd c:\windows\system32
start shutdown.exe /s /t 30
exit
==ここまで4行===




❺PCを再起動する。
動作はWindowsXpで確認
===<PCReStart.bat>===
@echo off
cd c:\windows\system32
start shutdown.exe /r /t 30
exit
==ここまで4行===




❻サブフォルダのファイル名をCSV出力
===<FileListOut.bat>===
rem ファイル名出力
@echo off
dir /w /og
echo ***********************************************************
echo フォルダー中のファイルをCSV形式でリスト出力します。
set /p F_NAME_INPUT="リストを出力するファイル名を入力してください?(.csv入力不要)"
if exist %F_NAME_INPUT%.csv goto :EXTFILE
for /r /d %%d in (*) do dir /b /on %%d\*.* >> %F_NAME_INPUT%.csv
goto :EOF
:EXTFILE
echo ファイルが既に存在します。再度起動し別の名前を入力してください。
pause
exit
==ここまで13行===

(※1)
「for /r /d」は基本的に間違ったコーディングの様ですがローカルディスク(D:)等でマイドキュメント以外では一応使えます。
ただし、一部の特殊フォルダではエラーとなる場合があります。
マイドキュメントやマイピクチャなどで「構文エラー」を確認しました。
これ以上の工夫、デバッグはお任せします。
(※1ここまで)




❼一定の容量ファイルを抽出
↓↓
http://soudan1.biglobe.ne.jp/qa7958463.html




❽ファイルをキーワードで整理する。
これは結構すぐれものです。
moveコマンドに/-yオプションを付けるとかすれば完璧かも…
細かい動作確認はしていませんが拡張子とか意識しなくても出来ました。
ファイル名の一部(共通項)をキーワードにして別フォルダに分類です
写真やテキストデータなどファイル名を適宜変えているとかならば結構使いでがあります。
結構危険が伴いますのでダミーデータでデバッグしてください。

ファイルをキーワードでフォルダに振り分けるバッチ
↓↓
http://d.hatena.ne.jp/kazuki-kido/20070803/1186159519

コーディング例
報告書-会社A.docx
報告書-会社B.docx
報告書を会社名フォルダなどに整理したつもりが…
そんな場合にバッチファイルを作ってクリックし実行すると整理してくれます。

===
%echo on
set KEYWORD="会社A"
mkdir %KEYWORD%
for /r %%i in (*%KEYWORD%*) do move "%%i" %KEYWORD%

set KEYWORD="会社B"
mkdir %KEYWORD%
for /r %%i in (*%KEYWORD%*) do move "%%i" %KEYWORD%



===




❾指定した時間にプログラムを起動する
週報や月報など定期的にソフトやデータを起動できれば便利かも…
Windowsでも出来ると思いますが他にもいろいろ載っています。

【コマンドプロンプトで効率Up】から
コマンドプロンプトで指定した時間にプログラムを起動する
↓↓
http://cmd-pro.com/m_timer.html




❿特定の処理にパスワードを設定する。
⓫サブフォルダーデータの拡張子を纏めてスクランブル
都合上、纏めて説明します。

エクセルデータの拡張子「xlsx」をちょっといじって見れなくします。
この場合「ysx」にしてしまいます。「*」の部分にワイルドカードを上手く使えば特定のデータのみ対象にすることが出来ます。

まず、見れなくするには実質1行です。
バッチファイルとデータが同じフォルダにあれば
===
ren *.xlsx *.ysx
===
親フォルダにバッチファイルを置いてそこにあるサブフォルダ、子フォルダの中のエクセル全部を対象にするにはやっぱり1行です。ある意味これがバッチファイルの魅力です。
===
for /D %%d in (*) do ren %%d\*.xlsx *.ysx
===
(※2ここから)又は、
===
for /r /d %%d in (*) do ren %%d\*.xlsx *.ysx
===
/r はスペースを含むファイル名に使えません。
※2 ここまで)

さて、元に戻すコーディングは拡張子を逆に指定すればいいのですが誤ってクリックされるとばれてしまいます。
ちなみに
===
ren *.ysx *.xlsx
===
又は
===
for /D %%d in (*) do ren %%d\*.ysx *.xlsx
===
(※2ここから)又は、
===
for /r /d %%d in (*) do ren %%d\*.ysx *.xlsx
===
/r はスペースを含むファイル名に使えません。
※2 ここまで)
これではつまらないのでパスワードを付けます。半角の「ABCD」にしました。また都合上4桁ですが好きに設定してください。

===ここから
set /p USER_DATA_INPUT="コード入力(4ケタ):"
if /i %USER_DATA_INPUT%==ABCD (for /D %%d in (*) do ren %%d\*.ysx *.xlsx) else (ECHO コードが違います!!)
pause 終了します!!
===ここまで3行

バッチファイルを覘かれると嫌ですね!何となく意味がわかってしまうし…
そこでメモ帳で好きなパスワードを1行入れてそれと比較します。
また、メモ帳で保存するときに拡張子まで指定します。
拡張子をtxtで保存して無理やり拡張子名を変えても構いません。
Windows上で予約の無い拡張子なら何でもいいのですが「xxx」としました。
出来ればそれらしいものがいいと思います。
この場合『PW_FILE.XXX』と言う名前でパスワードを1行のみ入れてバッチファイルと同じ場所にメモ帳で保存します。出来れば隠し属性にした方がいいと思います。
(※1)
さて、メモ帳で拡張子まで指定して開くことが出来ますが一旦開いてしまうとWindowsが覚えてしまって次からはクリックしただけで開いてしまいますのでメモ帳では開かないようにしてください。
その場合Windows上でキャンセルする必要があります。
(※1ここまで)

===メモ帳『PW_FILE.XXX』のコーディング
ABCD
===ここまで

(※1)
ちなみに「for /i」では「abcd」でも通ってしまいます。
この場合は「/i」を削除します。
その辺り含め後の工夫はお任せします。
基本コマンドなどのコーディングには大文字(ABCD...)、小文字(abcd...)は区別は有りませんが指定したり、変数の文字など一部、区別される場合があります。
(※1ここまで)
数字でも多分全角でもキーワード、パスワードとして使えると思います。
メモ帳のこのデータは拡張子を変えたのでクリックしただけではこのファイルは覘けません。
内容を確認するにはコマンドプロンプト上でCD(コマンドのカレントドライブCDの事です)を合わせた上で
C:\ABCD\EFG>type pw_file.xxx
とするか拡張子を一旦、「txtに戻します」
さて大文字小文字ごっちゃですけど使えますのであしからず、技術的にはたぶんACCII文字(1バイト文字時代)の最上位ビットを無視しているだけです。バイトデータの最上位ビットを無視(0でも1でも同じに扱う)

===ここから
SET /P P_WORD=<PW_FILE.XXX
set /p USER_DATA_INPUT="合言葉は?「山」:"
if %USER_DATA_INPUT%==%P_WORD% (for /D %%d in (*) do ren %%d\*.ysx *.xlsx) else (ECHO 残念でした!バイバイ!!)
pause 終了します!!
===ここまで4行

コマンドプロンプトやプログラムを知らない人には厄介です。
でも知っている人なら簡単ですけど…
if文の構成をいじって隠し属性にまでするとかすればもっと高尚ですが所詮バッチなのでこれ位にしときます。




【BATファイルのワンポイント】

⓬タイムスケジューラで起動するBATファイルに必要な一行

タイムスケジューラでバッチファイルを動かしたいときは
バッチファイルの先頭行に半角英文字で
===
cd /D %~dp0
===この一行
を追加してみてください。
詳細は以下のサイトで

タスクスケジューラに登録したバッチファイルが動かない
↓↓
http://www.love-hokuto.com/?p=1248

私は本件を詳細に検討した訳ではありませんが、基本、BATファイルはそのファイルが、ショートカットでもショートカットのリンク先の本体BATが存在するファイルの場所がコマンドプロンプトのカレントディレクトリになります。
その関係がタイムスケジューラでは上手くいかない様です。

その辺を検討されているのが以下Q&Aです。

(ご参考程度)
タスクスケジューラでbatファイルを動かしたい
↓↓
http://soudan1.biglobe.ne.jp/qa9157215.html




(※5
【コマンドプロンプトやバッチを色々記載、考察している人のサイトから】

⓭ファイル名を特定の文字までを削除したい
↓↓
http://d.hatena.ne.jp/jak-san/20090305/1236256670
↓↓
「23564_abcdef_1a2b3c」というような「_」で繋いだ文字列のファイル名を、最初の「_」までを、その「_」自身も含めて削除したいのです。

このサイトはコマンドプロンプトに関して色々と結構面白い考察があります。

上記サイトをアレンジ

【アレンジ1】
◆スペースやアンダーバー「_」をファイル名から抜く

特定の文字を纏めて削除するのに使えます。
対象はバッチファイルのあるフォルダのみ

特定の文字に替える場合、以下のcall文を
call set newname=%%fname:【文字A】=【文字B】%%
以下の例では削除なので【文字B】は全く文字が入りません。
ファイル名 ABC_001.txt→ABC001.txt 等にする

応用として「(」、「)」を外したりもできます。

半角、全角アンバーバーの例
===
@echo ******** UnderBarReject..bat ********
@echo off
@echo 処理しています。しばらくお待ちください。
for /F "delims=" %%f in ('dir /b') do call :sub "%%f"
@echo 処理が終わりました。
pause
exit /b
:sub
set fname=%~1
set n=0

:loop
call set c=%%fname:~%n%,1%%
set /a n=n+1
if "%c%"=="" goto :EOF
if "%c%"=="_" goto break0
if "%c%"=="_" goto break1
goto loop

rem 半角"_"処理

:break0
call set newname=%%fname:_=%%

if "%newname%"=="" goto :EOF
if "%newname:~0,1%"=="." goto :EOF
ren "%fname%" "%newname%"
goto :EOF

rem 全角"_"処理

:break1
call set newname=%%fname:_=%%

if "%newname%"=="" goto :EOF
if "%newname:~0,1%"=="." goto :EOF
ren "%fname%" "%newname%"
goto :EOF
===

尚、スペースやアンダーバーを削除した結果、同じファイル名になる場合のエラー処理は考慮していません。
やってみたところ、ファイル名が既に存在する場合、リネーム(ren)は実行されません。
以下【アレンジ2】も同様です。

【アレンジ2】
◆半角全角のアンダーバーやハイフンを統一する

対象はバッチファイルのあるフォルダのみ
応用例としてbreakの数を増やしてハイフン「ー」、「−」、「‐」、「-」を一定の文字半角「-」に統一したりできます。

===
@echo ******** UnderBar.bat ********
@echo off
@echo 処理しています。しばらくお待ちください。
for /F "delims=" %%f in ('dir /b') do call :sub "%%f"
@echo 処理が終わりました。
pause
exit /b

:sub
set fname=%~1
set n=0

:loop
call set c=%%fname:~%n%,1%%
set /a n=n+1
if "%c%"=="" goto :EOF
if "%c%"=="_" goto break
goto loop

rem 全角"_"→ 半角変換処理

:break
call set newname=%%fname:_=_%%

if "%newname%"=="" goto :EOF
if "%newname:~0,1%"=="." goto :EOF
ren "%fname%" "%newname%"
goto :EOF
===



※5ここまで)



(※6
⓮バッチファイルで音をだす。WAV等Winアプリを介さずファイル再生

詳しくは以下URLを参照ください。
応用としては、特定の処理が終わったら、音をだして終了を教えるとか?

バッチで,wavなどの音声を再生しよう (コマンドプロンプトから音を鳴らす方法)
↓↓
http://language-and-engineering.hatenablog.jp/entry/20100729/p1

コピペがしづらかったので以下に@mshata以外の行は「Windows10版に若干変えて、抜粋します。
@mshta "about:playing...行は長いですがネタ元のの添付リンクサイトからコピペして下さい。
”くの字括弧”記号が本ブログのコントロールコード(タグ)になっているので本ブログでは貼り付け出来ませんでした。

===ここから
@rem 音源の場所を指定
@set WAVPATH=C:\WINDOWS\Media\Alarm02.wav
@rem 再生時間長をミリ秒で指定
@set HTA_MAX_TIME=5000
@rem 再生実行
@mshta "about:playing... ←この行は上記サイトでコピペしてください
@pause
===ここまで

@はコンソール画面に処理等を表示しない様に付加
「set WAVPATH=」には実際に使うPCのWevデータを指定します。
後は、@mshta以外そのままコピペでOKです。

【応用例】
sfcはともかく、dismはパラメータが覚えられない!
時間が掛かるし終わった時、音を鳴らしたい!
なお、sfcやdismは管理者で実行が必要です。
【ワンポイント】バッチファイルを管理者で動かすには?
・バッチファイルで右クリックで「管理者として実行」
もしくは
・バッチファイルのショートカットを作りそのショートカットで右クリック→プロパティの「ショートカット」タブで詳細設定して管理者として実行できるようにし、ショートカットをクリック実行します。


===【音付、開始終了の時間表示版sfc、dismバッチ】(Windows8/8.1/10用)
@rem 音源の場所を指定
@set WAVPATH=C:\WINDOWS\Media\Alarm02.wav

@rem 再生時間長をミリ秒で指定
@set HTA_MAX_TIME=5000

@rem 再生実行

@date /t
@echo sfc スタート
@time /t

sfc /scannow

@time /t

@mshta "about:playing... ←この行は上記サイトでコピペしてください


@pause

@echo dism スタート
@time /t

DISM /Online /Cleanup-Image /RestoreHealth

@time /t

@set WAVPATH=C:\WINDOWS\Media\Alarm01.wav
@set HTA_MAX_TIME=5000
@mshta "about:playing... ←この行は上記サイトでコピペしてください


@pause
===
sfc実行後、音で終了を知らせます。
任意のキーでdismがスタート、必要が無ければコンソール右上[×]で終了
(Y/Nを入力させた方がスマートですがそこはご自分で考えてください)
なお、sfc、dismをキー入力なしに続けて実行したければ
@echo dism スタート
の前の
@pause
を削除してください。
空白行は実行時の見栄えを考えての事です。

※6ここまで)


===



(※7
半角%やチルダを理解するのは難しいです。
以下のサイトはその参考にもなります。

⓯バッチファイルでファイルパスからファイル名や拡張子を自由に取り出す方法
↓↓
http://orangeclover.hatenablog.com/entry/20101004/1286120668

7ここまで)



【付録】

バッチファイルの作り方
↓↓
http://uncle-johns-room.at.webry.info/201302/article_1.html

(※4ここから
【最後に】

・コマンドプロンプトに関して
コマンンドプロンプトはインタプリタ系の動作をします。
インタプリタとはコンパイル系の言語とは異なり一行ずつ機械語に、CPUに理解可能なコードに変換して処理をします。
コンパイラ系言語は全文を纏めて機械語に変換します。
exeファイルはコンパイルされた機械語のデータの塊です。
対してこのインタプリタは一行ずつ機械語に変換して処理をし、終わったら次の行を読み込みます。
故に、エラー行を読みこんで初めてエラーが出ます。
また、このコマンドプロンプトのバッチファイル処理は旧来のインタプリタ系プログラム言語のBESICとも異なり原則、前の行に飛ばすことが出来ません。
goto文など常に後ろの行に飛ばすか「goto :EOF」としてそこで処理を終わらせるしか出来ないので注意してください。
(※5:goto文で前行に飛ばすことに関して、Call文など例外があるみたいです。もしくは無限ルールを避けるために終了コードが中に無いと前に戻せないとか、この辺は思考錯誤してください。前項の「◆ファイル名を特定の文字までを削除したい」をご一読ください。)
本来、OSの構築など一行ずつ処理してWindowsを構築、スタートさせるものと同じ機能なので高尚な処理、前の行へ飛ばす、処理済みの行に飛ばす、という事は出来ないので注意してください!

※4ここまで)


2013/04/04 全面改定
(※1)2013/04/23 大文字、小文字の区別に関する訂正、その他
(※2)2013/06/21 一部追加、2013/06/29 /r の場合の注記追加
(※3)2015/08/12 OSに関して追記
(※4)2015/10/22 コマンドプロンプトに関して追記
(※5)2017/03/13 ファイル名編集バッチファイルサイト追加、goto文記載注記追加
(※6)2017/05/19 wavファイル等、バッチ上で再生を追記 05/23 mshta コピペ不備訂正
(※7)2017/05/31 ファイル名やパスに関するバッチリンク追加、見辛くなってきたので◆→❶へ訂正

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 5
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
こんな事出来ます。数行のバッチファイル集 Uncle_JohnのPCの部屋/BIGLOBEウェブリブログ
文字サイズ:       閉じる