palm84.com

革命的愛熊主義者同盟!

【私的】Windowsのコマンドラインツール

2021.4.1 移転しました...
  • このページの旧URLは
    • http://www10.plala.or.jp/palm84/commandline.html
内容古いです

最終更新日は 2012.3.20、ご注意。

リンク先テキストファイル (.txt) はブラウザで開くと文字化けするのでご注意

2007.4.17 書き出したら切りがありません(orz)。絶賛校正しまくり中...

目次
クリックで表示オン/オフ

2010.3.8 Windows 7 対応について確認中...
2010.6.3 00_Tool_download.bat などの一部URL,ファイル名を更新
2012.3.20 00_Tool_download.bat などの一部URL,ファイル名を更新,自作ばっち追加
最終更新日 2012.3.20

※Windows XP 用です。

あぁ私的、とっても私的(何)・・・

お約束?

尚、ここのバッチファイルについては、はなはだ初心者レベルで大したことしてませんが、内容及び実行については、お約束の“at your own risk”ということで。少しずつでもよくなっていけたらいいなと思ってはいるのですが...

Vista 以降では確認してません 確認中です...。Windows 2000 でも一応は確認してますが自信ないです...。

これって何

Windows XP のコマンドラインで使えるツールのめも。定型処理はバッチファイルで。

インストール不要なので、USBメモリなどで持ち運びもおk。

他のPCでも環境を簡単に作れる、バッチファイル作成。ダウンロードなども自動。ってか、USBメモリにコピーしてあればイランけど...

...ってか、Linux では標準でできることばっかりだったりだなぁ...

...あっと、Windows の場合はコマンドの方が楽なんてことはほとんどないと思います。この目的はあくまでバッチファイルでの定型処理、及びプチUnix環境ってとこです。

基本ツールのリンク

どれもインストール不要で必要ファイルをコピーしただけで使えるもの。また、コマンドライン、バッチファイルでの実行ももちろん可能なツール類。

UnZip

zip の展開。 unzip.exeはUnxUtilsにも入ってるのに、なぜかというと...こっちは元々Win32版だし、配布ファイルが自己解凍式だから。(※ 後述の wget.exeで自動ダウンロード&自動展開に使うため)

※ってか、Windowsは標準コマンドでzip解凍できないのはなんだかなぁ。

W32TeX

tar.exe, gzip.exe, bzip2.exeなど。tar コマンドでjオプションも使えます。(※UnxUtilsのはjオプションだめだった)

UnRAR for Windows

RARファイルの解凍。

UnxUtils なんかにも入ってますが、新しいほうが安全かなと。(※でもコマンドラインから解凍するのにはunrar.exeを使うのでUnxUtilsを先に入れとくというウロボロス...)

CDRtoolsバイナリ

【注意】2012.3.20 現在、サイトはありますがファイルがリンク切れになってます。

Windows 7 / Vista 未確認

mkisofs.exe, cygwin1.dll

isoイメージの作成。BootableCDWizard BCDW マルチブートCDやISOLINUXのisoイメージ作成。

下記は 未確認ですがまぁまぁ新しい Windows 版

下記に古いですが Windows 版オリジナルがあります。

dd for windows - chrysocome.net

※ Windows 7 / Vista では一部の機能は「管理者として実行」する必要があります。

dd.exe。Windows用 dd コマンド。制限あるけどイメージの作成やFD書き込みに便利。

注意点
  • 制限あり
Native Win32 ports of some GNU utilities (UnxUtils)

Unixコマンドがいっぱい。 sed , split , unzip , unrar , diff , grep など

注意点
  • Windowsの内部コマンドと一部重複(echo,mkdir,type などWin優先)
  • PATHの設定に注意
  • find,sort など重複する
  • 日本語ファイル名など制限あり
vfd (Virtual Floppy Drive)

vfd21-080206.zip

※ Windows 7 / Vista では「管理者として実行」しませう。(※ エクスプローラーではドライブ文字が出ませんが... ドライブ文字設定で「固定・グローバル」にチェックしないとドライブ文字は出ません)。64-bit 非対応

仮想FDドライブ。GUIもあり。実FDと違ってメチャ早いのでかなり便利。

注意点
  • VMware Player など仮想マシンと同時使用すると危険かも?...Windowsがフリーズしました。
  • もしかすると、Daemon Tools とかも同時使用すると危険なのかもしれないような関係ないような
GRUB for DOS

ブートローダGNU GRUBの多機能版。これの起動ディスクは必需品?

grubinst

Windows 7 / Vista 未確認

Windows上でGRUBをインストール。GUI版もあり。

The SYSLINUX Project - Syslinux Wiki

※ Windows 7 / Vista では「管理者として実行」しませう。

USBメモリにブートローダをインストール。ISOLINUX CDにメニューを入れたり。

Universal Extractor | LegRoom.net

多種の書庫に対応した展開専用ツール。これの UniExtract Binary Archive はインストール不要、GUIもあり。というか小さなパッケージを集めてGUIを付けたようなかんじかな。

ISOイメージやFDイメージの展開も可能なんで便利。

注意点
  • 対象ファイルのパスに日本語が含まれてるとだめみたい
安全面について

UnxUtilsに含まれるunzip,unrarやUniExtractに含まれるunrarなどバージョンがやや古い。

コマンドだから安全ということはないし、GUI最新版でも同様、信用できないファイルなど展開しないように注意しておくのが吉。圧縮・解凍ソフトの脆弱性はしょっちゅう見つかってるので...

サポート ツール

インストールが必要ですが(※コマンドの展開のみも一応できますけど...)、便利なコマンドがいっぱい。

Windows XP Service Pack 2
Windows 2000 SP4 サポート ツール

2000標準では入っていない、 reg.exetlist.exe (tasklist), kill.exe (taskkill)なども...

リソースキット・ツール

2003用ですが、XPでも一応使えてます。 robocopy は同期ができるのでバックアップにはxcopyなんかよりかなり便利。

wget.exe で環境準備

2021.1.18 追記

もう古いので動かないかもしれません。いずれは削除しますので... アシカラズ。

【ちょっと変更中...】

使ってる人いないと思いますが、)ディレクトリ名を変更してるので以前のやつは動かないかも。PATHの設定が違ってくるので。

※バッチファイルは Windows XP 用なのでご注意。Vista以降では確認していません。

wget

最新のSTABLE Binaries, Dependenciesをダウンロードして、wget用ディレクトリを作成、下記ファイルを展開する。

\---wget
        libeay32.dll
        libiconv2.dll
        libintl3.dll
        libssl32.dll
        wget.exe

作業用ディレクトリに wget を準備すれば、自動ダウンロードするバッチファイルを作成。

2012.3.20 更新

ツール類のURLを更新。

適当なディレクトリ:.
|   00_Tool_download.bat
|   00_Command_only.bat
|   toollist.txt
|   url_list.txt
|       
+---backup
|       
+---download_files
|       
\---wget
        libeay32.dll
        libiconv2.dll
        libintl3.dll
        libssl32.dll
        wget.exe
ダウンロード容量
ダウンロード展開後
* UnZip *404 KB584 KB
* W32TeX *842 KB1.29 MB
* UnRAR *192 KB199 KB
* Virtual Floppy Drive *140 KB403 KB
* cdrtools *2.60 MB5.75 MB
* dd for Windows *187 KB356KB
* SYSLINUX 4.05 *7.32 MB18.9 MB
* GRUB for DOS(0.4.4) *800 KB1.57 MB
* grubinst *68 KB177 KB
* UnxUtils *3.20 MB6.17 MB
* UniExtract Binary Archive *4.94 MB10.7 MB
* Wget for Windows *2.18 MB2.83 MB
23 MB49 MB

SYSLINUXUniExtract が容量デカイ。不要なら外した方がいいかも。 toollist.txt 内にないものはダウンロードしません。

再実行時について、toollist.txtとディレクトリを照らし合わせ。展開済(\リストのディレクトリ名があっるかどうか)のものはダウンロード・再展開はしない。

ディレクトリ名はバージョン名なしに変更。更新ややこしいし。

適当なディレクトリ:.
 |   
 |   00_Tool_download.bat
 |   Command_only.bat
 |   toollist.txt
 |   url_list.txt
 |   hogehoge.bat
 |   hagehage.bat
 |   kumakuma.bat
 |   
 +---backup
 |   
 +---cdrtools
 |
 +---dd
 |
 +---download_files
 |
 +---syslinux
 |
 +---texinst
 |
 +---uniextract
 |
 +---unrarw32
 |
 +---UnxUtils
 |
 +---unz552xN unzipxN
 |
 +---vfd
 |
 \---wget
別の wget

※こっちは以前に使ってたやつ。ちょっと古いかな?

  • Heiko Herold's windows wget spot
    1. THIS ONE: 1.10.2 complete をクリック
    2. wget-1.10.2b.zip
    3. [wgetフォルダ]を作成して、解凍したファイルをコピー
    4. 00_Tool_download.bat, toollist.txt , url_list.txt を[wgetフォルダ]の一つ上のディレクトリにコピー、実行するとツール類のダウンロードが始まり、勝手に展開します

自作バッチ

2021.1.18 追記

もう古いので動かないかもしれません。いずれは削除しますので... アシカラズ。

一応下記に置いてあります。

【すみませんすみません。。】

