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

はてなブックマーク TOPSY

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 でも一応は確認してますが自信ないです...。

これって何 3

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

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

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

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

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

ページ先頭 U

基本ツールのリンク 4

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

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最新版でも同様、信用できないファイルなど展開しないように注意しておくのが吉。圧縮・解凍ソフトの脆弱性はしょっちゅう見つかってるので...

ページ先頭 U

サポート ツール 5

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

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

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

リソースキット・ツール

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

ページ先頭 U

wget.exe で環境準備 6

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

使ってる人いないと思いますが、)ディレクトリ名を変更してるので以前のやつは動かないかも。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フォルダ]の一つ上のディレクトリにコピー、実行するとツール類のダウンロードが始まり、勝手に展開します

ページ先頭 U

自作バッチ 7

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

現在、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 ではサポート・ツールが必要です。

戻る | ページ先頭 U

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

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

戻る | ページ先頭 U

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 で。

戻る | ページ先頭 U

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をバックグランドで一時起動、マウントしてコピー。すべてイメージファイルへの操作。

戻る | ページ先頭 U

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

戻る | ページ先頭 U

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

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

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

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

4KiBセクタの場合は

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

戻る | ページ先頭 U

ISOイメージの展開

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

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

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

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

CDからISOイメージ作成

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

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

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

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

戻る | ページ先頭 U

SYSLINUX のインストール

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

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

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

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

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

戻る | ページ先頭 U

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

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

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

  1. 必要ファイルの自動ダウンロード
  2. 起動ディスク・イメージファイル作成
  3. イメージファイルをFDへ書き込み
  4. LiveCDのカーネルを分割して、FDへ連続コピー

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

ページ先頭 U

作成バッチファイル

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

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

ページ先頭 U

コマンド・オプション 9

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

wget.exe

wget -nc -P "%down_dir%" --passive-ftp URL
参考リンク

戻る | ページ先頭 U

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 オプション。

戻る | ページ先頭 U

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"

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

戻る | ページ先頭 U

gzip.exe(gunzip.exe)

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

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

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

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

戻る | ページ先頭 U

bzip2.exe(bunzip2.exe)

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

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

bzip2.exe -dk "bzipfile"

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

戻る | ページ先頭 U

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"

戻る | ページ先頭 U

Windows コマンド

戻る | ページ先頭 U

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

リダイレクト演算子
出力の非表示(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)

戻る | ページ先頭 U

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!
)

戻る | ページ先頭 U

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

戻る | ページ先頭 U

遅延環境変数

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
)

戻る | ページ先頭 U

特殊文字の扱い

特殊文字のクォート

文字として出力させる

@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

戻る | ページ先頭 U

サブルーチン

戻る | ページ先頭 U

set

set "filename=aaa bbb.txt"
C:\>set file
file1=aaa.txt
file2=bbb.txt
file3=ccc.txt

戻る | ページ先頭 U

pushd / popd

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

戻る | ページ先頭 U

findstr.exe

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

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

type Unicode.txt>Shift_JIS.txt

戻る | ページ先頭 U

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:\直下にコピーされてしまうので注意。

戻る | ページ先頭 U

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 の実行(※使えれば)

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

戻る | ページ先頭 U

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

戻る | ページ先頭 U

regini.exe (XP)

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

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

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

書式
  • 基本
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:削除拒否の 置換(消去)もこれで可能)

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とかで調べないとって話になりますけれども...。

戻る | ページ先頭 U

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

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

戻る | ページ先頭 U

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

戻る | ページ先頭 U

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

戻る | ページ先頭 U

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: - リモート ドライブまたはネットワーク ドライブ

戻る | ページ先頭 U

sc.exe (XP)

戻る | ページ先頭 U

for 構文

環境変数をセット・置換

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:"=% とかの方がいいのかな?...

戻る | ページ先頭 U

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

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

usebackq
記号なしダブルクォートシングルクォートバッククォート
usebackqなしファイル名文字列コマンドバッククォート記号を含むファイル名
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

戻る | ページ先頭 U

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

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

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

戻る | ページ先頭 U

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

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

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

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

戻る | ページ先頭 U

自作バッチ その2

※バッチファイルは 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 を検索し見つかった場合は選択画面を出します。

ページ先頭 U

めも

ページ先頭 U

Windows付属のヘルプ

※ Windows XP の場合。

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

戻る | ページ先頭 U

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

戻る | ページ先頭 U

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

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

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
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\""
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\""

戻る | ページ先頭 U

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

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

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 非対応ファイラーでは使えないかも。)

戻る | ページ先頭 U

関連付け実行

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

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

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

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

戻る | ページ先頭 U

ファイル結合(と分割)

ファイル結合

/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'

戻る | ページ先頭 U

エラー出ますた!

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

などなど...

戻る | ページ先頭 U

私的Tips

ページ先頭 U

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

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

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

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

rd /s /q "%temp_dir%"

戻る | ページ先頭 U

日付・時刻

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

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

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

REM # 変数の値に引用符があれば除去
if defined file set file=%file:"=%      
REM # セットの変数を引用符で囲んで更新日時取得
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%"

戻る | ページ先頭 U

ドライブの空き領域

dirコマンドの出力から

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

戻る | ページ先頭 U

ディレクトリ関係

ディレクトリ容量

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 空っぽです))

戻る | ページ先頭 U

ドライブレターを調べる

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

※ 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)

戻る | ページ先頭 U

ファイル数を数える

単純ですが...

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

戻る | ページ先頭 U

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%
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%
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

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

戻る | ページ先頭 U

ファイルを検索

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

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
dir /a-d/b/s C:\ | findstr /i "\\reg.exe$ \\regedit.exe$"

forでの処理

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

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
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 でも使えるはず。

※ 全ドライブから検索

戻る | ページ先頭 U

参考リンク

2ちゃんねる

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

ページ先頭 U

Written by yassy