現在、URLの変更やバージョンアップ(ファイル名変更)などでダウンロードできないものがあると思われます。後日修正致します。今やってるのですが一つ直すと次から次へなので、すみません

【2009.0707追記】だいたい修正しました。(筈ですが。。。)

「下手なやつが作ると、もう~」ですね。(滝汗)

※バッチファイルは Windows XP 用なのでご注意。Vista以降では確認していません。

上記の wget.exe 用に作った 作業ディレクトリに置いて実行すればいいはずです...

vfd.exe (Virtual Floppy Drive) 使用時の注意点

VMware Player を起動するとWindowsがフリーズしてしまうことがありました。よって、 vfd.exe 使用時は他の仮想マシンなどを起動しないように注意。また、念の為、Daemon Tools などの仮想ドライブソフトも停止させた方が安全かもしれません。

バッチファイルでは、 vfd.exe 使用後はエラーのあるなしに関わらずアンインストール処理をしていますが、使用後はWindowsを再起動しておいた方がいいかもしれません。

※仮想ドライブのドライブ文字は、(V,W,X,Y,Z) から使用中でないものを一時割当します。その際に reg.exe でレジストリを見るのでWindows 2000 ではサポート・ツールが必要です。

FreeDOS スペシャル(謎)起動ディスク作成

後述...長いので(笑)。

FDイメージ関連

FDイメージをファイルに展開

※ Windows 7 / Vista 確認(※ 64-bit はだめ)。

  • 必要コマンド - .\vfd\vfd.exe

※reg.exe でレジストリを見るので、Windows 2000 ではサポート・ツールが必要。

UniExtractでもできるし、他にもGUIツールはあるけど、ファイル名を確実に小文字で(大文字と区別して)出せるのはvfd.exeだけのような(Super ウルトラISOでは8.3形式)。バックグラウンドで一時マウントして展開。

FDからイメージファイル作成

※ Windows 7 32/64-bit 確認(※ Vista 未確認)。

  • 必要コマンド - dd.exe

ぶっちゃけ RawWrite for Windows の方が簡単かと。これは dd.exe で。

FDイメージをFDへ書き込み

※ Windows 7 32/64-bit 確認(※ Vista 未確認)。

  • 必要コマンド - dd.exe

これも dd.exe で。

GRUB 起動ディスク

0.4.3 のイメージは配布されてないし...

GRUB(for DOS)起動ディスク作成

※ Windows 7 32/64-bit 確認(※ Vista 未確認)。

  • 必要コマンド - grubinst.exe
  • 必要ファイル - grldr
  • 必要ファイル - menu.lst

直接FDへ書き込み

GRUB(for DOS)起動ディスクイメージ作成

※ Windows 7 32-bit 確認(※ Vista 未確認、64-bit はだめ)。

  • 必要コマンド - grubinst.exe
  • 必要コマンド - .\vfd\vfd.exe
  • 必要コマンド - dd.exe
  • 必要ファイル - grldr
  • 必要ファイル - menu.lst

※reg.exe でレジストリを見るので、Windows 2000 ではサポート・ツールが必要。

dd.exe で空イメージ作って、vfd.exeをバックグランドで一時起動、マウントしてコピー。すべてイメージファイルへの操作。

MD5チェックサム

右クリックの「送る」でごにょごにゅ

MD5チェックサムの計算と照合

23種類作ってます...

※チェックしたファイル名の付け方がいまいちだなぁ。なんかいい方法ないかな?

指定ディレクトリのファイル

Windows 7 / Vista 未確認

  • 必要コマンド - md5sum.exe
  • 必要コマンド - diff.exe

(※サブディレクトリ除く

指定ディレクトリのファイルのみ計算。md5sum ディレクトリを作成して md5.txt 保存。

照合は、指定ディレクトリのファイルのみ計算して .\md5sum.\md5_check.txt 作成。diff コマンドで .\md5sum\md5.txt と比較して .\md5sum\diff.txt 作成。

※既存のチェックファイルもリネームして削除されないようにする。

ディレクトリツリーを計算

Windows 7 / Vista 未確認

  • 必要コマンド - md5sum.exe
  • 必要コマンド - diff.exe

サブディレクトリも含めて計算。実行元ディレクトリに md5sum.txt 作成。

照合は、現在の md5sum_check%now%.txt 作成。チェック済みファイルを指定して diff コマンドで照合。

※既存のチェックファイルもリネームして削除されないようにする。

単一ファイルのチェック

Windows 7 / Vista 未確認

  • 必要コマンド - md5sum.exe

MD5(記録)ファイルの値と実際値を照合します。MD5ファイルは同一ディレクトリに置きます。ダウンロードしたISOイメージの確認とかに。

  • MD5ファイルの書式
1b8de822b8296471383feeaac1a64056  knoppix_v5.3.1CD_20080326-20080520.iso
SHA1でチェック

Windows 7 / Vista 未確認

openssl.exe が必要

  1. Downloads
  2. openssl.zip をダウンロード
  3. openssl ディレクトリを作業用ディレクトリにコピー
  • SHA1ファイルの書式
4dccee9f0059434ef77dc2835dc9df10925a1cee  knoppix_v6.0.1CD_20090208-20090225_opt.iso

ddコマンドでMBR・ブートセクタのバックアップ

※ 2012.3.20 更新。Windows 7 / Vista 確認。64-bit もOK。

  • 必要コマンド - dd.exe (dd for Windows)
  • 必要コマンド - dd.exe (UnxUtils)
  • 必要コマンド - fsutil.exe(XP以降)

dd for Windows は使用中パーティションのブートセクタ取得がだめみたいなので、UnxUtilsのやつで。fsutil.exe はドライブ文字の確認のため。

HD/USBメモリのMBR及びPBR(EPBR除く)を保存します。

  • MBR - 1セクタ
  • MBR - 65セクタ(※ 第1パーティションの第2セクタまで)
  • MBR - 2050セクタ(※ Vista以降向け - 第1パーティションの第2セクタまで)
  • PBR - 1セクタ
  • PBR - 16セクタ(※ NTFS用)

4KiBセクタの場合は

  • MBR - 1セクタ
  • MBR - 257セクタ(※ Vista以降向け - 第1パーティションの第1セクタまで)
  • PBR - 1セクタ
  • PBR - 10セクタ

※ 空のマルチカードリーダーなどがあるとエラーメッセージが出ることがあります。とりあえずキャンセルすれば実行はできます。

ISOイメージの展開

※ Windows 7 32/64-bit 確認(※ Vista 未確認)。

FDイメージの展開も可能ですが、DOSフォーマット (FAT) FDイメージでは、半角英数8文字以内のファイル名(※ 8.3形式等)は、すべて大文字となってしまうので注意。

  • 必要コマンド - .\uniextract\UniExtract.exe

作ってみたけど、GUIでやるのと同じなのであんまり意味なし。

GUIなら、7-zipやSuper ウルトラISOが内容の確認もできて便利ですけど、UniExtractはコマンドラインおkなのでバッチファイルに組み込めるということで。

  • 対象ファイルのパスに日本語が含まれてるとだめみたいだ...

CDからISOイメージ作成

※ Windows 7 / Vista 確認。64-bit もOK。

  • 必要コマンド - dd.exe

まぁこの辺もGUIで簡単にできますけど、ddコマンドは結構早いような気もします。

※reg.exe でレジストリを見るので、Windows 2000 ではサポート・ツールが必要。

ddでいいのかなと確認してみた。mkisofs.exeでiso作成CD焼きCDからiso作成で、MD5は一致したので大丈夫みたい。

SYSLINUX のインストール

※ Windows 7 / Vista 確認。64-bit もOK。

  • 必要コマンド - syslinux.exe

USBメモリのブートローダに

※reg.exe でレジストリを見るので、Windows 2000 ではサポート・ツールが必要。

レジストリでリムーバブル メディアのドライブ文字を検索、ドライブを選択してインストール。

下記は、syslinux.exe と バッチをUSBメモリのルートなどに置いて実行するだけ。USBメモリ自身にインストール。

FreeDOS スペシャル(謎)起動ディスク作成

この起動ディスクの詳細は下記ページにて...

上記ページ起動ディスクの、ダウンロードからFD書き込みまで自動の簡単作成バッチ作ってみた。

  1. 必要ファイルの自動ダウンロード
  2. 起動ディスク・イメージファイル作成
  3. イメージファイルをFDへ書き込み
  4. LiveCDのカーネルを分割して、FDへ連続コピー
  • GRUB for DOS
  • ネットワークブート用起動ディスクとして
  • BG-Recue Linux ブートディスクとして(+2枚FDが必要)
  • Memtest86+

さらに、GRUBで作りこみすると、PLoP Boot Manager なども 1枚のFDへ組み込み可能(※1枚のFD内に複数のFDイメージを組み込み可能ってこと)。

作成バッチファイル

Windows 7 / Vista 未確認64-bit だめ

  • 下記分が必要
    • UnZip (unzip.exe)
    • W32TeX (tar.exe,bzip2.exe)
    • Virtual Floppy Drive (vfd.exe)
    • dd for Windows (dd.exe)
    • GRUB for DOS (grub.exe)

上記のwget.exeで準備してあれば、順番に実行するだけで作成できるはずですが...

コマンド・オプション

help表示は、/? , -h , --help , -help

wget.exe

wget -nc -P "%down_dir%" --passive-ftp URL
  • -i "%listfile%" - URLファイルを指定
  • -P - 保存ディレクトリ指定
  • -nc - 既存ファイルはダウンロードしない
  • --passive-ftp - パッシブFTP
  • -o log.txt - ログ上書
  • -a log.txt - ログ追記
参考リンク

unzip.exe

内容表示
unzip -l "grub_for_dos-0.4.1.zip"
展開先指定
unzip.exe "zipfile" -d "%down_dir%"
特定のファイルのみ展開

ファイル名を先に指定

unzip.exe "zipfile" "grub_for_dos-0.4.1/grub.exe" -d "%down_dir%"

ディレクトリがある場合はディレクトリも作られる

zip.exe
zip -j filename.zip "file1" "file2"

ファイルへのパスを指定している場合はディレクトリも含めて作成されるので、ファイルのみアーカイブするには -j オプション。

tar.exe

内容表示

t 指定(j はbzip、z はgzip)

tar.exe jtf "bzipfile"

ディレクトリも作成される

展開先を指定

展開は x 指定。-C でディレクトリ指定

tar.exe jxvf "bzipfile" -C "%down_dir%"
特定のファイルのみ展開

ファイル名を後に指定

tar jxvf %down_dir%\fc5fd.tar.bz2 -C %down_dir% "FC5-FloppyInstall-1.img"
tar.exe jxvf "bzipfile" -C "%down_dir%" "pxe-on-a-disk/pxe-on-a-disk.floppy"

ディレクトリも作成される

gzip.exe(gunzip.exe)

ファイルのあるディレクトリに展開(圧縮)

c で標準出力、 d で解凍、リダイレクトでファイル作成。( l で内容表示)

gzip -dc "%down_dir%\floppy.img.gz" > "%down_dir%\floppy.img"

標準出力してリダイレクトしないと元のファイルはなくなる。

bzip2.exe(bunzip2.exe)

d で解凍、k は元ファイルを消さない

ファイルのあるディレクトリに展開(圧縮)

bzip2.exe -dk "bzipfile"

作成場所を指定するには c で標準出力してリダイレクトを使う

UnRAR.exe

x でカレントディレクトリに書庫内そのまま展開。e だとフォルダ無視してカレントディレクトリにファイルのみ展開。( t で内容表示)

unrar.exe x "%down_dir%\rarfile.rar"

元ファイルは残る。

  • 展開先指定
unrar.exe x "%down_dir%\rarfile.rar" "path"
  • 特定のファイルのみ
unrar.exe x "%down_dir%\rarfile.rar" "path\filename" "path"

Windows コマンド

コマンド ライン リファレンス

リダイレクト演算子
出力の非表示(nul デバイス)
  • 標準出力をnulへ - >nul
  • 標準エラー出力をnulへ - 2>nul
  • 両方nulへ - >nul 2>nul, >nul 2>&1
ファイルへ出力
  • 標準出力をファイルへ追記 - >>"%logfile%"
>>"%logfile%" (COMMAND1)
  • 標準エラー出力をファイルへ追記 - 2>>"%logfile%"
2>>"%logfile%" (COMMAND1)
  • 両方をファイルへ追記 - >>"%logfile%"
>>"%logfile%" (COMMAND1 2>&1)

if 構文

ERRORLEVEL
  • if ERRORLEVEL 1 - ERRORLEVEL が1以上なら
  • if not "%ERRORLEVEL%"=="0" - %ERRORLEVEL% が0以外なら

同じ意味のようであるが、下記の場合など違ってくる

環境変数 %ERRORLEVEL% は(行の)コマンド実行前のものであるため、Command1のエラーがわからない

Command1 & if "%ERRORLEVEL%"=="0" Command2

Command1のエラーがわかる

Command1 & if ERRORLEVEL 1 Command2
  • エラーなしの場合...
    • if not ERRORLEVEL 1 - ERRORLEVEL が0なら(1以上でない)
    • if "%ERRORLEVEL%"=="0" - %ERRORLEVEL% が0なら
defined
if defined hoge echo hage

下記と同義になりますが、ERRORLEVEL 同様で構文内でも遅延展開。後者では構文内では問題出るかも。。

if not "%hoge%"=="" echo hage
分岐処理
  • ファイルの存在を確認
if exist "%filename%" (
echo ありますた!
) else (
echo ないですYO!
)
  • エラー処理
if ERRORLEVEL 1 (
echo エラー出ますた!orz
) else (
echo 正常終了しますたYO!
)

Path

Path コマンド

システム環境変数PATHの表示

C:\>path
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\system32\Wbem;C:\Program Files\Windows Resource Kits\Tools\;C:\Perl\bin\;C:\Program Files\Common Files\Roxio Shared\DLLShared;C:\Program Files\Support Tools\;C:\Program Files\Windows Imaging\

リストの先頭に近いものが優先

set path=C:\hoge;%path%

下記と同義

path=C:\hoge;%path%
  • コマンドをフルパスで表示
C:\>for /f "delims=" %I in ("robocopy.exe") do echo %~$PATH:I

C:\Program Files\Windows Resource Kits\Tools\robocopy.exe

遅延環境変数

iffor など構文内で環境変数を使う場合の注意点。既定では「遅延環境変数の展開」が無効(「即時展開」が有効)なので環境変数の値はコマンド実行時(実行前)のものが展開される。構文内でsetしても反映されない。

if ERRORLVEL の場合は関数なので for 文内でも有効、if defined も問題ないですね。もしくは、&&|| を使う手もあるかな。

@echo off
set hoge=Heloo
if defined hoge set hoge=Good-bye & echo %hoge%
echo %hoge%
echo.

setlocal enabledelayedexpansion
set hoge=Heloo
if defined hoge set hoge=Good-bye & echo !hoge!
echo %hoge%
endlocal
echo.
pause

結果は...

Heloo
Good-bye

Good-bye
Good-bye

【注意】endlocal を打ってしまうとと setlocal 内で設定が無効になる。バッチ終了まで有効にするには endlocal は打たない。

条件付き処理記号 && だと...

C:\>set aaa=bbb
C:\>set aaa=ccc & echo %aaa%
bbb

C:\>set aaa=ccc && echo %aaa%
ccc

サブルーチンでも問題ないみたい。

for %%x ウンタラ~ (
set hoge=%%x && call :NANTOKA
)

特殊文字の扱い

特殊文字のクォート

文字として出力させる

@echo off
echo ^^
echo ^<
echo ^>
echo ^|
echo ^<
echo <
pause
^ 
<
>
|
<
ECHO は <OFF> です。
バッチファイ内での %

単独の%は無視(削除)される

@echo off
echo %
echo %%
echo %%%
echo %%%%
echo %%%%%
echo %%%%%%
echo %%%%%%%
echo %%%%%%%%
echo %%%%%%%%%
echo %%%%%%%%%%
pause
ECHO は <OFF> です。
%
%
%%
%%
%%%
%%%
%%%%
%%%%
%%%%%

環境変数を入れ子にすると...

@echo off
set aaa=bbb
set bbb=ccc
echo %aaa%
echo %%aaa%%
echo %%%aaa%%%
echo %%%%aaa%%%%
echo %%%%%aaa%%%%%
echo %%%%%%aaa%%%%%%
pause
bbb
%aaa%
%bbb%
%%aaa%%
%%bbb%%
%%%aaa%%%

遅延環境変数の展開を有効にすると...

@echo off
set aaa=bbb
set bbb=ccc
setlocal enabledelayedexpansion

echo %aaa%
echo !%aaa%!
pause
bbb
ccc

サブルーチン

set

  • 値にスペースや特殊文字は引用符で囲んでみる
set "filename=aaa bbb.txt"
  • set 変数の一部 で変数の列挙が可能
C:\>set file
file1=aaa.txt
file2=bbb.txt
file3=ccc.txt

pushd / popd

cd(cd /d) コマンドよりかなり便利です。

findstr.exe

ユニコードのファイルは検索できない?

みたいです。findコマンドを使うか、typeコマンドでShift_JISファイルに変換コピーするとか。

type Unicode.txt>Shift_JIS.txt

xcopy.exe

  • C:\hoge ディレクトリを D:\hoge としてコピーしたい場合は /i オプション(及びサブディレクトリ指定の /s/e)を付ける
xcopy C:\hoge D:\hobe /i/s/e/h/r/k/y

xcopy C:\hoge D:\ などとすると、C:\hogeの内容はD:\直下にコピーされてしまうので注意。

regedit.exe

  • レジストリエディタからエクスポート(または書き出し)した場合はユニコード(UTF-16)
  • エクスポート - ASCII で(※ファイルはShift_JISで保存される)
regedit /e /a "dhcp_temp.txt" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp"
  • エクスポート - ユニコード (UTF-16)
regedit /e "dhcp_temp.txt" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp"
  • 適用(※ユニコード + 【REG_EXPAND_SZ】を使う場合は 'REGEDIT4'ではだめらしい?)
> set_temp.reg echo Windows Registry Editor Version 5.00

>>set_temp.reg echo.
>>set_temp.reg echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp]
>>set_temp.reg echo "Start"=dword:00000002

regedit /s set_temp.reg
ユニコードについての注意

値エントリの種類が【REG_EXPAND_SZ】の場合にASCIIでエクスポートすると、ユニコードの1バイト目が切り取られてしまうようです。よって、日本語などASCII文字以外を含む【REG_EXPAND_SZ】値を復元する際には注意。つまり、ASCIIでエクスポートしたレジストリファイルでは、日本語【REG_EXPAND_SZ】値は正常に復元できません。(※文字列値【REG_SZ】では問題ないと思います)

regedit.exe の無効化

マルウェア感染時などregedit.exeが起動できないことがよくあります。(※或いは管理者によって使用禁止に設定されている場合も)

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableRegistryTools"=dword:00000001

DisableRegistryTools値が 1 ならサイレント モード(※コマンドラインから regedit /s)での実行は可能ですが、値が2 だとすべて実行不可になりました。

値が2 の場合は、修正は下記の方法になるかな...

  • infファイル作成して、 Rundll32.exe を実行(※使えれば)
  • vbsファイルを実行
  • reg.exe の実行(※使えれば)

設定変更などができない場合は、アクセス許可(※拒否設定は優先される)及び所有者などの確認が必要になります。アクセス許可の変更は、 Regini.exe (XP)や Regperm.exe で可能。

regedit.exe を実行するとメモ帳が起動する

或いは何も起動しない場合などは...下記のような不正なレジストリが設定されているかもしれません。

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.exe]
"Debugger"="notepad.exe"

キーの削除、または Debugger エントリの削除が必要。

削除するにはいずれかの方法でできるかな...

  • regedit.exe をリネーム・コピーして実行
  • infファイル作成して、 Rundll32.exe を実行(※使えれば)
  • vbsファイルを実行
  • reg.exe の実行(※使えれば)

上記の例と同じく、レジストリキーのアクセス許可の確認も必要になるかも。

reg.exe

Windows 2000 で reg.exe を使うにはサポートツールのインストールが必要

標準出力可能。長い REG_BINARY 値もカンマ・改行区切りなしの1行で出力regedit ではカンマ・改行区切りなので長い値を検索できないことがある)。

reg query HKLM\SYSTEM\MountedDevices
  • regeditファイル形式でエクスポート
reg export "HKLM\SYSTEM\MountedDevices" "MountedDevices.reg.txt"
  • regedit形式ファイルをインポート
reg import "MountedDevices.reg"
  • 値エントリの修正
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableRegistryTools /t REG_DWORD /d "0x00000000" /f
  • 値エントリの削除
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v DisableRegistryTools /f
データ取り出し
  • サブキー列挙
C:\>reg query HKU | findstr HKEY_USERS\
HKEY_USERS\.DEFAULT
HKEY_USERS\S-1-5-19
HKEY_USERS\S-1-5-19_Classes
HKEY_USERS\S-1-5-20
HKEY_USERS\S-1-5-20_Classes
HKEY_USERS\S-1-5-21-1960408961-507921405-1343024091-1014
HKEY_USERS\S-1-5-21-1960408961-507921405-1343024091-1014_Classes
HKEY_USERS\S-1-5-18
  • 値のデータの取り出し
C:\>set key=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
C:\>set value=cache
C:\>for /f "usebackq tokens=3,*" %H in (`reg query "%key%" /v %value% ^| findstr "%value% REG_"`) do @echo %H %I
%USERPROFILE%\Local Settings\Temporary Internet Files
for 実行時のトークンについて

出力が Windows XP では Tab 区切り、7 ではスペース区切りとなってますね。デリミタ無指定だとトークン文字は Tab とスペースとなるので両方イケそうに思われますが...

XPなら Tab 指定でおkですが、7 では値エントリ名にスペースがあるとトークンの番号がズレちゃいますよねー。どうしたらいいんでしょうか。わかりませぬ... orz

regini.exe (XP)

※Windows 2000 ではリソース キットが必要?

レジストリキーのアクセス許可設定変更。

マルウェア感染時など、不正レジストリキーの削除時などに必要になるかも。

  • 注意点
    • サブキーにアクセス許可がない、または、削除拒否設定がある場合は親キーは削除できない
    • Everyoneに削除拒否設定される場合があるので、確実に置換する
    • ユーザに読み取り許可がない場合は設定はロードされない(つまりレジストリの設定内容は無視)
書式
  • 基本
regini <スクリプトファイル>
  • スクリプトファイル
\registry\machine\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.exe [1 17]
\registry\machine\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.com [1 17]

※System と Administrators にフルコントロール設定。それ以外は削除。(※Everyone:削除拒否の 置換(消去)もこれで可能)

  • 1 - Administrators フル アクセス
  • 2 - Administrators 読み取りアクセス
  • 3 - Administrators 読み取りおよび書き込みアクセス
  • 4 - Administrators 読み取り、書き込み、および削除アクセス
  • 17 - System フル アクセス
  • 18 - System 読み取りおよび書き込みアクセス
Regperm
regperm /K "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.exe" /A:System:F /A:Administrators:F /A:USERS:R /R

※Everyone:削除拒否の 置換(消去)もこれで可能。但し、/R でサブキーへの適用も可能みたいですが、サブキーにEveryone拒否設定のみあるとかだとややこしいかも?

アクセス許可があれば、INFファイルの使用、または、 regedit2 /s DelBadKey.reg(※念の為に regedit.exe をリネーム・コピーしてコマンドラインから実行する)とかすれば削除可能になるはず...かな?

雑記
  • Image File Execution Options に不正キーが作成されると regedit が実行できなくなる場合があるけど、登録名以外のものにリネーム・コピーすれば実行可能になるかも
  • Policies キーの DisableRegistryTools エントリを有効化されると、リネームしてもGUIのレジストリ エディタは起動できないけど、値が 1 ならコマンドラインから regedit /s regファイル の実行は可能(値が 2 だとコマンドラインもだめ)
  • Rundll32.exe が不正(或いは不正設定)な場合、INFファイルの使用はだめかも
  • DisableRegistryTools エントリの無効化は HijackThis 使うほうがいいかも...ってか、 マルウェア感染が原因ならこれだけ治してもだめでSilent Runnersとかで調べないとって話になりますけれども...。

INFファイルでレジストリ設定 (Rundll32)

infファイルを右クリック【インストール】、または、コマンドラインから Rundll32.exe 実行。

infファイルで Image File Execution Options の不正なキーを削除する例
[Version]
Signature="$Chicago$"

[DefaultInstall]
DelReg=DelImageEx

[DelImageEx]
HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.exe"
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\DelImageEx.inf

ファイル名にパスの指定が必須みたい。

※バージョンはホントは $Windows NT$ にすべきなのかな?

不正な値エントリを削除する例

上記では、サブキーに削除許可がないと削除できないので、値エントリだけ削除する。

[Version]
Signature="$Chicago$"

[DefaultInstall]
DelReg=DelImageEx

[DelImageEx]
HKLM, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\regedit.exe",Debugger
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\DelImageEx.inf
レジストリ エディタの有効化

正確には起動禁止設定の無効化

[Version]
Signature="$Chicago$"

[DefaultInstall]
AddReg=UnhookRegKey

[UnhookRegKey]
HKCU, Software\Microsoft\Windows\CurrentVersion\Policies\System,DisableRegistryTools,0x00000020,0
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\EnabeleRegedit.inf
[Version]
Signature="$Chicago$"
Provider=Symantec

[DefaultInstall]
AddReg=UnhookRegKey

[UnhookRegKey]
HKLM, Software\CLASSES\batfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\comfile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\exefile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\piffile\shell\open\command,,,"""%1"" %*"
HKLM, Software\CLASSES\regfile\shell\open\command,,,"regedit.exe ""%1"""
HKLM, Software\CLASSES\scrfile\shell\open\command,,,"""%1"" %*"
HKCU, Software\Microsoft\Windows\CurrentVersion\Policies\System,DisableRegistryTools,0x00000020,0
  • 0x00000 - REG_SZ(文字列)
  • 0x10001 - REG_DWORD(整数値)
  • 0x20000 - REG_EXPAND_SZ(環境変数を含む文字列)
  • 0x10000 - REG_MULTI_SZ(複数文字列)
  • 0x00001 - REG_BINARY(バイナリ)
  • 0x20001 - REG_NONE(上書しない)

※該当キーにアクセス許可がない、または拒否設定されている場合は使えないので注意。

ipconfig.exe

ERRORLEVEL を返さないのでメッセージから判断する?

ipconfig
  • Windows XP
Windows IP Configuration

Ethernet adapter ローカル エリア接続:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 192.168.0.2
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.0.1

Ethernet adapter ローカル エリア接続 2:

        Media State . . . . . . . . . . . : Media disconnected

Ethernet adapter ワイヤレス ネットワーク接続:

        Media State . . . . . . . . . . . : Media disconnected
  • Windows 7
Windows IP 構成


イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . : 
   リンクローカル IPv6 アドレス. . . . : fe80::5037:xxxx:xxxx:xxxx%11
   IPv4 アドレス . . . . . . . . . . : 192.168.0.7
   サブネット マスク . . . . . . . . : 255.255.255.0
   デフォルト ゲートウェイ . . . . . : 192.168.0.1

Tunnel adapter isatap.{CC568812-F1C2-xxxx-xxxx-xxxxxxxxxxxx}:

   メディアの状態. . . . . . . . . . : メディアは接続されていません
   接続固有の DNS サフィックス . . . : 

Tunnel adapter ローカル エリア接続*:

   接続固有の DNS サフィックス . . . : 
   IPv6 アドレス . . . . . . . . . . . : 2001:0:xxxx:xxxx:xxxx:xxx:xxxx:fff8
   リンクローカル IPv6 アドレス. . . . : fe80::xxxx:xxx:xxxx:fff8%13
   デフォルト ゲートウェイ . . . . . : ::
  • Windows 2000(※ローカル エリア接続 4 は無線LAN)
Ethernet adapter ローカル エリア接続 4:

        Media State . . . . . . . . . . . : Cable Disconnected

Ethernet adapter ローカル エリア接続:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 192.168.0.4
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.0.1

Ethernet adapter ローカル エリア接続 3:

        Media State . . . . . . . . . . . : Cable Disconnected
ipconfig /release
ipconfig /release "接続名" 成功
  • ipconfig /release "%iface%"
  • Windows XP
Windows IP Configuration

Ethernet adapter ローカル エリア接続 2:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 0.0.0.0
        Subnet Mask . . . . . . . . . . . : 0.0.0.0
        Default Gateway . . . . . . . . . :

>ipconfig /release "%iface%"

Windows IP Configuration

IP Address for adapter ローカル エリア接続 2 has already been released.
  • Windows 7
Windows IP 構成


イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . :
   リンクローカル IPv6 アドレス. . . . : fe80::xxxx:xxxx:xxxx:xxxx%11
   デフォルト ゲートウェイ . . . . . :

Tunnel adapter isatap.HOGE-NETWORK:

   メディアの状態. . . . . . . . . . : メディアは接続されていません
   接続固有の DNS サフィックス . . . :

Tunnel adapter ローカル エリア接続*:

   接続固有の DNS サフィックス . . . :
   IPv6 アドレス . . . . . . . . . . . : 2001:0:xxxx:xxxx:xxxx:xxx:xxxx:ff36
   リンクローカル IPv6 アドレス. . . . : fe80::xxxx:xxx:xxxx:xxxx%13
   デフォルト ゲートウェイ . . . . . : ::
  • Windows 2000
Windows 2000 IP Configuration

IP address successfully released for adapter "ローカル エリア接続 2"

>ipconfig /release "%iface%"

Windows 2000 IP Configuration

IP Address for adapter ローカル エリア接続 2 is already released
ipconfig /release "接続名" ケーブル(or 無線)未接続
  • Windows XP
No operation can be performed on ローカル エリア接続 2 while it has its media disconnected
  • Windows 7
メディアが接続されていないと、ローカル エリア接続 に対する処理はいずれも実行でき
ません。
  • Windows 2000
No operation can be performed on adapter ローカル エリア接続 2 as this connection
has its media/cable disconnected.

※よくわかってませんが、下記はWindows 2000でAPIPAによって自動プライベートIPアドレスが振られている場合に出るようです(無線LANのユーティリティを入れてないとか)。

All adapters bound to DHCP do not have DHCP addresses.  The addresses were autom
atically configured and can not be released.

Adapter ローカル エリア接続 2 was automatically configured and does not currentl
y have a DHCP address.  The IP address for this adapter can not be released.
ipconfig /release DHCP有効な接続名なし
  • Windows XP
The operation failed as no adapter is in the state permissible for
this operation.
  • Windows 7
インターフェイス Loopback Pseudo-Interface 1 の解放中にエラーが発生しました: 指
定されたファイルが見つかりません。

この処理に対して許容される状態のアダプターが存在しないため、
処理に失敗しました。
  • Windows 2000
Error: No adapters bound to TCP/IP are enabled for DHCP
ipconfig /release "接続名" 指定接続名DHCP無効
  • Windows XP
Adapter ローカル エリア接続 2 is not enabled for Dhcp.
  • Windows 7
アダプター ローカル エリア接続 が DHCP に対して有効ではありません。
  • Windows 2000
Error: Release
Adapter "ローカル エリア接続 2" is not enabled for DHCP
ipconfig /renew "接続名"
【成功】ipconfig /renew "接続名"
  • Windows XP
Ethernet adapter ローカル エリア接続 2:

        Connection-specific DNS Suffix  . : hoge-network
        IP Address. . . . . . . . . . . . : 192.168.0.219
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.0.1
  • Windows 7
イーサネット アダプター ローカル エリア接続:

   接続固有の DNS サフィックス . . . : HOGE-NETWORK
   リンクローカル IPv6 アドレス. . . . : fe80::xxxx:xxxx:xxxx:xxxx%11
   IPv4 アドレス . . . . . . . . . . : 192.168.0.201
   サブネット マスク . . . . . . . . : 255.255.255.0
   デフォルト ゲートウェイ . . . . . : 192.168.0.1

Tunnel adapter isatap.{CC568812-xxxx-xxxx-xxxx-xxxxxxxxxxxx}:

   メディアの状態. . . . . . . . . . : メディアは接続されていません
   接続固有の DNS サフィックス . . . :

Tunnel adapter ローカル エリア接続*:

   接続固有の DNS サフィックス . . . :
   リンクローカル IPv6 アドレス. . . . : fe80::xxxx:xxx:xxxx:xxxx%13
   デフォルト ゲートウェイ . . . . . : ::
  • Windows 2000
Ethernet adapter ローカル エリア接続 2:

        Connection-specific DNS Suffix  . : hoge-network
        IP Address. . . . . . . . . . . . : 192.168.0.207
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.0.1
ipconfig /renew "接続名" (DHCPサーバの応答なし)
  • Windows XP
An error occurred while renewing interface ローカル エリア接続 2: unable to contact your
DHCP server. Request has timed out.
  • Windows 7
インターフェイス ローカル エリア接続 の更新中にエラーが発生しました: DHCP サーバ
ーに接続できません。要求がタイムアウトしました。
  • Windows 2000
The following error occurred when renewing adapter ローカル エリア接続 2: DHCP Ser
ver unreachable

netsh.exe

  • DHCPクライアント有効
netsh interface ip set address "ローカル エリア接続" dhcp
netsh interface ip set dns  "ローカル エリア接続" dhcp
  • 固定
netsh interface ip set address "ローカル エリア接続" static 192.168.0.2 255.255.255.0 192.168.0.1 1
netsh interface ip set dns "ローカル エリア接続" static 192.168.0.1

netsh interface ip add dns "ローカル エリア接続" 192.168.0.10
  • 設定の保存(書き出し)
netsh -c interface dump > start.nsh
  • 設定の復元(読み込み)
netsh -f start.nsh
  • 設定されているゲートウェイにPing
C:\>netsh diag ping gateway

デフォルト ゲートウェイ
     1. [00000001] VIA Compatable Fast Ethernet Adapter
        DefaultIPGateway = 192.168.0.10 同じサブネット
                Pinging 192.168.0.10 with 32 bytes of data:
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                Ping 統計情報 - 192.168.0.10:
                    パケット: 送信 = 4, 受信 = 4, 損失 = 0 (0% 損失)
                往復にかかったおよその時間 (ミリ秒単位):
                    最小 = 0ms, 最大 = 0ms, 平均 = 0ms
  • 設定されているDNSサーバにPing
C:\>netsh diag ping dns

DNS サーバー
     1. [00000001] VIA Compatable Fast Ethernet Adapter
        DNSServerSearchOrder = 192.168.0.10
                Pinging 192.168.0.10 with 32 bytes of data:
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                192.168.0.10 からの応答:  バイト=32 time<1ms TTL=0
                Ping 統計情報 - 192.168.0.10:
                    パケット: 送信 = 4, 受信 = 4, 損失 = 0 (0% 損失)
                往復にかかったおよその時間 (ミリ秒単位):
                    最小 = 0ms, 最大 = 0ms, 平均 = 0ms

fsutil.exe (XP)

内蔵ドライブ、使用中リムーバブル、使用中ネットワークドライブを検出

D:\CommandLine>fsutil fsinfo drives

ドライブ: A:\ C:\ D:\ E:\ F:\ G:\ H:\ Z:\ 

drivetype を表示

D:\CommandLine>fsutil fsinfo drivetype c:
c: - 固定ドライブ

D:\CommandLine>fsutil fsinfo drivetype g:
g: - CD-ROM ドライブ

F:\CommandLine>fsutil fsinfo drivetype j:
j: - リムーバブル ドライブ

D:\CommandLine>fsutil fsinfo drivetype z:
z: - リモート ドライブまたはネットワーク ドライブ

sc.exe (XP)

for 構文

環境変数をセット・置換

  • set file=boot.img
  • for %I in (%file%) do set foo=%~dpnxI
  • %~dpnxI - C:\CommandLine\boot.img
  • %~I - 引用符 " があれば削除
  • %~fI - 完全パス ( C:\CommandLine\boot.img )
  • %~dI - ドライブ文字のみ ( C: )
  • %~pI - パスのみ ( \CommandLine\ )
  • %~nI - ファイル名のみ ( boot )
  • %~xI - 拡張子のみ ( .img )
  • %~tI - 更新日時 ( 2007/02/26 20:19 )
  • %~zI - ファイルのサイズ ( 1474560 )
  • %~aI - ファイルの属性 ( --a------ )
  • コマンドのパスを表示 - %~$PATH:I
set xxx=regedit.exe
for %I in (%xxx%) do echo %~$PATH:I
C:\WINDOWS\regedit.exe
  • 相対ディレクトリパスを絶対パスに置換
C:\CommandLine\dd-0.5>set dir=..\

C:\CommandLine\dd-0.5>for %I in ("%dir%") do set dir=%~dpI

C:\CommandLine\dd-0.5>set dir=C:\CommandLine\

この場合、末尾の \ に注意しておくこと

環境変数に 空白があり、引用符がある時ない時を考えて

set /p でエクスプローラからドラッグした場合など、引用符がある時ない時両方で使う

set /p target=  [キャンセル は qq ] : 
for /f "usebackq delims=" %%I in ('%target%') do set target=%%~I
if /i "%target%"=="qq" GOTO CANCEL
if "%target%"=="" set target=%cd%
for /f "delims=" %%I in ("%target%") do set target=%%~fI
if not exist "%target%" echo %target% はありません && GOTO CHOICE

2行目は if defined target set target=%target:"=% とかの方がいいのかな?...

/F オプション - ファイルの内容解析

文字列、コマンドの内容などでも。

usebackq
記号なしダブルクォートシングルクォートバッククォート
usebackqなしファイル名文字列コマンドバッククォート記号を含むファイル名
usebackqありファイル名ファイル名文字列コマンド
  • delims - デリミタ(区切り文字)指定。delims= とするとスペースをデリミタにしない
  • tokens - カラム(区切られた文字列の番号)の指定。
  • usebackq

まず、空白を含むファイル名を指定する場合には、これをダブルクォートで囲む必要があるため、かならず“usebackq”を指定しなければならない。なぜなら、ファイル・セットは、空白で区切って複数のファイルを指定するようになっているからである。  基本的には、usebackqを必ず指定することにして、ファイル名は必要に応じてダブルクォート記号で囲み、コマンドならばバッククォート、文字列ならシングルクォート記号で囲むという使い分けが安全だろう。

パスの取得時に引用符を除去

う~ん、3番目が確実かなと思いますがどうなんでしょ?

if defined dirpath set dirpath=%dirpath:"=%
for /f "delims=" %%I in ("%dirpath%") do set dirpath=%%~I
for /f "usebackq delims=" %%I in ('%dirpath%') do set dirpath=%%~I

/L オプション - 開始,増分,終了を指定

for /L %変数 in (開始,増分,終了) do コマンド

(10,10,100) とすれば、10,20,30,...100

ワイルドカード(ファイル・ディレクトリの列挙)

※隠しファイルは列挙されない。

パスを指定しない場合はカレントディレクトリ(以下)が対象

  • ファイル(ディレクトリ除く)
for %x in (*) do コマンド "%x"

%x をコマンドの引数にする場合は、ファイル名にスペースがある場合を考えて引用符を付けておく

  • ディレクトリのみ
for /d %x in (*) do コマンド "%x"
  • 再帰的に(完全パスで)
for /r %x in (*) do コマンド "%x"
隠しファイルもすべて表示するには /f + dir コマンドで
  • ファイル名のみ再帰的に列挙する例
C:\test>for /f "delims=" %x in ('dir /a-d/b/s') do @echo %x
C:\test\aaa.txt
C:\test\dir1\44.txt

自作バッチ その2

2021.1.18 追記

もう古いので動かないかもしれません。いずれは削除しますので... アシカラズ。

※バッチファイルは Windows XP 用なのでご注意。Vista以降では確認していません。

Windows XP/2000 の基本設定の確認とか。Windows XP/2000 標準で使えるはずです...

DHCPクライアントの設定 (Windows XP/2000)
  • 必要コマンド - Windowsの標準コマンドのみ

TCP/IPの設定を「IPアドレスの自動取得」に設定。ってか、これは初期設定で有効な筈ですが、繋がらない時などに、LANアダプタや DHCP Client サービスの設定を再確認してみまひょ、という...

ネットワークドライブの接続・切断 (Windows XP/2000)
  • 必要コマンド - Windowsの標準コマンドのみ

ログオン・ログオフの確認や実行。要するに、net usenet view コマンド...

【簡易】セキュリティチェック (Windows XP/2000)

※ Windows 7 / Vista 確認。

  • 必要コマンド - Windowsの標準コマンドのみ(※reg.exeもあった方が)
  • ※サポート ツールの filever.exe がない場合は、WSH(VBScript)でファイルのバージョンを調べます

順に Autorun.inf、スタートアップフォルダ、アンインストールリストのチェック

レジストリの自動起動関連とアンインストールリストの書き出し。スタートアップ フォルダと autorun.inf のチェック。

【追記】プラグイン関連のバージョンチェックを追加。でも、旧バージョンのチェックが甘いかも...

「送る」でディレクトリ・ファイル名などの操作
HDチェック

C: ドライブのチェックディスク

HD全ドライブのチェックディスク、ログ表示

HD全ドライブのデフラグ状態チェック、ログ表示

隠しファイル・拡張子表示設定切替。

regedit.exe は使わず inf ファイル (rundll32.exe) で設定変更。

Autorun.inf の無効化をレジストリに設定(ウイルス対策)

※Windows XP 用です。(※ 7 でも一応確認してますけど...)

USBメモリ内の autorun.inf での自動実行によるウイルス感染防止対策として、上記ページの説明にある「autorun.inf の無効化」レジストリを設定します(解除も可能)。

※Windows XP用です。(※ 7 でも一応確認してますけど...)

Windows PE 2.x, 3.x 【基本的】isoイメージの作成

※ Windows 7 / Vista 確認。64-bit もOK。Windows 8 では今のところ使えないです

※ Windows 自動インストール キット (AIK)のインストールが必要

【2012.3.4】PATHの設定にミスがあったので修正しました。申し訳ございません...。

XP + PE 2.0, Vista SP2, 7 (Home 32-bit, Pro 64-bit) で確認しました。

ごく普通に...PE 基本イメージ作成

  • imagex.exe 追加
  • BootSect.exe 追加 (2.x のみ、3.0は元々あり)
  • bootfix.bin 削除
  • すべてのファイルを表示するレジストリ修正 ファイル ShowAll.cmd 作成 startnet.cmd へ書き込み

Vista/7 のインストールDVDの sources\boot.wim から Windows RE(Windows 回復環境)のisoイメージ作成。7 のシステム修復ディスクのちょっとカスタマイズ版。

  • imagex.exe 追加
  • BootSect.exe 追加 (2.x のみ、3.0は元々あり)
  • bootfix.bin 削除
  • winpeshl.ini 作成
  • すべてのファイルを表示するレジストリ修正ファイル ShowAll.cmd 作成

※ インストールDVDがないメーカー製PCなどの場合は C:\Recovery\winre.wim や隠しパーティション内の winre.wim などを sources\boot.wim としてコピーして実行します。

Windows RE 作成のテスト版

しっかり確認してないのであしからず。一応インストールDVDがない場合でも作れるように。

まず、C:\Recovery 内の winre.wim を検索し見つかった場合は選択画面を出します。

めも

Windows付属のヘルプ

※ Windows XP の場合。

  • chmファイル
    • %windir%\Help\ntcmds.chm

ヘルプとサポートから開く ( %systemroot%\pchealth\helpctr\binaries\HelpCtr.exe )

  • コマンド シェルの概要
    • HelpCtr.exe /url ms-its:ntcmds.chm::/ntcmds_shelloverview.htm
  • コマンド ライン リファレンス
    • HelpCtr.exe /url ms-its:ntcmds.chm::/ntcmds_o.htm
  • バッチ ファイルを使用する
    • HelpCtr.exe /url ms-its:ntcmds.chm::/batch.htm
  • バッチ パラメータを使用する
    • HelpCtr.exe /url ms-its:ntcmds.chm::/percent.htm
  • コマンド リダイレクト演算子を使用する
    • HelpCtr.exe /url ms-its:ntcmds.chm::/redirection.htm

コマンド プロンプト ウィンドウ

  • Esc - 入力をクリア
  • F1 - 入力履歴 1文字ずつ
  • F2 - カーソルの前をコピー
  • F3 - 直前に実行したコマンド
  • F4 - カーソル以降削除
  • F5 - 履歴(番号0から)
  • F7 - 履歴(番号選択)

bat/cmdファイルをテキストエディタで開く

「右クリックメニューの編集」の指定を書き換え

  • 【元】%SystemRoot%\System32\NOTEPAD.EXE %1
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\batfile\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00

[HKEY_CLASSES_ROOT\cmdfile\shell\edit\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00
  • 【EdTex】"C:\Program Files\EdTex\edtex.exe" "%1"
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\batfile\shell\edit\command]
@="\"C:\\Program Files\\EdTex\\edtex.exe\" \"%1\""

[HKEY_CLASSES_ROOT\cmdfile\shell\edit\command]
@="\"C:\\Program Files\\EdTex\\edtex.exe\" \"%1\""
  • 【秀丸】"C:\Program Files\Hidemaru\Hidemaru.exe" "%1"
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\batfile\shell\edit\command]
@="\"C:\\Program Files\\Hidemaru\\Hidemaru.exe\" \"%1\""

[HKEY_CLASSES_ROOT\cmdfile\shell\edit\command]
@="\"C:\\Program Files\\Hidemaru\\Hidemaru.exe\" \"%1\""

エクスプローラからコマンド プロンプトを開く

フォルダを右クリックでそのフォルダをカレント・ディレクトリとしてコマンド プロンプトを開くregファイル。

  • ※ Windows XP
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cmd]
@="コマンドプロンプト(&Z)"

[HKEY_CLASSES_ROOT\Directory\shell\cmd\command]
@="cmd.exe /k \"cd /d %L\""

[HKEY_CLASSES_ROOT\Drive\shell\cmd]
@="コマンドプロンプト(&Z)"

[HKEY_CLASSES_ROOT\Drive\shell\cmd\command]
@="cmd.exe /k \"cd /d %L\""
  • 元に戻す
Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cmd]
[-HKEY_CLASSES_ROOT\Drive\shell\cmd]

Windows 7 では...

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cmd]
"Extended"=-

[HKEY_CLASSES_ROOT\Drive\shell\cmd]
"Extended"=-
  • 元に戻す
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cmd]
"Extended"=""

[HKEY_CLASSES_ROOT\Drive\shell\cmd]
"Extended"=""

pushd コマンドで移動してるので、ネットワーク上だとネットワークドライブが自動割り当てされますね。

Shift キー押しながらって方法もあるのですね。(※ 7 非対応ファイラーでは使えないかも。)

関連付け実行

エディタで編集中のbatファイルを直接実行。ツールバーのボタンなどに登録しておくと便利。

秀丸エディタ
  • コマンド一覧ファイル系関連付けで開く
  • プログラム実行 - cmd /c "%f"
EdTex(EdLeaf)

【外部ツール】の実行、または【ユーザーツール】に登録

  • パス - C:\WINDOWS\system32\cmd.exe
  • パラメータ - /c "$f"

ファイル結合(と分割)

ファイル結合

/b はバイナリの場合(/A ASCII テキスト ファイル)

  • 一つずつ
copy /b "test.000"  "test.zip"
copy /b "test.zip" + "test.001"  "test.zip"
copy /b "test.zip" + "test.002"  "test.zip"
  • 足し算
C:\>copy /b test.000 + test.001 + test.002 test.zip
test.000
test.001
test.002
        1 個のファイルをコピーしました。
  • ワイルドカード
C:\>copy /b test.0* test.zip
test.000
test.001
test.002
        1 個のファイルをコピーしました。
Linux

WIndows でも UnxUtilssplit.exe, cat.exe でできます...

  • 結合
$ cat test.zip.* > test.zip
  • 分割
$ split --verbose -b 1423k test.zip test.zip.
creating file `test.zip.aa'
creating file `test.zip.ab'
creating file `test.zip.ac'

エラー出ますた!

しょっちゅうやってるミス(汗)

  • 空白を含むパスの処理・・・引数は引用符で囲む
  • if文の = が一つしか...
  • 引用符が片方だけ
  • 変数の % が片方だけ
  • for文の変数が %x (%%x)
  • for文のdoなし
  • 環境変数に引用符が...
  • 環境変数とコマンド名が重複するとたまにおかしくなるなる
  • GOTO の行き先が変
  • ラベルがないー
  • なんか全角文字が...
  • PATHの設定忘れてた...
  • 大文字小文字を区別
  • set path=.\texinst;%path% の後の ;%path% 忘れ
  • バッチファイルの名前がコマンド名と同じ!

などなど...

私的Tips

一時ファイル・ディレクトリの作成

ファイル名重複の可能性や、エラー時などの削除忘れ、CDなどから実行する場合などを考えて、こんなかんじにしてます。

set temp_dir=%temp%\%random%
mkdir %temp_dir%

一時ファイル名は簡単に "%temp_dir%\0" とかでも指定可能。

  • バッチ終了時、または中断時にはディレクトリごと削除
rd /s /q "%temp_dir%"

日付・時刻

現在の日付時刻を環境変数に設定

XP と 2000 でちょっと違い(2000では前に曜日が入る)があるので...

set now=%date%_%time%
set now=%now: =0%
set now=%now:~-20,2%%now:~-17,2%%now:~-14,5%%now:~-8,2%%now:~-5,2%
080909_223558
  1. 1:00から9:00は01:00にならずにスペースが入ってしまうので、スペースがあれば0に置換
  2. XPと2000で違いがあるので、末尾から数えて文字を抜き出し

またはこんなかんじでもいいのかな

set now=%date%_%time%
set now=%now: =0%
for /f "tokens=1-5 delims=/:." %%H in ("%now%") do set now=%%H%%I%%J%%K%%L
set now=%now:~-13,13%
既存ファイルにファイル自身の更新日時を付けてリネーム

XP と 2000 でちょっと違いがあるので...

set file=boot.img

<span class="red">REM # 更新日時取得</span>
for %%I in (%file%) do set bt=%%~tI
> bt=2008/09/09 07:11
<span class="red">REM # 日と時の間のスペース削除</span>
set bt=%bt: =%
> bt=2008/09/0907:11
<span class="red">REM # 文字列の後ろから抜き出し</span>
set bt=%bt:~-13,2%%bt:~-10,2%%bt:~-7,2%_%bt:~-5,2%%bt:~-2,2%_%RANDOM%
> bt=080909_0711_7062
<span class="red">REM # backnameを boot_日付_時間_乱数.img 設定</span>
for %%I in (%file%) do set backname=%%~nI_%bt%%%~xI
> backname=boot_080909_0711_7062.img

ren %file% %backname%
  1. ファイルから更新日時を抜き出し
  2. 2000では末尾にスペースが含まれることがあるので、スペースを全削除
  3. 末尾から数えて文字を抜き出し
  4. 念の為に末尾に乱数をセット(秒がないので重複する可能性が)
  5. ファイル名_%bt%.拡張子 にする
  6. 元ファイルをリネーム
boot_080909_0711_7062.img

※上記ではスペースを含むパス、値に引用符がある場合に問題あり。

set /p file="C:\Documents and Settings\palm84\デスクトップ\boot.img"

<span class="red">REM # 変数の値に引用符があれば除去</span>
if defined file set file=%file:"=%      
<span class="red">REM # セットの変数を引用符で囲んで更新日時取得</span>
for %%I in ("%file%") do set bt=%%~tI
set bt=%bt: =%
set bt=%bt:~-13,2%%bt:~-10,2%%bt:~-7,2%_%bt:~-5,2%%bt:~-2,2%_%RANDOM%
for %%I in ("%file%") do set backname=%%~nI_%bt%%%~xI

ren "%file%" "%backname%"

またはこんなかんじでもいいのかな

if defined file set file=%file:"=%      
for %%I in ("%file%") do set bt=%%~tI
for /f "tokens=1-5 delims=/: " %%H in ("%bt%") do set bt=%%H%%I%%J_%%K%%L
set bt=%bt: =%
set bt=%bt:~-11,11%
for %%I in ("%file%") do set backname=%%~nI_%bt%_%RANDOM%%%~xI

ren "%file%" "%backname%"

ドライブの空き領域

dirコマンドの出力から

for /f "usebackq tokens=3,4" %%x in (`dir /a ^| findstr の空き領域`) do set aki=%%x %%y
(set aki=xxx,xxx,xxx バイトの空き領域)

ディレクトリ関係

ディレクトリ容量

dirコマンドの出力から

for /f "usebackq tokens=3-4" %%x in (`dir /a /s ^| findstr 個のファイル`) do set dir_size=%%x %%y
(set dir_size=xx,xxx,xxx バイト)

事前に行数を出して skip=%gyousu% とかした方がスマートかもしれませんが、使えない場合もあったりしました。

for /f "usebackq" %%x in (`dir /a /s ^| find /c "個のファイル"`) do set /a gyousu=%%x-1
ファイルとディレクトリの判別

forコマンドでファイル属性を取得

mkdir test_dir
set D_dir=test_dir

for %x in ("%D_dir%") do set D_test=%~ax
set D_test=d--------
if "%D_test:~0,1%"=="d" echo directory

ネットワークドライブではなくローカル上なら、 if exist test_dir\if exist test_dir\nul でディレクトリの判断は可能なはず。

ディレクトリが空かどうか
set test=test_dir
set nakami=nasi
for /f %%x in ('dir /a/b "%test%"') do set nakami=ari

ドライブルートの場合は、空っぽだと、dir /a/b がエラーになるので下記でも判別可能かと。

set nakami=nasi
dir /a /b A:\ >nul 2>nul && set nakami=ari
  • 容量を調べて、0なら空ファイル・空ディレクトリの存在をチェックする例
set test=test_dir
for /f "usebackq tokens=3" %%x in (`dir /a /s "%test%" ^| findstr 個のファイル`) do set test_size=%%x
if not %test_size%==0 echo ディレクトリは内容あり
if %test_size%==0 (
dir /a-d /b /s "%test%" >nul 2>nul && set empty_file=yes
for /f "usebackq delims=" %%x in (`dir /ad /s /b "%test%"`) do set empty_dir=yes

echo ディレクトリ容量は 0 です...
if defined empty_file echo 空ファイルあり
if defined empty_dir echo 空ディレクトリあり
if not defined empty_file (if not defined empty_dir @echo 空っぽです))

ドライブレターを調べる

未割り当て、及び未使用のドライブレターを調べる場合など...

  • if exist では、空の内蔵光学ドライブもnot existになってしまう
  • レジストリから割り当て済みドライブレターをチェック
  • レジストリにはネットワークドライブは記録されない ので、if exist でもチェック
  • Reg.exe でレジストリの REG_BINARY 値を出力、findstrコマンドでCd-ROM, RemovableMediaの文字列をチェック

※ Windows 2000 で reg.exe を使うにはサポートツールのインストールが必要

レジストリの割り当て済みドライブレターを列挙
regedit /e /a "mount_reg.txt" "HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices"
for %%x in (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) do findstr \\%%x: "mount_reg.txt" >nul && echo %%x:

reg.exe なら...

for %%x in (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) do reg query HKLM\SYSTEM\MountedDevices /v \DosDevices\%%x: >nul 2>nul && echo %%x:
空きドライブ文字を列挙
regedit /e /a "mount_reg.txt" "HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices"
for %%x in (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) do findstr \\%%x: mount_reg.txt >nul || if not exist %%x:\ echo %%x:

reg.exe なら...

for %%x in (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) do reg query HKLM\SYSTEM\MountedDevices /v \DosDevices\%%x: >nul 2>nul || if not exist %%x:\ echo %%x:
CDドライブを列挙
reg query HKLM\SYSTEM\MountedDevices | findstr 4300640052006F006D00 | findstr DosDevices >temp.txt
for %%x in (D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do findstr \\%%x: temp.txt >nul && echo %%x: - CD-ROM ドライブ
  • リストファイルを作らない
for %%x in (D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
reg query HKLM\SYSTEM\MountedDevices | findstr 4300640052006F006D00 | findstr DosDevices\%%x: >nul && echo %%x: - CD-ROM ドライブ)
リムーバブルメディア(フラッシュメモリなど)を列挙
reg query HKLM\SYSTEM\MountedDevices | findstr 520065006D006F007600610062006C0065004D0065006400690061 | findstr DosDevices >temp.txt
for %%x in (D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do findstr \\%%x: temp.txt >nul && echo %%x: - RemovableMedia
  • リストファイルを作らない
for %%x in (D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
reg query HKLM\SYSTEM\MountedDevices | findstr 520065006D006F007600610062006C0065004D0065006400690061 | findstr DosDevices\%%x: >nul && echo %%x: - RemovableMedia)

※ Windows 7 では...

for %%x in (D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do (
reg query HKLM\SYSTEM\MountedDevices | findstr 550053004200530054004f00520023004400690073006b00 | findstr DosDevices\%%x: >nul && echo %%x: - RemovableMedia)

ファイル数を数える

単純ですが...

for /f "tokens=1" %%x in ('dir /a ^| findstr 個のファイル') do set count=%%x

ワイルドカードで特定のファイルを数えるのもアリかと

for /f "tokens=1" %%x in ('dir /a /s *.bat ^| findstr 個のファイル') do set count=%%x

OS名・バージョン名

※ Server 2003, 2008 が区別できませんが...

ver | find "Windows XP" >nul && set "osname=Microsoft Windows XP"
ver | find "Windows 2000" >nul && set "osname=Microsoft Windows 2000"
ver | find "Version 6.0" >nul && set "osname=Microsoft Windows Vista"
ver | find "Version 6.1" >nul && set "osname=Microsoft Windows  7"
echo %osname%
  • Service Pack
regedit /s /e /a "reg_temp.txt" "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
for /f "usebackq tokens=2 delims==" %%x in (`find /i "CSDVersion""=""Service Pack" "reg_temp.txt"`) do set spnumber=%%x
if defined spnumber set spnumber=%spnumber:"=%
echo %spnumber%
  • XP Home EditionとProfessional
regedit /s /e "reg_xphome.txt" "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions"

find /i "ProductSuite""=hex(7):50,00,65" "reg_xphome.txt" >nul
if ERRORLEVEL 1 (
set osname=Microsoft Windows XP Professional
) Else (
set osname=Microsoft Windows XP Home Edition
)
echo %osname%
Reg.exe で
  • XP
>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

 REG.EXE VERSION 3.0

KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
   ProductName REG_SZ  Microsoft Windows XP

>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    CSDVersion  REG_SZ  Service Pack 3
>for /f "usebackq tokens=3 delims=	" %%x in (`reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName`) do set "osname=%%x"
>for /f "usebackq tokens=3 delims=	" %%x in (`reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion`) do set "spnumber=%%x"
>if "%osname%"=="Microsoft Windows XP" (
>reg query HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions /v ProductSuite | findstr /i Personal >nul
>if ERRORLEVEL 1 (set "osname=Microsoft Windows XP Professional") else (
set "osname=Microsoft Windows XP Home Edition"))
>echo %osname% %spnumber%
  • Vista
>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ProductName    REG_SZ    Windows Vista (TM) Home Premium

>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    CSDVersion    REG_SZ    Service Pack 2
  • 7
>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ProductName    REG_SZ    Windows 7 Ultimate

>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CSDVersion

エラー: 指定されたレジストリ キーまたは値が見つかりませんでした

ファイルを検索

ファイル名で検索して、フルパスで一覧表示。ワイルドカード【*】使用可能。(※一覧表示はファイル名のみだがディレクトリ名も検索対象になる)

pushd C:\
dir /a-d/b/s regedit.exe

C:\WINDOWS\regedit.exe
C:\WINDOWS\system32\dllcache\regedit.exe
C:\WinPE\mount\Windows\regedit.exe
C:\winpe_x86\mount\Windows\regedit.exe
  • 複数ファイル
    • ※【$】で行末指定
    • ※【\\】を付けないと、\ナントカreg.exeも対象になってしまう
    • ワイルドカード指定は【.*】(※ディレクトリ名も対象になってしまう)
dir /a-d/b/s C:\ | findstr /i "\\reg.exe$ \\regedit.exe$"

forでの処理

ログに書き出す場合はこちらの方がいいかなぁ。上記ではログファイル名に検索ファイル名を付ける場合にアスタリスク【*】の置換ができないようなので...

  • ファイル名のみ検索するには、 \\filename$ など正規表現を使う
  • ワイルドカード指定は、【.*
  • ログファイル名は、【.*】を【-】などに置換する
  • ファイル名のみ指定した場合
    • ディレクトリ名も対象、regedit.exeナントカも対象
for /f "usebackq delims=" %x in (`dir /a-d/b/s C:\ ^| findstr /i regedit.exe`) do @echo %x

C:\WINDOWS\regedit.exe
C:\WINDOWS\$NtServicePackUninstall$\regedit.exe
C:\WINDOWS\Prefetch\REGEDIT.EXE-2AE3423E.pf
C:\WINDOWS\ServicePackFiles\i386\regedit.exe
C:\WINDOWS\system32\dllcache\regedit.exe||<
  • ワイルドカード使用 - \reg.exe, \regナントカ.exe を検索
    • \reg...\ナントカ.exeも対象になってしまう
    • ※【\\】を付けないと、...reg\ナントカ.exeも対象になってしまう
for /f "usebackq delims=" %x in (`dir /a-d/b/s C:\ ^| findstr /i \\reg.*.exe`) do @echo %x

C:\WINDOWS\regedit.exe
C:\WINDOWS\system32\reg.exe
C:\WINDOWS\system32\regedt32.exe
C:\WINDOWS\system32\regini.exe
C:\WINDOWS\system32\regsvr32.exe
C:\WINDOWS\system32\regwiz.exe
<以下略>
  • 複数ファイル
    • 引用符囲み、スペース区切り
for /f "usebackq delims=" %x in (`dir /a-d/b/s C:\ ^| findstr /i "\\reg.exe \\regini.exe"`) do @echo %x

C:\Program Files\Windows Resource Kits\Tools\regini.exe
C:\WINDOWS\$NtServicePackUninstall$\reg.exe
C:\WINDOWS\ServicePackFiles\i386\reg.exe
C:\WINDOWS\system32\reg.exe
C:\WINDOWS\system32\regini.exe
C:\WINDOWS\system32\dllcache\regini.exe
<以下略>
バッチファイル

ワイルドカード使用、複数ファイル指定を可能にして、対象をファイル名のみにするにはこんなかんじでいいのでせうか?

for /f "usebackq delims=" %%I in (`dir /a-d/b/s C:\ ^| findstr /i /e "%filename%"`) do (
echo %%~nxI | findstr /i /b "%filename%" >nul && echo %%I)
  • ファイルを検索して、filever.exe でファイル情報を書き出すバッチファイル
    • ワイルドカード指定は【.*
    • 複数ファイルはスペース区切りで指定
@echo off
title %~nx0
:ASK_FILE
cls
echo.
set /p filename= ファイル名を入力 : 
echo.
if defined filename set filename=%filename:"=%
if "%filename%"=="" GOTO ASK_FILE
set log=%filename:.*=-%
set log=%log: =_%
set log=Filever_%log%.txt
> "%log%" echo =========================================================
>>"%log%" echo %date% %time% -- %filename%
>>"%log%" echo =========================================================
for /f "usebackq delims=" %%I in (`dir /a-d/b/s C:\ ^| findstr /i /e "%filename%"`) do (
echo %%~nxI | findstr /i /b "%filename%" >nul
if not ERRORLEVEL 1 (
>>"%log%" echo ---------------------------------------------------------
>>"%log%" echo %%I
>>"%log%" echo ---------------------------------------------------------
>>"%log%" filever /v "%%I"
>>"%log%" echo.)
)
"%log%"

※ 下記は Windows 7 / Vista 非対応

※ C,Dドライブから検索

filever.exe が使えない場合は、VBScriptで... ProductVersion は出ませんが。

※ 次のは Windows 7 / Vista でも使えるはず。

※ 全ドライブから検索

2ちゃんねる

かなり参考になりました。


ほなね