Amazon | 理想の眠りをデザインする 【快眠特集】

【逆引き】Windowsコマンドプロンプト全解説:現場で使える解決コマンド100選

Windowsのトラブルシューティングや自動化において、コマンドプロンプトは現在も「最強の武器」だ。しかし、膨大なコマンドの中から「今、どれを使うのが正解か」を即座に判断するのは容易ではない。

本ガイドでは、100種類を超えるWindows標準コマンドを、現場のエンジニア目線で再構築した。単なる機能解説ではなく、「何に困ったときに、どう叩けば解決するか」にフォーカスし、実践的な組み合わせ例(ワンライナー)と共に集約している。


PCの症状・作業目的から、先に叩くと早いコマンドを逆引きできます(まず見る → 一緒に見る の順)。

🔐 権限・認証・ポリシーで詰まった(アクセス拒否/資格情報/設定が効かない)

一言:まず「誰で」「何が効いていて」「何に拒否されているか」を固める。

まず見る: whoamigpresulticacls

一緒に見る: cmdkeyNET USER

  • 「設定(GPO)が反映されてない気がする」gpresult で「適用された結果」を先に確認。
  • 「フォルダに入れない/編集できない」icacls でACLを確認(共有権限は別枠)。
  • 「リモート先の資格情報が残っててログインできない」cmdkey で保存情報を整理。
👤 ユーザー/アカウントを操作したい(追加・削除・パスワード・所属確認)

一言:まず「対象ユーザーがどこに属するか」と「今の実行者」を確認する。

まず見る: NET USERwhoami

一緒に見る: gpresultcmdkey

🧩 バッチ作業を組みたい(出力・分岐・繰り返し・停止・環境変数)

一言:先に「表示・分岐・ループ・変数」を揃えると後で崩れない。

まず見る: echoifforset

一緒に見る: gotoendlocalexittimeoutpauserem

  • 「途中経過を出したい」echo を先に整備。
  • 「条件で処理を切り替えたい」if を核に。
  • 「一覧を回して処理したい」for で形を決める。
  • 「変数スコープで事故りがち」setendlocal をセットで。
🧼 画面を見やすくしたい(ログ確認/作業中の見間違い防止)

一言:ログを見る作業ほど「見た目の整理」が効く。

まず見る: clstitle

一緒に見る: colorclip

📋 結果をコピペで提出したい(証拠・共有・チケット貼り付け)

一言:出力を整えてから「そのまま貼れる」形にする。

まず見る: clip

一緒に見る: whoamigpresulticacls

例:gpresult /r | clip(結果をそのまま貼れる)

🧪 コマンドが見つからない/別のexeが動く(PATH・優先度・場所確認)

一言:まず「どれが実行されているか」を確定する。

まず見る: wherepath

一緒に見る: start


📂 ファイル・ディレクトリ操作

【ATTRIB】:ファイル属性をビット操作する低レベル管理コマンド

ラボの視点 (Insight)
GUIでは触れない「システム属性」と「アーカイブ属性」を制御できる唯一のCLIツール。マルウェア対策とバックアップ制御で真価を発揮する。

項目内容
attrib +R +S +H C:\critical.dat読取専用+システム+隠しの三重ロックで誤削除を物理的に防ぐ
attrib -R -S -H *.* /S /Dウイルスが設定した属性を全解除、感染ファイルを可視化
attrib +A /Sバックアップ未済フラグを強制付与、差分バックアップ対象に復帰
attrib -A *.log /Sログファイルのアーカイブ属性を解除、バックアップ対象から除外

🛡 コマンドの要点と注意点

属性は4bit(R/A/S/H)で管理され、Explorerの「プロパティ」では+Sと+Hの組み合わせは解除不可。ランサムウェアは感染後に+S +Hで痕跡を隠すため、attrib *.* /Sでの全属性確認が初動対応の定石。システムファイルに-Sを実行するとWindows Updateが誤作動する危険性がある。

🛠 現場のトラブル解決(一撃解決コマンド)

USBメモリがウイルス感染で全ファイル消失に見える時: attrib -S -H E:\*.* /S /Dで隠された実ファイルを復元、同時にdel E:\*.lnk /Sでショートカット偽装を除去。
共有フォルダで「編集できません」エラー多発時: attrib -R \\server\share\*.docx /Sで一括解除、NTFS権限とは別レイヤーの属性ロックを解放。

🚀 実践コード

REM ランサムウェア感染疑い時の属性異常検知
attrib C:\Users\*\Desktop\*.* /S | findstr /I "S H" > suspicious.txt
REM バックアップ後のアーカイブ属性クリア(差分バックアップ最適化)
forfiles /P "D:\backup" /S /M *.* /C "cmd /c attrib -A @path"
REM 読取専用を無視した強制削除準備
attrib -R -S -H "%TEMP%\stubborn_file.dat" && del /F /Q "%TEMP%\stubborn_file.dat"

cd】:カレントディレクトリ移動と確認

ラボの視点 (Insight)
パス指定だけでは移動できないドライブ跨ぎの罠を知らないエンジニアが多い。/dオプションの存在が実務では必須。

項目内容
cd現在の作業ディレクトリのフルパスを表示
cd [パス]指定ディレクトリへ移動(同一ドライブ内のみ)
cd /d [パス]ドライブを跨いで指定ディレクトリへ移動
cd ..一階層上の親ディレクトリへ移動
cd \現在のドライブのルートへ移動
cd %USERPROFILE%環境変数を利用した移動

🛡 コマンドの要点と注意点

cd D:\Workと打ってもCドライブから移動しない現象は、cdがドライブレター変更を行わない仕様によるもの。/dオプションで強制的にドライブ変更とディレクトリ移動を同時実行する。スペースを含むパスは引用符で囲むかエスケープ不要だが、バッチファイル内ではpushd/popdの方が安全。UNCパス(\\server\share)への直接移動は不可、ネットワークドライブ割当てが必要。

🛠 現場のトラブル解決(一撃解決コマンド)

別ドライブの作業フォルダに即座に移動したい時cd /dで移動とドライブ切替を一発実行。
バッチ内でパス不明時の安全な移動pushd使用でUNCパスも対応、終了時popdで自動復帰。

🚀 実践コード

REM ドライブ跨ぎの確実な移動
cd /d "D:\Projects\WebApp\src"
REM バッチファイル内での安全な移動パターン
pushd "%~dp0"
REM (スクリプト自身の場所を基準に作業)
popd
REM 環境変数とサブフォルダの組み合わせ
cd /d "%APPDATA%\..\Local\Temp"
REM エクスプローラーから現在地でコマンドプロンプト起動時の確認
cd && dir /b

【comp】:バイナリレベルでファイル同一性を検証するツール

ラボの視点 (Insight)
fcより高速だがテキスト解析は貧弱。バックアップ検証やバイナリ同一性確認が主戦場。

項目内容
comp file1.bin file2.binバイト単位で2ファイルを比較、差分位置を16進数で出力
comp file1.txt file2.txt /a最初の不一致で停止、大容量ファイルの高速チェック向け
comp C:\Dir1\*.* C:\Dir2\*.*ディレクトリ間の全ファイル一括比較、同名ファイルのみ対象
comp original.dat backup.dat /d差分を10進数表示、オフセット位置の特定に有効

🛡 コマンドの要点と注意点

バイナリファイルのビット完全一致確認に特化。ファイルサイズが1バイトでも違えば「サイズが違います」で即終了、内容比較は行わない。テキストファイルの差分確認にはfcを使え。大文字小文字を区別しない/cオプションはASCII範囲のみ有効でUTF-8などマルチバイト文字では誤動作する。バッチ処理で使う場合、errorlevel=0が一致、1が不一致、2がファイル未検出。

🛠 現場のトラブル解決(一撃解決コマンド)

バックアップスクリプト後の検証フェーズで即座にファイル破損を検知したい時、compでexit codeを評価すれば自動化可能。ネットワーク転送後の完全性確認にも使える。

🚀 実践コード

@echo off
comp "C:\production\config.bin" "D:\backup\config.bin" >nul 2>&1
if %errorlevel%==0 (
  echo [OK] Backup verified - Binary match
) else (
  echo [ERROR] Backup corrupted - Mismatch detected
  exit /b 1
)
# 複数ファイルの一括検証ループ
Get-ChildItem C:\original\*.dll | ForEach-Object {
  $backup = "D:\backup\$($_.Name)"
  comp $_.FullName $backup /a >$null 2>&1
  if ($LASTEXITCODE -ne 0) { Write-Host "FAIL: $($_.Name)" -ForegroundColor Red }
}

【copy】:ファイルを指定位置に複製、または複数ファイルを結合

ラボの視点 (Insight)
軽量で速い。単一ファイルの移動やテキスト結合では今でもxcopyより使い勝手が良い。

項目内容
copy source.txt dest.txtファイルを別名で複製。拡張子変更も可
copy *.log D:\backup\ワイルドカードで同一拡張子をまとめてコピー
copy /b file1.dat+file2.dat merged.datバイナリ結合。分割ファイルの復元に使える
copy /a *.txt combined.txtテキストファイルを改行保持で連結
copy src.txt dst.txt /v /y検証付き・上書き無確認で強制実行

🛡 コマンドの要点と注意点

/a/bの区別が致命的。テキストはEOFマーカー(Ctrl+Z)で切れるため、バイナリに/aを使うとファイル破損する。/yは環境変数COPYCMDで常時有効化できるが、誤上書きリスクが跳ね上がる。コピー先がディレクトリかファイル名か曖昧な時、意図しない名前で保存されるため末尾の\有無を明示せよ。

🛠 現場のトラブル解決(一撃解決コマンド)

分割されたログを日付順に結合して解析したい時
ファイル名ソート順で結合される仕様を利用し、copy /a log_2024*.txt archive.txtで一括連結。

バックアップ前に既存ファイルと差分確認したい時
fc source.txt backup\source.txtで比較後、差異があればcopy source.txt backup\ /vで検証付きコピー。

🚀 実践コード

REM テキストログ3ファイルを時系列結合+タイムスタンプ付き保存
copy /a access_*.log combined_%date:~0,4%%date:~5,2%%date:~8,2%.log

REM バイナリファイルの分割コピー検証(robocopy使えない環境)
for %%f in (*.bin) do copy /b /v "%%f" "D:\backup\%%f" && echo %%f OK >> backup.log
# PowerShell環境での検証付きバッチコピー(copy相当をループ処理)
Get-ChildItem C:\data\*.dat | ForEach-Object {
  Copy-Item $_.FullName "D:\backup\" -Force -PassThru |
    Test-Path | Out-File -Append backup_verify.log
}

【del / erase】:ファイルを即座に削除する破壊的コマンド

ラボの視点 (Insight)
ゴミ箱を経由しない。復元不可。/S*.*の組み合わせは本番環境で何度も惨事を起こしてきた。

項目内容
del /F /Q ファイルパス読み取り専用も強制削除、確認なし。自動化スクリプトで使う標準形
del /S /Q C:\Logs\*.logサブディレクトリ含む全ログを黙って削除。定期メンテナンスの定番
del /P /A:H 隠しファイル隠し属性ファイルを確認しながら削除。事故防止用
del /A:-R -S *.tmp読み取り専用以外の一時ファイルを再帰削除。属性フィルタ活用例

🛡 コマンドの要点と注意点

delはファイルシステムから直接削除するため、Windowsのゴミ箱には入らない。復元ソフトでもMFT(Master File Table)が上書きされれば回収不能。/Sオプションは予想外に深い階層まで到達するため、実行前にdir /S /Bで対象ファイル一覧を必ず確認すること。読み取り専用・隠しファイルは/F/Aなしでは削除されず、エラーも出ないまま残留する罠がある。

🛠 現場のトラブル解決(一撃解決コマンド)

古いログで溢れたディスクを緊急整理したい時
forfiles /P "C:\Logs" /S /M *.log /D -30 /C "cmd /c del /Q @path" で30日以前のログを一掃。日付指定が効く。

🚀 実践コード

REM 本番環境での安全な削除フロー(確認→実行の2段階)
@echo off
echo === 削除対象ファイル一覧 ===
dir /S /B C:\App\Cache\*.tmp 2>nul
echo.
set /P CONFIRM="上記を削除しますか?(Y/N): "
if /I "%CONFIRM%"=="Y" (
  del /F /S /Q C:\App\Cache\*.tmp
  echo 削除完了: %DATE% %TIME% >> C:\Logs\cleanup.log
) else (
  echo キャンセルされました
)
# PowerShellでの高度な削除(30日以上前のファイルのみ)
Get-ChildItem -Path "C:\Logs" -Recurse -Filter "*.log" |
  Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
  Remove-Item -Force -Verbose

【fc】:2ファイルの差分を行単位で抽出する比較ツール

ラボの視点 (Insight)
Gitなき環境で設定ファイルの変更箇所を特定する最終手段。バイナリモードは実質certutilの下位互換。

項目内容
fc file1.txt file2.txt2ファイルの差分を行単位で表示、変更前後のブロックを出力
fc /N /C config.old config.new行番号付き+大文字小文字無視で設定ファイルを比較
fc /B binary1.exe binary2.exeバイナリ比較、異なるバイト位置を16進数オフセットで表示
fc /L /A *.log backup\*.logASCII差分のみ簡潔表示、冗長な出力を抑制

🛡 コマンドの要点と注意点

テキストモードは連続3行の一致で同期を取るため、大量差分があると出力が膨大化する。バイナリモードは全バイト比較で処理が重く、ハッシュ値比較(certutil -hashfile)の方が高速。改行コードCRLF/LF混在時は全行差分として誤検出される。リダイレクト必須の出力量になるケースが多い。

🛠 現場のトラブル解決(一撃解決コマンド)

デプロイ前後の設定ファイル変更箇所を特定したい時:fc /N production.conf staging.conf | findstr /C:"*"で差分ブロックのみ抽出。バックアップの完全一致を検証する時:fc /B original.db backup.dbでバイト差異なしを確認、戻り値0で判定。

🚀 実践コード

:: 設定ファイル変更の差分レポート生成
fc /N C:\config\app.conf C:\config\app.conf.bak > diff_report.txt 2>&1
if %errorlevel% equ 0 (echo 差分なし) else (type diff_report.txt | findstr /V "Comparing files")

:: バイナリ完全一致の自動検証
fc /B original.bin backup.bin >nul 2>&1 && echo OK:完全一致 || echo NG:差分あり

:: 複数ログファイルの一括差分チェック
for %%f in (*.log) do @fc /L /A "%%f" "archive\%%f" | find "*" && echo [差分]%%f

【mkdir / md】:ディレクトリを一発で作る基本コマンド

ラボの視点 (Insight)
Windowsは勝手に親ディレクトリを作る。Linuxの-pは不要。バッチで大量生成するときの必須ツール。

項目内容
mkdir C:\path\to\dir指定パスにディレクトリ作成。親が無ければ全部作る
mkdir dir1 dir2 dir3カレントに複数ディレクトリを同時作成
md "C:\Program Files\MyApp"スペース含むパスは二重引用符で囲む
if not exist C:\Backup mkdir C:\Backup存在チェック後に作成。バッチの定石

🛡 コマンドの要点と注意点

既存ディレクトリへの実行はエラーにならず無視される。システムドライブ直下やProgram Files配下は管理者権限が必要。相対パスは現在のカレントディレクトリ基準で作成されるため、cdの位置を確認してから実行すること。PowerShellではNew-Itemのエイリアスだが挙動は同一。

🛠 現場のトラブル解決(一撃解決コマンド)

プロジェクト用の定型フォルダ構造を毎回手作業で作っている時
バッチ一発でsrc/docs/test/buildの4階層を生成。テンプレート化して再利用。

🚀 実践コード

@echo off
set PROJECT=ProjectX
mkdir C:\Work\%PROJECT%\src\main\java
mkdir C:\Work\%PROJECT%\src\test\java
mkdir C:\Work\%PROJECT%\docs
mkdir C:\Work\%PROJECT%\build\output
echo %PROJECT% structure created.
# PowerShellで日付別バックアップフォルダ自動生成
$date = Get-Date -Format "yyyyMMdd"
mkdir "D:\Backup\$date" -Force

【more】:画面内に収まらないテキストを1画面ずつ制御表示

ラボの視点 (Insight)
パイプラインの最終受け手として使え。ログ解析時にスクロールバッファに流れる前に内容を目視確認できる。

項目内容
more [ファイル名]テキストファイルを1画面ずつ表示。Enterで次行、Spaceで次画面
[コマンド] | more長大な出力を画面単位で区切る。dir、type、findstrとの組み合わせが基本
more /C /E file.txt画面クリア+拡張モード。スクロール制御が必要な大容量ログで有効
more +[行数] file.txt指定行から表示開始。冒頭スキップが必要な定型ログで時短

🛡 コマンドの要点と注意点

moreは出力制御であって検索ツールではない。PowerShellではOut-Hostがページング機能を持つため、そちらが優先される環境も多い。バイナリファイルに使うと文字化けで画面が破壊されるため、事前にファイル種別確認が必須。パイプ経由時はCtrl+Cで即中断可能だが、ファイル直接指定時は全ページ送りが発生する可能性あり。

🛠 現場のトラブル解決(一撃解決コマンド)

大量エラーログから特定文字列周辺を確認したい時:findstr /N "ERROR" app.log | moreでヒット行の行番号付き表示。

ディレクトリ内の全ファイルサイズを段階確認:dir /S /O:S | moreで容量昇順ソート後のページング。

🚀 実践コード

REM システムログから警告以上を抽出してページ表示
findstr /I "warning error critical" C:\Windows\System32\winevt\Logs\System.evtx.log | more /E

REM ネットワーク設定の詳細を画面制御しながら全確認
netsh interface ip show config | more

REM 大容量txtの500行目から表示開始
more +500 large_data.txt

【move】:ファイル・フォルダを元の場所から消して別の場所に配置する

ラボの視点 (Insight)
copyと違い元が消える。バッチで整理する時は必ず/-Yで確認を入れるか、事前にログ出力してからやれ。

項目内容
move 移動元 移動先指定したファイルまたはフォルダを移動先に転送し、元の場所から削除される
move /-Y 移動元 移動先移動先に同名ファイルがある場合、上書き前に確認プロンプトが表示される
move /Y 移動元 移動先同名ファイルを確認なしで上書き。自動処理で使うが事故率も高い
move C:\Path\*.log D:\Archive\ワイルドカードで特定拡張子を一括移動。ログローテーション等で多用

🛡 コマンドの要点と注意点

moveは移動元を削除する破壊的操作。同名ファイルは無警告で上書きされる(/Yオプション時)。システムフォルダやロックされたファイルには管理者権限が必要。異なるドライブ間の移動は内部的にコピー+削除になるため、容量不足やI/Oエラーで中途半端に失敗するリスクがある。バッチでは必ずerrorlevelチェックを入れること。

🛠 現場のトラブル解決(一撃解決コマンド)

古いログを月次でアーカイブしたい時:forfilesと組み合わせて30日以上前のファイルを自動移動させる。
移動失敗を検知したい時if errorlevel 1で移動失敗をキャッチし、エラーログに出力してから処理を中断する。

🚀 実践コード

@echo off
rem 30日以上前のログファイルをアーカイブフォルダへ移動
forfiles /p "C:\Logs" /m *.log /d -30 /c "cmd /c move /-Y @path D:\Archive\"

if errorlevel 1 (
  echo [ERROR] ログ移動失敗 >> C:\Scripts\error.log
  exit /b 1
)

echo ログアーカイブ完了: %date% %time% >> C:\Scripts\move.log
# PowerShellでの安全な移動(存在チェック+ログ付き)
$source = "C:\Temp\*.csv"
$dest   = "D:\Data\"

Get-ChildItem $source | ForEach-Object {
  Move-Item $_.FullName $dest -Force -ErrorAction Stop
  Add-Content "C:\Scripts\move.log" "$($_.Name) moved at $(Get-Date)"
}

【ren / rename】:ファイル・フォルダ名を同一ディレクトリ内で変更する

ラボの視点 (Insight)
ワイルドカード一括変換の挙動を理解していない奴が多すぎる。拡張子変更は構造を保持するため、単純な置換ではない。

項目内容
ren oldname.txt newname.txt単一ファイルの名前を変更。パスは指定不可、カレントディレクトリまたは対象ディレクトリを明示
ren *.txt *.log全.txtファイルの拡張子を.logに変更。ファイル名本体は保持される
ren report_*.txt backup_*.txtワイルドカード部分の構造を保ったまま接頭辞のみ変更。report_0101.txt → backup_0101.txt
ren "file name.txt" newfile.txtスペース含むファイル名はダブルクォートで囲む

🛡 コマンドの要点と注意点

renは同一ディレクトリ内の名前変更専用。異なるディレクトリへの移動を伴う場合はmoveを使う。ワイルドカード使用時、*.txt*.bakは拡張子のみ変更し元のファイル名構造は維持される。*は該当部分をそのまま引き継ぐため、*.txtbackup_*.txtのような単純な接頭辞追加は不可能(全ファイルがbackup_.txtになる)。システムファイルや実行中ファイルはロックされ変更不可。

🛠 現場のトラブル解決(一撃解決コマンド)

大量のログファイルを日付接頭辞から拡張子アーカイブ化したい時:forループとの組み合わせが必須。単純なワイルドカードでは接頭辞・接尾辞の追加は構造的に不可能。
誤って拡張子を全削除してしまった複数ファイルを復元:ren *. *.txtで拡張子なしファイルに一括付与可能。

🚀 実践コード

# 現在ディレクトリの全.logを.bakに変換
ren *.log *.bak

# 特定ディレクトリ内のフォルダ名変更(移動不可)
ren C:\Projects\OldProjectName NewProjectName

# forループで接頭辞追加(renの限界を突破)
for %f in (*.txt) do ren "%f" "backup_%f"

# 拡張子が消えた全ファイルに.datを復元
ren *. *.dat

# 複数階層を対象にする場合(PowerShell推奨)
Get-ChildItem -Recurse -Filter *.tmp | Rename-Item -NewName {$_.Name -replace '\.tmp$','.log'}

【rmdir / rd】:ディレクトリを根こそぎ消すコマンド

ラボの視点 (Insight)
ゴミ箱を経由しない物理削除。CI/CDの成果物クリーンアップと開発環境リセットで毎日使う。

項目内容
rmdir /S /Q [path]ディレクトリを中身ごと確認なしで即座に削除。バッチ処理の定番
rd /S [path]サブディレクトリ含め削除するが確認プロンプトが出る。手動削除向け
rmdir [path]空ディレクトリのみ削除。中身があるとエラーで止まる

🛡 コマンドの要点と注意点

Explorerの削除と違いゴミ箱を経由しないため復元不可。特に /Q 付きは確認なしで即消去されるため、パス指定ミスが致命傷になる。システム保護フォルダは管理者権限必須。ネットワークドライブやシンボリックリンクに対しては挙動が異なるため事前検証必須。

🛠 現場のトラブル解決(一撃解決コマンド)

ビルド成果物が肥大化してディスク圧迫している時
for /d %i in (C:\Projects\*) do @rmdir /S /Q "%i\bin" "%i\obj" で全プロジェクトの中間ファイルを一掃。

🚀 実践コード

REM Jenkins/GitLab CI後のワークスペース完全クリア
rmdir /S /Q "%WORKSPACE%\dist"
rmdir /S /Q "%WORKSPACE%\node_modules"

REM 7日以上前のログフォルダを削除(forfiles併用)
forfiles /P "C:\Logs" /D -7 /C "cmd /c if @isdir==TRUE rmdir /S /Q @path"

REM 削除前にディレクトリサイズ確認→削除の安全運用
dir /S "C:\Temp\OldProject" && rmdir /S /Q "C:\Temp\OldProject"

【sort】:テキストを行単位で並べ替える標準入出力フィルタ

ラボの視点 (Insight)
パイプと組み合わせて初めて真価を発揮する。ファイル指定より標準入力で使え。

項目内容
sort input.txt行を辞書順(昇順)で並べ替えて標準出力に吐く
sort /R input.txt降順(逆順)でソート。数値より文字列として処理される点に注意
sort /+10 data.txt10文字目以降を基準にソート。固定長データの特定フィールド指定に使える
sort /UNIQUE input.txt重複行を削除して出力。Unixのsort -u相当
dir /b | sort /Rパイプ経由で処理。リダイレクトよりこの使い方が現場の標準

🛡 コマンドの要点と注意点

デフォルトは文字コード順の辞書ソート。数値として「10」が「2」より前に来る罠がある。大文字小文字は区別される。巨大ファイルは一時領域を食うため/Tで一時ディレクトリを明示的に指定すべき。/Mでメモリ上限を指定できるが、デフォルトの90%使用で通常は問題ない。出力リダイレクト>で入力ファイルと同名を指定すると内容が消失する。

🛠 現場のトラブル解決(一撃解決コマンド)

重複IPアドレスをログから抽出したい時findstr /R "[0-9]*\.[0-9]*\." access.log | sort の後に重複排除したいなら、sort /UNIQUE を使う。
CSV の特定列でソートしたいが列位置が不定sort /+n は固定長専用。可変長CSVなら PowerShell の Import-Csv | Sort-Object に切り替えろ。

🚀 実践コード

REM エラーログから重複を除外してカウント
type error.log | sort | find /C /V ""

REM プロセス一覧をメモリ使用量(逆順)でソート風に見せる疑似処理
tasklist | sort /R /+64

REM 複数ログファイルを結合して時系列ソート(タイムスタンプが行頭前提)
type *.log | sort > combined_sorted.log

REM ディスク容量を食うファイルTop10を抽出(dir出力の日付部分を無視)
dir /s /a /-c | sort /R /+39 | more
# 数値として正しくソートする場合はPowerShellを使え
Get-Content data.txt | Sort-Object {[int]$_} -Descending

# CSV特定列ソート(sortコマンドでは不可能な処理)
Import-Csv data.csv | Sort-Object -Property Size -Descending | Export-Csv sorted.csv

【tree】:ディレクトリ階層を可視化し、構造をテキストで出力する

ラボの視点 (Insight)
フォルダ構造をドキュメント化する唯一の標準コマンド。障害報告やコードレビュー時の構成証跡として、GUIより圧倒的に速い。

項目内容
tree /fファイル名まで全て表示。プロジェクト構成の把握に使う
tree /aASCII文字で描画。テキストエディタやチケットシステムへの貼り付け用
tree /f /a > list.txtファイル一覧をテキスト化。構成管理やレビュー資料として保存
tree C:\target指定パスから実行。カレントディレクトリを汚さない

🛡 コマンドの要点と注意点

デフォルトではフォルダのみ表示、/fでファイルまで列挙される。大規模フォルダでは出力が数万行になるため必ずリダイレクトで保存すること。システムフォルダ(Windows、Program Files)は権限エラーや膨大な出力で実用的でない。相対パス指定時は意図しない深度まで掘る可能性があるため、絶対パスでの実行を推奨。

🛠 現場のトラブル解決(一撃解決コマンド)

納品前にプロジェクトファイル構成をエビデンス化したい時
tree /f /aでASCII出力し、そのままGitのREADMEやRedmineに貼り付け。日本語パスも文字化けしない。

特定フォルダ配下の全ファイルパスをExcelで集計したい時
tree /fの出力をテキストで保存後、正規表現でパス抽出すればファイル棚卸しが一瞬で完了する。

🚀 実践コード

# プロジェクト構成を納品資料として出力
tree C:\Projects\MyApp /f /a > "%USERPROFILE%\Desktop\structure_%date:~0,4%%date:~5,2%%date:~8,2%.txt"

# 特定拡張子のファイルだけ抽出(findstrと組み合わせ)
tree C:\Projects /f | findstr /i ".cs .config"

# フォルダ階層だけ確認(デフォルト動作)
tree D:\Backup

【xcopy】:ディレクトリ構造を維持したまま大量ファイルを条件付きコピー

ラボの視点 (Insight)
robocopyが主流の今、xcopyを使う理由は「古いスクリプトとの互換性」か「シンプルさ」のみ。差分バックアップなら最初からrobocopyを選べ。

項目内容
xcopy C:\source D:\backup /S /E /Yサブフォルダ含め全コピー、空フォルダも対象、上書き確認なし
xcopy C:\source D:\backup /D /S /Y更新ファイルのみ差分コピー、日次バックアップ自動化の定番
xcopy C:\source D:\backup /S /EXCLUDE:exclude.txt除外リストに一致するファイル・パスをスキップしてコピー
xcopy C:\source D:\backup /S /K /O /X属性・所有者・ACL情報を保持したまま完全複製

🛡 コマンドの要点と注意点

xcopyは単純な再帰コピーには有効だが、大容量・長時間実行には脆弱。中断時の再開機能なし、エラーハンドリングも貧弱。/Yなしで実行すると上書き確認が連続表示され自動化不可。空フォルダは/Eなしで無視される仕様に注意。/EXCLUDEは正規表現非対応でパターンマッチは部分一致のみ。

🛠 現場のトラブル解決(一撃解決コマンド)

差分バックアップで特定フォルダを除外したい時:exclude.txt\node_modules\\.git\\temp\を記載し/EXCLUDEで読み込ませれば開発環境の巨大フォルダを自動除外。
既存バックアップへ更新分だけ追加したい時:/D単独で実行すればターゲット側より新しいファイルのみ抽出、帯域・時間を節約。

🚀 実践コード

REM 日次差分バックアップ(ログ・一時ファイル除外)
echo .log > exclude.txt
echo \temp\ >> exclude.txt
echo ~$ >> exclude.txt
xcopy "C:\ProjectData" "D:\Backup\%DATE:~0,10%" /D /S /E /Y /EXCLUDE:exclude.txt /R /H

REM 属性完全保持の完全複製(権限情報含む)
xcopy "\\Server\Share" "E:\Mirror" /S /E /K /O /X /H /Y

REM エラー発生時に戻り値で判定(バッチ自動化用)
xcopy C:\source D:\backup /S /E /Y
if %ERRORLEVEL% NEQ 0 (
  echo Backup failed with error %ERRORLEVEL% >> backup.log
  exit /b %ERRORLEVEL%
)

【find】:テキスト内の文字列を行単位で検索する

ラボの視点 (Insight)
findstrの下位互換と誤解されがちだが、errorlevelを使った条件分岐での存在確認に特化した使い方がバッチ処理の基本。正規表現が不要なら軽量で挙動も安定。

項目内容
find "文字列" ファイル名指定文字列を含む行を出力。完全一致ではなく部分一致
find /I /C "ERROR" *.log大文字小文字無視でログファイル群からERROR行数をカウント
find /V "正常" server.log「正常」を含まない行のみ抽出。異常行の洗い出し
command | find "keyword"パイプ経由で他コマンドの出力をフィルタリング
find /N "exception" app.log行番号付きで出力。エディタでの該当箇所特定が即座に可能

🛡 コマンドの要点と注意点

デフォルトはShift_JIS前提。UTF-8ログはBOMなしだと文字化けするためchcp 65001で事前にコードページ変更が必須。正規表現・複数キーワードのOR検索は非対応なので複雑な検索はfindstrに切り替える。errorlevelは「見つからない=1」「見つかった=0」でバッチの条件分岐に直結。

🛠 現場のトラブル解決(一撃解決コマンド)

ログファイルにERRORが含まれているか一瞬で判定したい時
find /I "error" app.log >nul 2>&1 && echo 検出 || echo 正常 でバッチ内の監視処理を1行実装。

複数ログファイルからエラー行だけ抽出して通知したい時
for %F in (*.log) do find "FATAL" "%F" >> error_summary.txt でファイル名付きエラー集約。

🚀 実践コード

REM 【パターン1】バッチでのエラー検知と自動対処
@echo off
find /I "exception" C:\App\logs\today.log >nul
if %errorlevel% equ 0 (
  echo [ALERT] 例外検出 - 管理者に通知 | msg * /TIME:10
  net stop AppService
) else (
  echo 正常動作中
)

REM 【パターン2】複数条件の逐次チェック(ANDロジック)
find "起動完了" system.log >nul && (
  find "認証成功" system.log >nul && echo システム正常 || echo 認証異常
) || echo 起動失敗

REM 【パターン3】タスクリスト結果のフィルタ
tasklist | find /I "chrome.exe" >nul && taskkill /IM chrome.exe /F
# PowerShellでUTF-8ログを確実に処理する場合
Get-Content -Encoding UTF8 app.log | Select-String "ERROR" |
ForEach-Object { "$($_.LineNumber): $($_.Line)" }

【findstr】:正規表現でファイル内を検索する文字列フィルタ

ラボの視点 (Insight)
find はただの部分一致検索。複数条件・正規表現・大規模ログ解析ならfindstr一択。

項目内容
findstr "文字列" file.txt指定文字列を含む行を抽出
findstr /I /S "error" *.log大文字小文字無視でサブディレクトリ全検索
findstr /R "^[0-9]" file.txt正規表現で数字始まりの行を抽出
findstr /N /C:"critical error" log.txt複数単語を含む行を行番号付きで表示
findstr /M "warning" *.txt該当文字列を含むファイル名のみ列挙

🛡 コマンドの要点と注意点

正規表現は簡易版でgrep比較で \d や \s が使えない。[0-9] [a-z] などPOSIX風に記述。デフォルトは大文字小文字を区別するため /I の付け忘れで結果が空振りすることが多い。パイプで渡された標準入力も処理可能だがファイル名を省略すると標準入力待ちになる。特殊文字 .*?[]^$ は正規表現として解釈されるため /C:"文字列" で囲むかエスケープが必須。

🛠 現場のトラブル解決(一撃解決コマンド)

障害発生時刻付近のログだけ抜き出したい時:時刻パターンで正規表現検索して別ファイルに切り出し。

複数サーバーのログから特定エラーコードだけ全件洗い出したい時/S /M でファイル名だけ列挙して対象を絞る。

🚀 実践コード

REM 複数キーワード同時検索(OR条件)でエラー・警告を一括抽出
findstr /I "error warning critical" server.log > filtered.txt

REM IPアドレスパターンを正規表現で抽出
findstr /R "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" access.log

REM バッチ内で検索結果の有無で分岐処理
findstr /I "fatal" app.log >nul 2>&1 && echo 致命的エラー検出 && exit /b 1

REM パイプと組み合わせてプロセス監視
tasklist | findstr /I "chrome.exe" || start chrome.exe

【ftype】:ファイルタイプと起動コマンドの紐付けを制御

ラボの視点 (Insight)
assocが拡張子→ファイルタイプの対応を決め、ftypeがファイルタイプ→実行コマンドの対応を決める。この2段階構造を理解しないと関連付け設定は破綻する。

項目内容
ftype全ファイルタイプと起動コマンドの一覧表示
ftype txtfile指定したファイルタイプの起動コマンド確認
ftype txtfile="C:\app.exe" "%1"txtfileに新しい実行コマンドを割り当て(%1はファイルパス)
ftype txtfile=ファイルタイプの関連付け削除(空文字を設定)

🛡 コマンドの要点と注意点

ファイルタイプは拡張子ではなくtxtfilehtmlfileといった中間識別子。GUIでの「既定のアプリ」変更では追えない深層の設定を直接編集可能。%1の記述ミスは関連付け機能不全を招く。管理者権限必須。ユーザー単位の関連付けはHKCUレジストリ側で管理されるため、システム全体設定と競合する場合がある。

🛠 現場のトラブル解決(一撃解決コマンド)

.txtを開くと変なアプリが起動する」原因を特定したい時assoc .txtでファイルタイプ確認後、ftype [取得した値]で実際の起動コマンドを検証。

バッチから特定アプリで強制起動させたい時ftype変更ではなく直接"C:\app.exe" "file.txt"と明示的に呼ぶ方が安全。システム設定を汚さない。

🚀 実践コード

REM 現在の.txt関連付け調査フロー
assoc .txt
ftype txtfile

REM Notepad++へ強制変更(管理者権限必須)
ftype txtfile="C:\Program Files\Notepad++\notepad++.exe" "%1"

REM 複数拡張子を同一アプリに統一
assoc .log=txtfile
assoc .ini=txtfile
ftype txtfile="C:\Tools\editor.exe" "%1"

REM 関連付け削除(デフォルトに戻す)
ftype txtfile=

【robocopy】:差分検知とリトライで確実に同期する業務用ファイルコピーツール

ラボの視点 (Insight)
/MIRの破壊力を理解せず本番で叩いて全消しする事故が後を絶たない。バックアップ先が空なら問答無用で本番も空にする。

項目内容
robocopy C:\Source D:\Backup /E /MT:16サブフォルダ全コピー、16スレッド並列で高速化。空フォルダも複製
robocopy C:\Data \\Server\Share /MIR /R:3 /W:5 /LOG:C:\log.txtミラーリング。リトライ3回・待機5秒・ログ出力で無人運用向き
robocopy C:\Work D:\Backup /E /XO /XD temp cache古いファイル除外、temp/cacheフォルダ無視の差分バックアップ
robocopy C:\Source D:\Dest /COPYALL /SEC /BACL・所有者・監査情報含む完全複製、バックアップモードで権限突破
robocopy C:\Data D:\Backup /MOV /Eファイル移動(コピー後に元を削除)、フォルダ構造維持

🛡 コマンドの要点と注意点

戻り値0〜7は正常、8以上がエラー。特に戻り値16はI/O異常で致命的。/MIRはコピー先の差分を削除するため、間違えると復旧不可。ネットワークコピーで/Zを使うと再開可能だがパフォーマンス低下。/MTはデフォルト8スレッドだが回線次第で輻輳を起こす。/IPG:nでパケット間隔制御が必要な現場も多い。

🛠 現場のトラブル解決(一撃解決コマンド)

「夜間バッチで差分バックアップを自動化したいが失敗を検知したい」 → /LOGでファイル出力し戻り値8以上をタスクスケジューラで監視。/R:0でリトライ無効化すれば即座に異常検知。

「NASへの大量コピーでネットワークが詰まる」 → /IPG:100で100ms間隔制御、/MT:4でスレッド抑制し帯域を調整。

🚀 実践コード

REM 本番環境の差分バックアップ(安全重視)
robocopy "C:\Production" "\\NAS\Backup\%date:~0,10%" /E /XO /COPYALL /R:2 /W:10 /MT:8 /LOG:"C:\Logs\backup_%date:~0,10%.log" /TEE
if %ERRORLEVEL% GEQ 8 echo ERROR: Backup failed with code %ERRORLEVEL% && exit /b 1

REM ミラーリング(破壊的操作・要検証)
robocopy "C:\Master" "D:\Mirror" /MIR /MT:16 /R:0 /W:0 /NFL /NDL /NP

REM アクセス権限含む完全移行(サーバー移設用)
robocopy "\\OldServer\Share" "\\NewServer\Share" /E /COPYALL /SEC /B /MT:4 /LOG:migration.log

【forfiles】:日付・パターン条件でファイル一括操作を自動化するコマンド

ラボの視点 (Insight)
古いログ削除やバックアップ整理を自動化するならこれ。PowerShellより軽量でタスクスケジューラーとの相性が良い。

項目内容
forfiles /P "C:\logs" /D -30 /C "cmd /c del @path"指定ディレクトリ内の30日より古いファイルを削除
forfiles /S /M *.log /D -7 /C "cmd /c echo @path"サブディレクトリ含めて7日以上前の.logファイルをリスト表示
forfiles /D +2024-01-01 /C "cmd /c move @file C:\archive"指定日以降に更新されたファイルをアーカイブへ移動
forfiles /M *.tmp /C "cmd /c if @fsize GTR 10485760 del @path"10MB超のtmpファイルを削除(@fsizeはバイト単位)

🛡 コマンドの要点と注意点

/D -Nは「N日以前」、/D +Nまたは/D YYYY-MM-DDは「指定日以降」を意味する。プレースホルダー@fileは引用符付きファイル名、@pathは引用符付きフルパス、@fnameは拡張子なしファイル名。削除系コマンドは必ずechoで対象ファイルを確認してから本番実行すること。システムディレクトリや重要データへの誤爆は取り返しがつかない。

🛠 現場のトラブル解決(一撃解決コマンド)

ディスク容量不足でアプリが動かない時、ログディレクトリの肥大化が原因ならforfiles /P "C:\inetpub\logs" /S /M *.log /D -90 /C "cmd /c del @path"で3ヶ月以前のIISログを一括削除。サブディレクトリ構造を持つログフォルダでも/Sで再帰処理。

🚀 実践コード

REM 本番実行前に必ず対象ファイルを確認
forfiles /P "D:\backup" /M *.bak /D -60 /C "cmd /c echo @path @fdate"

REM 確認後、60日以上前のバックアップを削除してディスク容量を確保
forfiles /P "D:\backup" /M *.bak /D -60 /C "cmd /c del /q @path"

REM ログファイルを日付付きでリネームして保存(月次処理向け)
forfiles /P "C:\app\logs" /M *.log /C "cmd /c ren @file @fname_%date:~0,4%%date:~5,2%%date:~8,2%.log"

REM 特定サイズ以上のダンプファイルだけ削除(100MB=104857600バイト)
forfiles /P "C:\dumps" /M *.dmp /C "cmd /c if @fsize GEQ 104857600 del @path"

ラボの視点 (Insight)
C:\直下の容量圧迫時、システムフォルダを別ドライブへ物理移動後にジャンクションで接続すればアプリの参照先変更は不要。SSDとHDDの混在環境で容量と速度の最適配置を実現する基本技術。

項目内容
mklink Link Targetファイルへのシンボリックリンクを作成。リンク先削除で即座に無効化
mklink /D Link Targetディレクトリのシンボリックリンク。相対パス使用可、ネットワークパス対応
mklink /H Link Targetハードリンク作成。同一ボリューム限定、元ファイル削除でもデータ残存
mklink /J Link Targetジャンクション作成。ローカルボリューム専用、古いOSでも動作する事実上の標準

🛡 コマンドの要点と注意点

シンボリックリンクは管理者権限必須だがジャンクションは不要。ハードリンクは削除時に全リンクが消えるまでディスク容量を消費し続ける。シンボリックリンクとジャンクションの削除はrmdirdelでリンクのみ削除、rd /S実行時はリンク先のデータまで消失するため絶対に注意。バックアップソフトがリンクをどう扱うか事前確認必須。

🛠 現場のトラブル解決(一撃解決コマンド)

C:\Program Files配下の巨大ゲームフォルダをD:\に退避させてシステムドライブ圧迫を回避:物理フォルダをrobocopyで移動後、元の位置にジャンクション作成でランチャーの再設定を回避。

複数プロジェクトで共通node_modulesを参照して数GB単位の重複を排除:中央リポジトリから各プロジェクトへディレクトリシンボリックリンク配置、更新は一箇所で完結。

🚀 実践コード

REM SteamゲームをD:\に移動してC:\容量確保
robocopy "C:\Program Files (x86)\Steam\steamapps\common\GameName" "D:\Games\GameName" /E /MOVE
mklink /J "C:\Program Files (x86)\Steam\steamapps\common\GameName" "D:\Games\GameName"

REM 開発環境で共通ライブラリを一元管理
mklink /D "C:\Projects\App1\lib" "D:\SharedLibs\common"
mklink /D "C:\Projects\App2\lib" "D:\SharedLibs\common"

REM ユーザーフォルダのDocumentsを大容量HDDへ移動
robocopy "%USERPROFILE%\Documents" "E:\MyDocuments" /E /MOVE /COPYALL
mklink /J "%USERPROFILE%\Documents" "E:\MyDocuments"

【replace】:指定ディレクトリ内の同名ファイルを一括置換する配布専用コマンド

ラボの視点 (Insight)
xcopyrobocopyと違い、既存ファイルの存在が前提。新旧混在環境へのパッチ配布で真価を発揮する。

項目内容
replace C:\src\*.dll C:\app\ /sC:\app配下の全サブディレクトリから同名dllのみを検索し上書き。存在しないファイルは無視
replace C:\update\config.ini C:\app\ /uタイムスタンプ比較で古いファイルのみ更新。差分適用に最適
replace C:\new\*.sys C:\Windows\System32\ /p /r読み取り専用含む置換を1件ずつ確認。システムファイル更新の安全弁
replace C:\patch\*.* C:\deploy\ /a宛先に存在しない新規ファイルのみ追加。既存ファイルは保護

🛡 コマンドの要点と注意点

宛先にファイルが存在しない場合は何もしない仕様。/aオプション使用時のみ新規追加可能だが、このモードでは既存ファイルを置換できない二律背反設計。タイムスタンプ判定の/uは秒単位で比較するため、コピーツールで複製したファイルには無効。バックアップ機能なし。

🛠 現場のトラブル解決(一撃解決コマンド)

複数拠点サーバーへ修正済み設定ファイルのみ配布したい時 replace \\share\patch\*.conf C:\service\config\ /s /u /pで各サーバーの古い設定だけ更新確認しながら置換。

社内アプリの緊急パッチDLLを全端末に強制適用する時 replace \\deploy\v1.2.3\*.dll "C:\Program Files\App\" /s /rでインストール先配下を総なめ。読み取り専用属性も突破。

🚀 実践コード

@echo off
rem 本番環境への差分デプロイ(古いファイルのみ置換+ログ出力)
replace \\build\release\bin\*.* D:\production\app\ /s /u > C:\deploy_log_%date:~-10,4%%date:~-5,2%%date:~-2,2%.txt 2>&1
if %errorlevel% equ 0 (echo Deployment successful) else (echo ERROR: Check log file)
# PowerShellからreplaceを制御して結果を構造化
$result = cmd /c "replace C:\update\*.exe C:\app\ /s /u 2>&1"
if ($LASTEXITCODE -eq 0) {
  $result | Out-File "C:\logs\replace_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
  Write-Host "Updated files: $($result.Count)"
}

【dir】:ディレクトリ内容の一覧表示と属性検索

ラボの視点 (Insight)
スクリプトでファイル存在確認や一覧取得する際、GUIより圧倒的に速い。/Bと組み合わせれば自動処理の入力リスト生成が一瞬で完了する。

項目内容
dir /S /B *.logカレント以下の全.logをフルパスで列挙。リダイレクトでリスト化
dir /A:H /O:D隠しファイルを日付順表示。不審ファイル調査の初動に
dir /T:A /O:-A最終アクセス日時の降順表示。監査・調査の足がかり
dir /Qファイル所有者表示。アクセス権トラブルの原因特定に

🛡 コマンドの要点と注意点

大量ファイル配下で /S を使うとI/O負荷で数分待たされることがある。ネットワークドライブ越しは特に遅延が目立つ。 /B はヘッダー無しの生データなので、パイプ処理やfor文でそのまま使える。 /A:H はシステム隠しファイルも拾うため、system32配下などは慎重に。

🛠 現場のトラブル解決(一撃解決コマンド)

特定拡張子の大量ファイルを別処理に渡したい時: dir /S /B C:\Logs\*.txt > list.txt でリスト化後、for /F で読み込み一括処理。

30日以上更新されていないファイルを洗い出す時: forfiles と組み合わせるが、まず dir /O:-D で日付の偏りを確認するのが早い。

🚀 実践コード

REM 隠しファイル含む一覧をサイズ降順で表示(必要に応じて more でページング)
dir /A /O:-S | more

REM サブフォルダ含む全.exeのフルパス一覧を生成(バッチ処理の入力用)
dir /S /B "C:\Program Files\*.exe" > exelist.txt

REM 最終アクセス日時でソートし、直近アクセスされたファイルを確認(不正調査)
dir /T:A /O:-A "C:\Users\%USERNAME%\Downloads"

【pushd】:ディレクトリ移動しつつ、戻り先をスタックに積むコマンド

ラボの視点 (Insight)
バッチで複数ディレクトリを跨ぐ処理をする際、cd だと戻り先の管理が面倒になる。pushd/popdならスタック管理で元の場所へ復帰できる。UNCパスでも一時ドライブが自動割当される点が強い。

項目内容
pushd C:\path\to\dir指定ディレクトリへ移動し、現在地をスタックに保存。popdで戻る
pushd \\server\shareUNCパスへ移動。一時ドライブを割当。popdで自動解除
pushd ..\temp相対パスで移動。保存は絶対パスとしてスタックに積まれる
pushd(引数なし)ディレクトリスタックを表示(環境によって挙動差あり)

🛡 コマンドの要点と注意点

pushd はLIFO(後入れ先出し)のスタックで履歴を管理する。3階層潜ったら popd も3回必要。 バッチ内で pushd したまま popd を忘れると、呼び出し元のカレントが意図せず変わる危険がある。 UNC利用時は Z: などが一時割当されるため、既存ドライブとの競合に注意。

🛠 現場のトラブル解決(一撃解決コマンド)

複数サーバーのログを順次確認したい時: pushd で共有へ移動 → 処理 → popd で作業ディレクトリへ復帰。ドライブ割当の手動管理が不要。

🚀 実践コード

@echo off
rem 複数プロジェクトのログを一括収集
pushd "C:\Projects\AppA\logs"
copy *.log "C:\CollectedLogs\"
popd

pushd "\\BuildServer\Share\AppB\logs"
copy *.log "C:\CollectedLogs\"
popd

pushd "D:\Archives\AppC\logs"
copy *.log "C:\CollectedLogs\"
popd

rem すべてのpopdが完了し、開始時の場所へ自動復帰
echo ログ収集完了
rem UNCパスの実践例(ネットワークドライブ自動割当)
pushd "\\FileServer\ProjectData"
dir /b > filelist.txt
popd

rem popd実行で一時ドライブも自動解除

🌐 ネットワーク診断・接続

【arp】:IPアドレスとMACアドレスの対応表を操作するコマンド

ラボの視点 (Insight)
ARP spoofingの痕跡発見、IP重複の原因特定、通信できない機器の切り分けに直結する。動的エントリは数分で消えるため、トラブル発生時は即座に叩け。

項目内容
arp -a現在キャッシュされているIP-MAC対応表を全表示。同一IPに複数MACがあれば異常
arp -d [IPアドレス]指定IPのキャッシュを削除し再解決を強制。通信不能時の最速リセット手段
arp -s [IP] [MAC]静的エントリを追加。ARPテーブル汚染攻撃の回避や特定機器との通信固定化
arp -a -N [インターフェースIP]複数NIC環境で特定インターフェースのARPテーブルのみ表示

🛡 コマンドの要点と注意点

ARPはレイヤー2の名前解決プロトコルで、同一セグメント内でのみ機能する。動的エントリは通信が発生した機器のみ記録され、未通信の機器は表示されない。静的エントリ(-s)は再起動で消えるため恒久的な設定にはnetsh使用が必要。管理者権限は削除・追加時のみ必須で、表示は一般ユーザーでも可能。

🛠 現場のトラブル解決(一撃解決コマンド)特定機器と通信できない時:arp -d 192.168.1.100 でキャッシュ削除後 ping 192.168.1.100 で再解決を実行。MACアドレスが表示されなければL2疎通問題。 IP重複の検出:arp -a | findstr ""動的"" で同一MACに複数IPが紐づく、または同一IPに複数MACがあれば重複または攻撃の可能性。

🚀 実践コード

REM ARP異常検出スクリプト:重複IPを自動検出
arp -a > arp_temp.txt
for /f "tokens=1" %%i in ('type arp_temp.txt ^| findstr /r "^  [0-9]" ^| sort') do @echo %%i | findstr /v "インターフェイス マルチキャスト"del arp_temp.txt
REM 静的エントリで通信固定(ゲートウェイ保護)
arp -s 192.168.1.1 00-11-22-33-44-55
arp -a 192.168.1.1
REM 全ARPキャッシュクリア後の再構築確認
arp -d & timeout /t 2 /nobreak & arp -a
# PowerShellでARP重複検出と出力整形
Get-NetNeighbor | Where-Object {$_.State -ne Unreachable} | Group-Object IPAddress | Where-Object {$_.Count -gt 1} | Select-Object Name, Count
# 特定サブネットのARP解決状態を監視
1..254 | ForEach-Object { ping -n 1 -w 100 192.168.1.$_ | Out-Null }; arp -a | Select-String 192.168.1

【ftp】:コマンドラインからFTPサーバーと直接ファイルを送受信

ラボの視点 (Insight)
2024年現在、平文通信のftpコマンドを使う現場は限られる。社内LAN限定のレガシー機器へのファームアップや、暗号化非対応の組み込み機器相手にのみ出番がある。

項目内容
ftp [hostname]対話モードでFTPサーバーに接続、手動でput/getコマンドを入力
ftp -s:script.txtスクリプトファイルから自動実行、深夜バッチ等で無人転送を実現
ftp -n -s:script.txt自動ログイン無効化、スクリプト内でuserコマンドによる認証制御が可能
ftp -A ftp.example.com匿名ログイン(anonymous)で公開FTPサーバーへ接続

🛡 コマンドの要点と注意点

FTPは全通信が平文のため、認証情報もファイル内容も盗聴可能。インターネット越しの利用は論外、社内LANでもVLAN分離された閉域環境推奨。スクリプトにパスワード記載は避けられないため、ファイルのACL設定とログ監査が必須。パッシブモード(quote PASV)未対応のファイアウォール環境ではポート21のみならず高位ポートの開放が必要。Windows 10以降は標準で無効化されているケースがあり、dism /online /Enable-Feature /FeatureName:TelnetClientで有効化が必要な場合も。

🛠 現場のトラブル解決(一撃解決コマンド)

ネットワークカメラやPLCへファームウェアを一括投入したい時
デバイスリストからIPを読み込み、同一スクリプトで順次接続・アップロードを自動化。

深夜帯にログを回収して即座に圧縮・退避したい時
mgetで一括取得後、forfilesと組み合わせて7日以前のファイルを自動削除。

🚀 実践コード

REM === スクリプトファイル例: deploy.txt ===
open 192.168.10.50
ftpuser
P@ssw0rd
binary
hash
cd /firmware
lcd C:\deploy
put device_fw_v2.bin
bye

REM === バッチファイルから実行 ===
@echo off
ftp -n -s:deploy.txt > deploy.log 2>&1
if %errorlevel% neq 0 (
  echo Transfer failed. Check deploy.log
  exit /b 1
)
echo Firmware deployed successfully.
REM === 複数サーバーから自動ログ回収 ===
@echo off
for /f "tokens=*" %%i in (servers.txt) do (
  echo Downloading from %%i...
  (
    echo open %%i
    echo loguser
    echo logpass
    echo lcd C:\collected_logs
    echo cd /var/log
    echo mget *.log
    echo bye
  ) > temp_script.txt
  ftp -n -s:temp_script.txt
)
del temp_script.txt
forfiles /p C:\collected_logs /m *.log /d -7 /c "cmd /c del @path"

【nfsadmin】:Windows上のNFSサーバー・クライアント設定を制御する専用コマンド

ラボの視点 (Insight)
UNIX/Linux混在環境でWindowsをNFSサーバーにする際の唯一の管理手段。GUI未対応の詳細パラメータはこれでしか触れない。

項目内容
nfsadmin server statusNFSサーバーの稼働状態とアクティブマウント数を即座に表示
nfsadmin client statusクライアント側のマウント状況とタイムアウト設定を確認
nfsadmin server config threads=16同時処理スレッド数を変更、高負荷環境でのレスポンス改善
nfsadmin client config timeout=60マウントタイムアウト値を秒単位で調整、WAN越えNFS接続の安定化
nfsadmin server stopNFSサーバーサービスを即座に停止、全クライアント接続を強制切断

🛡 コマンドの要点と注意点

Windows Server 2012以降は「Server for NFS」機能の有効化が前提。管理者権限必須。stop実行時は全マウントが即座に切断されるため、クライアント側でファイルI/O中の場合はデータ破損リスクあり。config変更後はサービス再起動が必要なケースが多く、設定反映にはnfsadmin server stopstartの実行を推奨。スレッド数やタイムアウト値の変更は負荷状況を監視しながら段階的に調整すべき。

🛠 現場のトラブル解決(一撃解決コマンド)

NFSマウントが頻繁にタイムアウトする場合:クライアント側でnfsadmin client config timeout=90 retries=5を実行し待機時間とリトライ回数を増やす。

サーバーが高負荷で応答遅延する場合nfsadmin server config threads=32でスレッドプールを拡張後、サービス再起動。

🚀 実践コード

# NFSサーバー状態確認と詳細設定の一括表示
nfsadmin server status
nfsadmin server config

# パフォーマンスチューニング(大規模ファイル共有環境向け)
nfsadmin server stop
nfsadmin server config threads=32 filehandle=128
nfsadmin server start

# クライアント側のタイムアウト調整(WAN環境)
nfsadmin client config timeout=120 retries=10 protocol=tcp

【NET】:Windows標準のネットワーク・権限・サービス統合管理コマンド

ラボの視点 (Insight)
PowerShellへの移行が叫ばれる現在も、バッチ互換性とリモート実行の軽さで現役。ドメイン環境ではNET GROUP /DOMAIN、ローカル管理ではNET LOCALGROUPの使い分けが基本。

項目内容
NET USERユーザーアカウント作成・削除・パスワード変更。/ADDで作成、/DELETEで削除
NET LOCALGROUP Administrators ユーザー名 /ADDローカル管理者権限付与。緊急時の権限昇格に即効
NET SHARE 共有名=パス /GRANT:Everyone,READ共有フォルダ作成と同時に権限設定。/GRANTで個別指定可能
NET USE Z: \\server\share /USER:domain\user passネットワークドライブマッピング。認証情報込みで自動化に最適
NET START/STOP サービス名サービス起動・停止。scコマンドより軽量で旧環境での互換性高
NET SESSION \\client /DELETEリモートセッション強制切断。ファイルロック解除時に使用
NET FILE共有ファイルの使用状況表示。ロック原因特定に必須
NET ACCOUNTS /MAXPWAGE:UNLIMITEDパスワードポリシー変更。検証環境での期限無効化に使用

🛡 コマンドの要点と注意点

管理者権限必須。ドメイン操作時は/DOMAINオプション必須だが、実行端末がドメイン参加していない場合はエラー。NET USERでのパスワード平文指定はセキュリティリスク大。バッチ内では%ERRORLEVEL%での戻り値チェック推奨。Windows 10以降はNET USEで資格情報マネージャーとの競合発生、/SAVECREDまたはcmdkey併用が安全。

🛠 現場のトラブル解決(一撃解決コマンド)

共有フォルダのロック原因を特定して強制切断したい時:NET FILEで該当ファイルIDを確認後、NET FILE ID番号 /CLOSEで即座に解放。セッションごと切りたい場合はNET SESSIONで接続元を確認し/DELETE実行。

🚀 実践コード

REM 【緊急用】ローカル管理者アカウント作成から権限付与までワンライナー
NET USER emergency P@ssw0rd123! /ADD && NET LOCALGROUP Administrators emergency /ADD

REM 【共有管理】読み取り専用共有を作成して特定ユーザーにフルアクセス
NET SHARE backup=D:\BackupData /GRANT:Everyone,READ && NET SHARE backup /GRANT:AdminUser,FULL

REM 【ロック解除】特定共有の全セッション切断(ファイルサーバーメンテ時)
FOR /F "tokens=2" %%i IN ('NET SESSION ^| FINDSTR "\\\"') DO NET SESSION %%i /DELETE

REM 【自動マウント】起動時にネットワークドライブを認証情報付きでマッピング
NET USE P: \\fileserver\projects /USER:DOMAIN\%USERNAME% * /PERSISTENT:YES

REM 【サービス再起動】IIS停止→待機→起動の確実な手順
NET STOP W3SVC && timeout /t 5 /nobreak >nul && NET START W3SVC

【getmac】:ローカル/リモートのMACアドレスを一発表示

ラボの視点 (Insight)
DHCPトラブル時のデバイス特定、MACフィルタリング設定、資産管理台帳との突き合わせ。ipconfigより速く、GUIより確実。

項目内容
getmac /v全アダプタのMAC・接続名・状態を詳細表示。無効化NICや仮想アダプタも列挙される
getmac /fo csv > mac_list.csvCSV出力で資産管理台帳への一括登録が可能。複数端末の棚卸しに有効
getmac /s <PC名> /u <ドメイン\ユーザ> /p <パスワード>リモート端末のMAC取得。Wake-on-LAN設定やネットワーク診断で物理アドレス確認に使用

🛡 コマンドの要点と注意点

MACアドレスは物理・仮想含む全NICを返すため、Wi-Fi/有線/Hyper-V/VPNアダプタが混在する。/vで接続名を確認しないと誤判別する。リモート実行は管理共有(C$)とRPCが開いている必要があり、ファイアウォールで弾かれやすい。パスワードは平文で履歴に残るため/p *でプロンプト入力推奨。

🛠 現場のトラブル解決(一撃解決コマンド)

MACアドレスフィルタに登録すべき物理NICだけ抽出したい時
getmac /v /fo csv | findstr /i "intel realtek"でベンダー名フィルタリング。仮想アダプタを除外できる。

🚀 実践コード

REM 全端末のMAC一覧をCSVで収集(ドメイン環境)
for /f %%i in (pc_list.txt) do getmac /s %%i /u domain\admin /p * /fo csv >> inventory.csv

REM 有効な物理NICのMACのみ抽出(切断系をざっくり除外)
getmac /v | findstr /v "切断 メディア は 検出"
# PowerShellでより高速かつ安全に取得
Get-NetAdapter |
  Where-Object { $_.Status -eq "Up" -and $_.Virtual -eq $false } |
  Select-Object Name, MacAddress, LinkSpeed

【hostname】:自機のホスト名を取得する最速コマンド

ラボの視点 (Insight)
スクリプトの分岐、ログの識別子、リモート作業中の現在地確認。1秒で終わる情報取得こそが自動化の起点。

項目内容
hostname現在のコンピューター名(NetBIOS名)を標準出力に表示
hostname > %TEMP%\host.txtホスト名をファイルに記録、複数端末の情報収集時に使用

🛡 コマンドの要点と注意点

Windowsのホスト名(NetBIOS名)を表示する読み取り専用コマンド。変更機能は持たない。FQDN(完全修飾ドメイン名)ではなく短縮名のみ返すため、ドメイン参加環境ではnslookupやipconfig /allで完全名を確認する必要がある。管理者権限不要で実行可能だが、名前解決の検証にはDNSサフィックスの確認が必須。

🛠 現場のトラブル解決(一撃解決コマンド)

リモートデスクトップで複数端末を行き来中、今どのマシンにいるか即座に確認したい時
タスクバー・エクスプローラーではなくコマンドで視覚的に表示する。

🚀 実践コード

hostname && echo ================================ && ipconfig | findstr IPv4
@echo off
for /f %%i in ('hostname') do set "HOST=%%i"
if "%HOST%"=="SRV-PROD-01" (
  echo 本番環境での操作です
  pause
) else (
  echo 開発環境: %HOST%
)

【irftp】:赤外線通信でファイルを送信する旧式転送コマンド

ラボの視点 (Insight)
現場で見かけることはほぼないが、工場の古い制御端末やレガシー医療機器とのファイル連携で突然必要になる。2024年時点では「動くか怪しい」レベルの遺物。

項目内容
irftp C:\path\to\file.txt指定ファイルを赤外線で送信。受信側が準備完了状態でないと失敗
irftp転送ウィザードをGUI起動。ファイル選択ダイアログが開く

🛡 コマンドの要点と注意点

赤外線ポート(IrDA)が両デバイスに物理的に存在し、ドライバが有効でなければ起動すらしない。Windows 10以降は標準でIrDAスタックが削除されており、実行してもエラーになる可能性が高い。通信は直線距離1m以内、障害物なし、最大速度4Mbps程度。USBやBluetoothが使えない環境での最終手段。

🛠 現場のトラブル解決(一撃解決コマンド)

古い産業機器からログファイルを抜き取りたいがUSBポートが壊れている時
赤外線ポートの存在確認→devmgmt.mscで「赤外線デバイス」が表示されるか確認。存在すればirftpでウィザード起動し手動選択が確実。

🚀 実践コード

rem 赤外線デバイスの有効化確認
devmgmt.msc

rem ファイル送信(受信側を先に待機状態にする)
irftp C:\logs\machine_error.log
# PowerShellから呼び出す場合(レガシーシステム対応)
if (Test-Path "C:\Windows\System32\irftp.exe") {
  Start-Process irftp -ArgumentList "C:\export\data.csv" -Wait
} else {
  Write-Host "IrDA非対応環境"
}

【netstat】:自マシンの全通信を可視化する診断コマンド

ラボの視点 (Insight)
プロセスと通信先を紐付けられない奴は侵入に気づけない。-anoが基本、PIDからタスクマネージャーで実体を追え。

項目内容
netstat -ano全接続をIP:Port+PIDで数値表示。名前解決待ちなし、最速
netstat -anob実行ファイル名まで表示。管理者権限必須だが犯人特定が一発
netstat -ano | findstr ESTABLISHED確立済み接続のみ抽出。通信中のセッションだけ見たい時
netstat -ano | findstr :443特定ポート(HTTPS等)の接続を絞り込み

🛡 コマンドの要点と注意点

-bは管理者権限が必須で処理も重い。通常調査は-anoで十分、PIDをtasklist /fi "PID eq 1234"で逆引きする方が速い。-nを付けないとDNS逆引きで数十秒待たされる。LISTENINGポートは外部から狙われる入口、不要なものは即座にサービス停止。

🛠 現場のトラブル解決(一撃解決コマンド)

不審な外部通信を検出したい時netstat -anob | findstr ESTABLISHEDで確立済み接続と実行ファイルを同時表示。見慣れないIPやプロセスがあれば即調査。
ポート競合でサービス起動失敗時netstat -ano | findstr :8080で該当ポート使用中のPIDを特定、taskkill /PID xxxx /Fで強制終了。

🚀 実践コード

REM マルウェア疑い時の初動調査(管理者権限)
netstat -anob | findstr /V "127.0.0.1 0.0.0.0" | findstr ESTABLISHED > active_connections.txt

REM PIDからプロセス詳細を一気に確認
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ESTABLISHED') do @tasklist /fi "PID eq %%a" /fo table /nh
# PowerShellで確立済み接続をプロセス名付きで表示
Get-NetTCPConnection |
  Where-Object State -eq "Established" |
  Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,
    @{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}

# 外部接続のみ、プロセス名でグループ化
Get-NetTCPConnection |
  Where-Object { $_.RemoteAddress -notmatch "^(127\.|::1|0\.0\.0\.0)" } |
  Group-Object OwningProcess |
  Select-Object Count,
    @{Name="Process";Expression={(Get-Process -Id $_.Name -ErrorAction SilentlyContinue).ProcessName}}

【nslookup】:DNSの名前解決を手動検証する診断コマンド

ラボの視点 (Insight)
pingが通らない時、原因がDNSか経路かの切り分けができないエンジニアは多い。nslookupは名前解決の検証を独立して行える唯一の標準ツール。

項目内容
nslookup example.comデフォルトDNSでホスト名→IPアドレス解決を実行
nslookup 192.168.1.1逆引き(PTRレコード)でIPアドレス→ホスト名を取得
nslookup example.com 8.8.8.8指定DNSサーバー経由で名前解決を試行、社内DNSと外部DNSの挙動比較に有効
nslookup -type=mx example.comメールサーバー(MXレコード)を確認、メール配信経路調査で使用
nslookup -type=ns example.com権威DNSサーバー(NSレコード)を表示、DNS委譲設定の検証用
nslookup → server 8.8.8.8対話モードでDNSサーバーを切り替え、複数サーバーの連続検証が可能

🛡 コマンドの要点と注意点

DNSキャッシュの影響を受けないリアルタイム検証が可能だが、クライアントPC自体のDNSキャッシュ(ipconfig /flushdnsで削除)は別管理。タイムアウトは「DNSサーバーが応答しない」か「該当レコードが存在しない」かで意味が異なる。Non-authoritative answerはキャッシュ応答を示し、権威サーバーへの直接問い合わせではない点に注意。

🛠 現場のトラブル解決(一撃解決コマンド)

特定サイトだけ繋がらない時の切り分け: nslookup 問題のドメイン 8.8.8.8で外部DNSでも解決できなければDNS設定問題、解決できればファイアウォールか経路障害。
内部DNSサーバーの故障判定: nslookup 内部ホスト名でタイムアウト→nslookup 内部ホスト名 DNSサーバーIPで直接指定して応答があればクライアント側DNS設定ミス。

🚀 実践コード

REM 社内DNSと外部DNSで同一ドメインの解決結果を比較
nslookup intranet.company.local
nslookup intranet.company.local 8.8.8.8

REM メールが届かない時のMXレコード確認
nslookup -type=mx target-domain.com

【qappsrv】:ネットワーク上のリモートデスクトップセッションホストを列挙

ラボの視点 (Insight)
複数のRDSHサーバーが混在する環境で「どこに繋げばいいか」を瞬時に把握するための索敵コマンド。古い環境ほど真価を発揮する。

項目内容
qappsrv現在のドメイン内で稼働中の全RDSHサーバー名を列挙
qappsrv /DOMAIN:domain.local指定ドメイン内のRDSHサーバーのみ抽出
qappsrv /ADDRESSサーバー名に加えてネットワークアドレス(IPX/SPX形式)も表示
qappsrv /CONTINUEページ区切りなしで全結果を一括出力

🛡 コマンドの要点と注意点

Windows Server 2008以前のターミナルサービス環境で設計されたレガシーコマンド。現代環境ではquery termserverGet-RDServerの方が推奨されるが、古いドメインやIPX/SPXネットワークが残存している場合は依然として有効。ドメイン参加していない端末からの実行は結果が返らない。管理者権限は不要だがネットワーク到達性とドメイン信頼関係が前提。

🚀 実践コード

@echo off
echo === 現在のドメイン内RDSHサーバー一覧 ===
qappsrv /CONTINUE

echo.
echo === 特定ドメイン内のサーバー(アドレス付き) ===
qappsrv /DOMAIN:corp.local /ADDRESS /CONTINUE

【rpcinfo】:RPCサービスの稼働状況とバージョンを列挙する診断コマンド

ラボの視点 (Insight)
NFSやNISといったUNIX系サービスとの相互運用時に必須。Windows環境では「NFS用サービス」をインストールしないと使えない点に注意。

項目内容
rpcinfo /p [host]指定ホスト(省略時はローカル)のポートマッパーに登録されたRPC一覧を表示
rpcinfo /t host program [version]TCPでの到達性確認。NFSサーバ(100003)やマウントデーモン(100005)の応答テストに直結
rpcinfo /u host program [version]UDP経由で同様の確認。古いNFS実装の診断に使用
rpcinfo /b program versionブロードキャストで同一セグメント内の応答ノードを発見

🛡 コマンドの要点と注意点

RPC通信の可視化とデバッグ専用ツール。主にUNIX/Linux混在環境でNFSマウントが失敗する際、portmap/rpcbindの動作確認とプログラム番号の整合性チェックに使う。Windows側では「NFS用サービス」機能が未インストールだとコマンド自体が存在しない。ファイアウォールでTCP/UDP 111番と動的割り当てポートが閉じられていると失敗する。

🚀 実践コード

:: リモートNFSサーバの稼働サービス全確認
rpcinfo /p 192.168.1.100

:: NFSv3マウントデーモンのTCP接続テスト(100005 v3)
rpcinfo /t 192.168.1.100 100005 3

【rpcping】:RPC通信の疎通確認とセキュリティ設定の検証ツール

ラボの視点 (Insight)
Active Directory環境、ファイル共有、リモートレジストリでRPC絡みのエラーが出たら真っ先に叩く。pingが通ってもRPCは死んでいるケースが山ほどある。

項目内容
rpcping /t ncacn_ip_tcp /s [サーバー名]RPCエンドポイントマッパー(135)への接続確認
rpcping /t ncacn_np /s [サーバー名]名前付きパイプ経由でのRPC通信テスト(SMB依存)
rpcping /t ncacn_ip_tcp /s [サーバー名] /e 1025特定ポートへのRPC通信確認(動的ポート範囲診断)
rpcping /t ncacn_ip_tcp /s [サーバー名] /u NTLM /a privacyNTLM認証+暗号化通信でのセキュリティ設定検証
rpcping /t ncacn_ip_tcp /s [サーバー名] /f [UUID],1 /i 10特定インターフェイス(UUID指定)へ連続疎通テスト

🛡 コマンドの要点と注意点

RPCは135番で開始後、動的ポート(49152-65535)で実データをやり取りする二段階構造。135が開いていても動的ポートが塞がれていればRPCは動かない。rpcpingはRPCハンドシェイクまで試行するため、portqry等より実態に近い診断ができる。認証レベル(/a)指定時はサーバー側ポリシーと一致しないと失敗する。

🚀 実践コード

REM ドメインコントローラーへのRPC診断(TCP + 名前付きパイプ)
rpcping /t ncacn_ip_tcp /s dc01.example.local /i 5
rpcping /t ncacn_np /s dc01.example.local /i 5

REM 動的ポート範囲の疎通確認(ファイアウォールルール検証用)
for /L %%p in (49152,1,49162) do @rpcping /t ncacn_ip_tcp /s remoteserver /e %%p

【telnet】:TCPポートの開閉と通信可否を瞬時に診断する接続試験ツール

ラボの視点 (Insight)
curlもncも無いWindows環境でポート疎通を確認できる数少ない標準ツール。セキュリティ云々より「このサーバーの443番ポート、本当に開いてんのか?」を3秒で判定できる価値。

項目内容
telnet [ホスト] [ポート]指定ホスト・ポートへのTCP接続試行(成功なら画面が黒転)
telnet smtp.example.com 25SMTP疎通確認。220応答が返れば稼働中
telnet [ホスト] 3389RDPポート開放確認
Ctrl+] → quittelnetセッションの終了

🛡 コマンドの要点と注意点

Windows 10/11では標準無効。機能の有効化が必須。接続成功時は画面が真っ黒になり何も表示されないが正常動作。応答がなければCtrl+]で抜ける。失敗時は即エラーが返るため、FW・ポート閉塞・サービス停止の切り分けができる。

🚀 実践コード

REM Telnetクライアント有効化(管理者権限)
dism /online /Enable-Feature /FeatureName:TelnetClient

REM HTTPSポート疎通確認
telnet www.google.com 443

【tlntadmn】:Windows Telnetサーバーの設定と接続セッション管理

ラボの視点 (Insight)
レガシー環境で動いているTelnetサーバーの生死確認と不正接続の切断が主戦場。今はSSH使え。

項目内容
tlntadmn configTelnetサーバーの現在設定(ポート、タイムアウト、最大接続数)を一覧表示
tlntadmn sessions接続中セッション一覧(接続元IP、セッションID、接続時間)
tlntadmn kill <SessionID>指定セッションIDのTelnet接続を強制切断
tlntadmn config maxconn=<数値>最大同時接続数を変更
tlntadmn config idle_timeout=<秒>無操作状態からの自動切断時間を設定

🚀 実践コード

REM 現在の接続状況を確認
tlntadmn sessions

REM 不正接続(セッションID 3)を強制切断
tlntadmn kill 3

REM アイドルタイムアウトを5分に設定
tlntadmn config idle_timeout=300

REM 最大接続数を2に制限
tlntadmn config maxconn=2

 【ipconfig】:TCP/IP設定の表示と強制更新

ラボの視点 (Insight)
DHCP環境で「なんか繋がらない」時の第一手。/allで設定ミスを暴き、release→renewで接続をリセット。DNS問題の8割は/flushdnsで片付く。

項目内容
ipconfig全アダプタのIP、サブネット、デフォルトゲートウェイを表示
ipconfig /allMAC、DHCP/DNSサーバー、リース期限まで全情報を出力
ipconfig /releaseDHCP割当IPを解放(切断状態になる)
ipconfig /renewDHCPから新規IPを再取得
ipconfig /flushdnsDNSリゾルバキャッシュを全削除
ipconfig /displaydnsキャッシュ済みDNSレコードを列挙
ipconfig /registerdns動的DNS登録を強制実行(AD環境向け)

🚀 実践コード

REM ネットワーク完全リセット(DNS+DHCP同時更新)
ipconfig /flushdns && ipconfig /release && ipconfig /renew

mstsc】:RDP接続を即座に起動・制御するWindowsリモートアクセスの起点

ラボの視点 (Insight)
GUIでポチポチやるのは時間の無駄。バッチで自動接続、RDPファイルの一括配布、セキュアモード強制が現場の正解。

項目内容
mstsc /v:192.168.1.100指定IPに直接RDP接続開始
mstsc /v:Server01 /admin管理用セッション接続(現行の/console相当)
mstsc /f /v:RemotePC全画面モード強制
mstsc /multimon /v:HostName全モニタへRDP画面展開
mstsc /edit connection.rdpRDPファイルを編集モードで起動
mstsc /restrictedadmin /v:DC01資格情報を接続先に残さない(用途制約あり)
mstsc /span /v:10.0.0.5複数モニタへ拡張表示
mstsc /shadow:2 /v:Server /controlセッションID2を監視・制御

🚀 実践コード

@echo off
set "SERVER_LIST=SRV01 SRV02 SRV03"
for %%S in (%SERVER_LIST%) do (
  start "" mstsc /v:%%S /f /admin
  timeout /t 2 /nobreak >nul
)
# RDPファイル動的生成(例)
$targets = @("10.1.1.10", "10.1.1.20")
foreach ($ip in $targets) {
  $rdp = @"
full address:s:$ip
prompt for credentials:i:1
administrative session:i:1
"@
  $path = Join-Path $env:TEMP "$ip.rdp"
  $rdp | Out-File -FilePath $path -Encoding ascii
  mstsc $path
}

 【ping】:指定ホストへの到達性とRTTを測定するICMP診断コマンド

ラボの視点 (Insight)
ネットワーク障害の切り分け第一手。L3到達性の有無だけ見ろ、応答時間は参考程度。

項目内容
ping 192.168.1.1デフォルト4回で疎通確認
ping example.com -t無限実行(Ctrl+Cで統計)
ping 8.8.8.8 -n 100100回送信で安定性と損失率を測定
ping example.com -l 1472MTU問題の切り分け
ping example.com -4IPv4強制

🚀 実践コード

ping 127.0.0.1 && ping 192.168.1.1 && ping 8.8.8.8 && ping google.com

 【prnport】:ネットワークプリンタのTCP/IPポート構成をCLIで完結させる

ラボの視点 (Insight)
GUIでポチポチやるプリンタポート設定を自動化する。複数拠点への展開やトラブル時の再設定はこれ一択。

項目内容
prnport -a -r "ポート名" -h IPアドレス -o raw標準TCP/IPポート作成(raw/9100が基本)
prnport -d -r "ポート名"指定ポートを削除
prnport -lローカルの全TCP/IPポート一覧
prnport -g -r "ポート名"特定ポートの詳細設定を出力
prnport -t -r "ポート名" -o lpr -n 515既存ポートのプロトコル変更
prnport -t -r "ポート名" -m e -y "public"SNMP有効化(監視用途)

🚀 実践コード

REM 標準的なポート作成
prnport -a -r "IP_192.168.10.50" -h 192.168.10.50 -n 9100 -o raw

REM IP変更時(削除→再作成)
prnport -d -r "IP_192.168.10.50"
prnport -a -r "IP_192.168.10.55" -h 192.168.10.55 -o raw
# 例:CSV一括投入(VBS版を呼ぶケース)
Import-Csv printers.csv | ForEach-Object {
  cscript C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnport.vbs -a -r "IP_$($_.IP)" -h $_.IP -o raw
}

⚙️ システム管理・トラブル修復

【ASSOC】:ファイル拡張子とファイルタイプの紐付けを確認・変更

ラボの視点 (Insight)
FTYPEと組み合わせて初めて完結する。ASSOCだけではプログラムパスは見えない。

項目内容
assocシステムに登録された全拡張子とファイルタイプの対応表を出力
assoc .txt指定拡張子の現在の関連付けを表示
assoc .log=txtfile.log拡張子をtxtfileタイプに変更(メモ帳で開くように)
assoc .bak=拡張子の関連付けを削除(ダブルクリックで開けなくなる)

🛡 コマンドの要点と注意点

ASSOCは拡張子→ファイルタイプIDの対応を管理するだけで、実行プログラムはFTYPEで定義される。レジストリのHKCR配下を直接操作するため、間違った設定はシステム全体に即座に反映される。管理者権限必須。バックアップなしで変更すると、特定拡張子のファイルが全て開けなくなるリスクあり。

🛠 現場のトラブル解決(一撃解決コマンド)「.txtファイルが突然別アプリで開くようになった」 → assoc .txt=txtfileで標準のメモ帳関連付けに復旧。 「特定拡張子の現在の実行プログラムをフルパスで確認」 → assoc .htmlで取得したファイルタイプをftype htmlfileに渡す。

🚀 実践コード

REM 現状確認と修復の定石
assoc .txt
ftype txtfile
REM .logファイルをメモ帳で開くように設定
assoc .log=txtfile
REM 複数拡張子の関連付けを一括確認
for %e in (.txt .log .ini .cfg) do @echo %e: & assoc %e
REM 誤った関連付けをバックアップから復元
assoc .html=htmlfile & ftype htmlfile="C:\Program Files\Internet Explorer\iexplore.exe" -nohome
# PowerShellで拡張子と実行プログラムを一気に確認
$ext = ".txt"
$type = (cmd /c assoc $ext).Split('=')[1]
cmd /c ftype $type

【bcdboot】:Windowsのブート環境を再構築する起動修復の最終兵器

ラボの視点 (Insight)
「Windowsが起動しない」という地獄から這い上がるための切り札。回復環境からの実行が9割。

項目内容
bcdboot C:\Windows /s S:システムパーティション(C:)からブートファイルをEFIシステムパーティション(S:)へコピーしてBCD再構成
bcdboot C:\Windows /l ja-jp日本語環境でブートマネージャーを再作成。回復環境で言語が英語になる問題を回避
bcdboot C:\Windows /s S: /f UEFIUEFI専用ブート環境を強制作成。BIOS/UEFI混在トラブル時に明示指定
bcdboot C:\Windows /s S: /f ALLBIOS・UEFI両対応のブート構成を作成。デュアルブート環境やクローン移行時に有効

🛡 コマンドの要点と注意点

BCDストアとブートローダーを一括で再構築するため、diskpartでボリューム番号を誤認すると別ドライブを破壊する。特にマルチドライブ環境ではlist volで対象を目視確認後に実行すること。UEFIシステムではFAT32の100MB程度のEFIパーティションが対象で、/s オプションで明示しないとカレントドライブに誤爆する。

🛠 現場のトラブル解決(一撃解決コマンド)

「SSD換装後に”Boot Device Not Found”で起動しない」 → 回復ドライブで起動後、diskpartでEFIパーティションにドライブレター割当、bcdbootで再構築。
「Windows Updateで”INACCESSIBLE_BOOT_DEVICE”が出る」 → WinREから既存BCDを削除後にbcdbootで再作成すれば修復。

🚀 実践コード

REM 回復環境(WinRE)からの典型的な修復手順
diskpart
list disk
select disk 0
list vol
REM EFIパーティション(通常100MB/FAT32)を特定
select vol 2
assign letter=S
exit
bcdboot C:\Windows /s S: /f UEFI /l ja-jp
# クローン後のUEFI起動修復(管理者権限)
$efi = Get-Partition | Where-Object {$_.GptType -eq '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}'}
$efi | Set-Partition -NewDriveLetter S
bcdboot C:\Windows /s S: /f UEFI /v

【chkntfs】:起動時の自動ディスクチェックを制御する設定コマンド

ラボの視点 (Insight)
chkdskは実行しない、chkdskの実行を「予約」するだけ。再起動ループの原因になるディスク修復処理を止めたい時の最終手段。

項目内容
chkntfs C:指定ドライブが次回起動時にチェック対象かを表示。dirty bitの状態確認に使う
chkntfs /X D:指定ドライブを起動時チェックから除外。外付けHDDや復旧中のディスクで有効
chkntfs /C C:次回起動時に強制チェックを予約。システム不安定時の事前対処
chkntfs /D全ドライブの除外設定をクリアしてデフォルトに戻す
chkntfs /T:30起動時のカウントダウンを30秒に延長。キャンセル猶予を確保

🛡 コマンドの要点と注意点

起動時の自動chkdskは「dirty bit」が立っている時のみ実行される。chkntfs /Xで除外しても、ファイルシステムの異常フラグ自体は消えないため根本解決にはならない。サーバー環境で起動時間を短縮したい場合や、チェックが原因で起動が止まる際の一時回避として使う。システムドライブ(C:)の除外は推奨しない。

🛠 現場のトラブル解決(一撃解決コマンド)

再起動のたびにchkdskが走って起動が遅い場合: まずchkntfs C:で対象確認後、問題なければchkdsk /F C:を手動実行してdirty bitをクリア。自動チェックの除外は対症療法。

外付けドライブが毎回チェックされる場合: chkntfs /X E:で除外設定。ただしUSB接続の不安定さが原因なら根本対処を優先。

🚀 実践コード

REM 全ドライブの自動チェック状態を確認
chkntfs C: D: E:

REM 外付けドライブを起動時チェックから除外
chkntfs /X E: /X F:

REM カウントダウンを60秒に延長して手動キャンセルの猶予を確保
chkntfs /T:60

REM システムドライブの次回起動時チェックを強制予約(修復前の事前対処)
chkntfs /C C:

【date】:システム日付を表示・変更するコマンド

ラボの視点 (Insight)
バッチ処理のログファイル名生成には使うな。環境変数%date%の罠と地域設定依存を理解していないと現場で事故る。

項目内容
date /t現在のシステム日付を表示のみ(プロンプト非表示)
date MM-DD-YYYYシステム日付を指定値に変更(管理者権限必須、地域設定で形式変動)

🛡 コマンドの要点と注意点

日付確認は単純だが、変更は影響範囲が広い。タスクスケジューラ、証明書検証、ログタイムスタンプ、ドメイン認証すべてに波及する。特にActive Directory参加環境では時刻ズレでKerberos認証が即座に失敗、業務停止リスクあり。地域設定(日本ならYYYY/MM/DD、米国ならMM/DD/YYYY)で入力形式が変わるため、スクリプト化は危険。%date%環境変数も同様に地域依存で、国際展開システムでは使えない。

🛠 現場のトラブル解決(一撃解決コマンド)

ライセンス検証のため一時的に日付を戻したい時:管理者権限で実行後、作業完了次第w32tm /resyncで時刻同期を即座に復元。放置厳禁。

ログファイル名に日付を使いたい時date /tは地域依存で信頼性ゼロ。PowerShellのGet-DateでISO8601形式固定が正解。

🚀 実践コード

# バッチ処理で地域設定に依存しない日付取得(推奨)
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$logfile = "backup_$timestamp.log"
# 出力例: backup_20241225_143022.log

# CMD環境でどうしても使う場合(WMIC経由で地域設定回避)
wmic os get localdatetime | findstr /v "LocalDateTime" > temp.txt
# 出力形式: 20241225143022.500000+540(固定フォーマット)
REM 日付変更の緊急対応例(管理者権限必須)
date 12-25-2024

REM 作業完了後は必ず時刻同期を実行
w32tm /resync /force

【mmc】:Windows管理ツールの統合フレームワーク起動

ラボの視点 (Insight)
散在する管理ツールを一元化する箱。カスタムコンソール作って保存しておけば作業時間が3割削れる。

項目内容
mmc空のコンソール起動。スナップイン追加で独自管理画面を構築
mmc compmgmt.mscコンピュータ管理(イベントログ/ディスク/サービスを統合)
mmc devmgmt.mscデバイスマネージャー起動
mmc eventvwr.mscイベントビューア単独起動
mmc gpedit.mscグループポリシーエディタ(Pro版以上)
mmc services.mscサービス管理画面
mmc compmgmt.msc /computer=PC01リモートPC「PC01」の管理コンソール接続
mmc C:\admin\custom.msc保存済みカスタムコンソール読込

🛡 コマンドの要点と注意点

MMCは管理ツール群の「入れ物」に過ぎず、実体はスナップインと呼ばれる各種.mscファイル。空コンソール起動後「ファイル→スナップインの追加と削除」から必要な管理機能だけ集約し.msc形式で保存すれば次回以降ワンクリック起動可能。リモート管理は対象PCでWMIとリモートレジストリサービスが稼働している必要あり。Home版ではgpedit.mscなど一部スナップイン使用不可。

🛠 現場のトラブル解決(一撃解決コマンド)

複数サーバーの定期監視用コンソールを作りたい時: 空mmcにイベントビューア/サービス/パフォーマンスモニターを追加し各々でリモート接続先を設定、monitor.mscとして保存すれば朝一で全サーバー状態確認完了。

🚀 実践コード

REM 管理者権限で実行
mmc

REM カスタムコンソール作成後の再利用
mmc "%USERPROFILE%\Desktop\daily_check.msc"

REM リモートサーバー管理(事前にWinRM設定済み前提)
mmc compmgmt.msc /computer=SVR-DB01
# 複数の.mscファイルを一括起動(朝の監視作業自動化)
$consoles = @('eventvwr.msc', 'services.msc', 'perfmon.msc')
$consoles | ForEach-Object { Start-Process mmc $_ }

# リモート接続確認後にMMC起動
if (Test-Connection -ComputerName SVR-WEB01 -Count 1 -Quiet) {
  mmc compmgmt.msc /computer=SVR-WEB01
}

【mode】:シリアルポート・コンソール画面の低レベル設定を直接叩くコマンド

ラボの視点 (Insight)
産業機器のシリアル接続や組み込み系デバッグで必須。GUIで触れない通信パラメータを即座に変更できる唯一の手段。

項目内容
mode COM1:9600,n,8,1シリアルポート通信設定(速度9600bps/パリティなし/8bit/1stop)
mode con: cols=120 lines=50コマンドプロンプト画面サイズ変更(横120文字×縦50行)
mode COM1指定ポートの現在設定を表示
mode con: rate=32 delay=0キーリピート速度を最速化

🛡 コマンドの要点と注意点

シリアル通信の設定不一致はデータ化けの直接原因。デバイス仕様書と1文字でも違えば通信不能になる。コンソール画面設定は現セッションのみ有効で、ウィンドウを閉じればリセット。バッチファイルに組み込んで自動化するのが定石。古いPLC・計測器・ネットワーク機器の保守では通信速度4800bps以下も現役で存在する。

🛠 現場のトラブル解決(一撃解決コマンド)

産業機器とのシリアル接続が応答しない時 → 相手機器の仕様書で通信設定を確認後、mode COM1:4800,e,7,1(偶数パリティ・7bit)等レガシー設定を試す。

ログ解析でコンソールが狭い時mode con: cols=200 lines=60で作業領域を拡大し視認性を向上。

🚀 実践コード

:: シリアルデバッグ環境の即座構築
mode COM3:115200,n,8,1
echo 通信開始 > COM3

:: バッチファイル用コンソール最適化
@echo off
mode con: cols=140 lines=50 rate=32 delay=0
color 0A
title システム監視コンソール

:: 複数ポートの設定状態を一括確認
for /L %%p in (1,1,8) do @mode COM%%p 2>nul | find "Baud"
# PowerShellからシリアルポート制御
cmd /c "mode COM4:9600,n,8,1"
$port = New-Object System.IO.Ports.SerialPort COM4,9600,None,8,One
$port.Open()
$port.WriteLine("AT")  # モデムコマンド送信例
$port.Close()

【msg】:Windows上のユーザーセッションにポップアップメッセージを送るコマンド

ラボの視点 (Insight)
RDPセッション管理とメンテナンス通知の要。ただしWindows 10 Home等では機能しない、Server/Pro/Enterprise環境専用ツール。

項目内容
msg * "メッセージ"ローカルマシンの全アクティブセッションにポップアップ送信
msg ユーザー名 /time:60 "内容"特定ユーザーに60秒間だけ表示されるメッセージ送信
msg /server:PC名 * "内容"リモートマシンの全ユーザーへメッセージ送信(要ネットワーク権限)
msg console "内容"コンソールセッション(セッションID=0)へ直接送信
query session現在のセッションID/ユーザー名を確認してから送信先指定

🛡 コマンドの要点と注意点

RDS環境やターミナルサービスで真価を発揮。送信先ユーザーが「切断」状態だとメッセージは届かず、エラーも返さない。ファイアウォールでRPC通信(TCP 135番)が塞がれていればリモート送信は不可。管理者権限必須で、グループポリシーでAllowRemoteRPCが無効化されている環境では動作しない。Windows 10 Homeにはmsg.exe自体が存在しない。

🛠 現場のトラブル解決(一撃解決コマンド)

再起動前に全ユーザーへ強制通知を送りたい時query sessionでアクティブセッション確認後、msg * /time:120 "3分後に再起動します"で2分間表示し、shutdown -r -t 180で連携。

RDP接続中のユーザーだけに警告したい時query session | find "rdp"でRDPセッションID特定→msg [セッションID] "切断します"で対象を絞る。

🚀 実践コード

@echo off
REM === メンテナンス通知の自動化スクリプト ===
echo [%date% %time%] メンテナンス通知開始 >> C:\logs\maintenance.log

REM アクティブセッションを確認
query session > nul 2>&1
if %errorlevel% neq 0 (
  echo セッション取得失敗 >> C:\logs\maintenance.log
  exit /b 1
)

REM 全ユーザーへ3段階通知
msg * /time:60 "[警告] 15分後にシステム再起動(1回目通知)"
timeout /t 300 /nobreak
msg * /time:90 "[警告] 10分後にシステム再起動(2回目通知)"
timeout /t 300 /nobreak
msg * /time:120 "[最終警告] 5分後に強制再起動(保存してください)"
timeout /t 240 /nobreak
msg * /w "60秒後に再起動します"
shutdown -r -t 60 -c "定期メンテナンスによる再起動"
# === RDPセッション監視と通知の自動化 ===
$sessions = quser 2>$null | Select-Object -Skip 1
foreach ($line in $sessions) {
  if ($line -match '^\s*(\S+)\s+(\S+)\s+(\d+)\s+(Active|Disc)') {
    $user = $matches[1]
    $sessionId = $matches[3]
    $state = $matches[4]
    if ($state -eq "Active") {
      msg $sessionId "あなたのセッションは監視されています [ID:$sessionId]"
      Write-Host "[$sessionId] $user へ送信完了"
    }
  }
}

【msiexec】:MSIパッケージの自動展開・管理を司る司令塔

ラボの視点 (Insight)
Windowsインストーラの直接制御。GUIを迂回してシステム展開を統制する。ログなしのサイレント運用は自殺行為。

項目内容
msiexec /i software.msi /qn /L*V C:\log.txtサイレントインストール+詳細ログ出力。本番展開の基本形
msiexec /x {ProductCode} /qnProduct GUID指定でアンインストール。MSIファイル不要
msiexec /fa software.msi全ファイル強制再インストール。破損修復の最終手段
msiexec /i software.msi INSTALLDIR="D:\Apps" /qnプロパティ渡しでインストール先変更。大量展開時の必須技
msiexec /jm software.msi /qn全ユーザー向けアドバタイズ。初回起動時に実体化

🛡 コマンドの要点と注意点

MSIパッケージはWindows Installerサービス経由で動作し、ロールバック・修復機能を持つ。/qn(完全サイレント)使用時は必ず/L*Vでログ採取、リターンコード0以外は失敗と判定せよ。インストール中は他のmsiexecプロセスと排他制御されるため同時実行不可。管理者権限必須だがUACプロンプトは出ないため権限不足エラーはログでしか追えない。Product Code(GUID)はwmic product getまたはレジストリHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallから特定。

🛠 現場のトラブル解決(一撃解決コマンド)

「展開失敗の原因を特定したい」/L*Vログで「return value 3」(エラーコード1603は権限、1618は別MSI実行中)を検索。「古いバージョンが残存して更新できない」wmic product where name="製品名" call uninstall /nointeractiveで完全削除後に再投入。

🚀 実践コード

REM 企業環境での標準展開テンプレート
msiexec /i "\\server\deploy\app.msi" ^
  INSTALLDIR="%ProgramFiles%\CompanyApp" ^
  ALLUSERS=1 ^
  REBOOT=ReallySuppress ^
  /qn /L*V "%TEMP%\app_install_%COMPUTERNAME%.log"
IF %ERRORLEVEL% NEQ 0 (
  echo Install failed with code %ERRORLEVEL% >> \\server\logs\failures.txt
  exit /b %ERRORLEVEL%
)
# Product Code一覧取得とバージョン監査
Get-WmiObject -Class Win32_Product |
  Select-Object Name, Version, IdentifyingNumber |
  Export-Csv C:\inventory.csv -NoTypeInformation

# 複数端末への強制アンインストール(リモート実行)
$targets = Get-Content servers.txt
Invoke-Command -ComputerName $targets -ScriptBlock {
  Start-Process msiexec.exe -ArgumentList "/x {12345678-1234-1234-1234-123456789012} /qn" -Wait
}

【msinfo32】:システム全情報を可視化する診断UI起動ツール

ラボの視点 (Insight)
サポート依頼時の「スペック教えて」に1コマンドで応答できる。GUIで見るかファイル出力かで使い分けろ。

項目内容
msinfo32システム情報ビューア起動。ハードウェア構成・ドライバ・起動時間まで一覧表示
msinfo32 /nfo "C:\sys.nfo"システム全情報をNFO形式で保存。msinfo32で再度開ける独自形式
msinfo32 /report "C:\sys.txt"テキスト形式で出力。メール添付や検索用途に適する
msinfo32 /categories +all /nfo "C:\full.nfo"全カテゴリ明示指定でエクスポート。念のため付ける癖をつけろ
msinfo32 /computer \\RemotePCリモートマシンの情報表示。WMI有効+管理者権限必須

🛡 コマンドの要点と注意点

systeminfoがCLIで基本情報を抽出するのに対し、msinfo32はGUIで階層的に詳細を掘れる。IRQ衝突・ドライバ署名状態・BIOSバージョンまで見える。NFO形式は他ツールで開けないためサポート窓口への提出時はreportオプションでテキスト化必須。リモート実行は対象PCでRemote Registryサービス起動とファイアウォール許可が前提条件。

🛠 現場のトラブル解決(一撃解決コマンド)

客先でハード障害疑惑が出た時msinfo32 /report "%USERPROFILE%\Desktop\sys_%COMPUTERNAME%.txt"でデスクトップに証跡保存し即座にメール添付。

複数台の構成監査時for /L %i in (1,1,50) do msinfo32 /computer PC%i /nfo \\server\audit\PC%i.nfoでバッチ収集。

🚀 実践コード

@echo off
REM トラブル時の標準情報収集セット
set LOGDIR=%USERPROFILE%\Desktop\SysLog_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
mkdir "%LOGDIR%"
msinfo32 /report "%LOGDIR%\msinfo32.txt"
systeminfo > "%LOGDIR%\systeminfo.txt"
wmic qfe list brief /format:table > "%LOGDIR%\updates.txt"
echo 情報収集完了: %LOGDIR%
explorer "%LOGDIR%"
# リモート複数台から一括収集(WinRM有効環境)
$targets = "PC01","PC02","PC03"
$targets | ForEach-Object {
  Invoke-Command -ComputerName $_ -ScriptBlock {
    msinfo32 /report "C:\Windows\Temp\sysinfo.txt"
    Get-Content "C:\Windows\Temp\sysinfo.txt"
  } | Out-File ".\$_`_sysinfo.txt"
}

【systeminfo】:OS・ハード構成・更新状況を一括で把握する基本診断コマンド

ラボの視点 (Insight)
「まず事実確認」を一発で済ませるコマンド。OSビルド、適用KB、ブート時刻、ドメイン参加などがまとまって出るので、障害切り分けの起点になる。

項目内容
systeminfoOS/CPU/メモリ/BIOS/ドメイン/KB/起動時刻などを総一覧で表示
systeminfo | more長い出力をページ送りで確認(ログ確認向け)
systeminfo | findstr /i "OS 名 OS バージョン システムの種類"OS名・ビルド・64bit等の要点だけを抽出
systeminfo | findstr /i "ホットフィックス"適用済みKB(Hotfix)の有無を確認(更新トラブルの事実確認)
systeminfo | findstr /i "システム起動日時"最終起動時刻を確認(再起動が効いているかの証拠)
systeminfo /fo csvCSV形式で出力(貼り付け・集計・比較が楽)
systeminfo /fo list項目ごとに縦並び表示(差分比較や読み取り向け)
systeminfo /s PC-NAME /u DOMAIN\user /p passwordリモートPCの情報取得(権限とFW/通信設定が前提)
systeminfo /s PC-NAME /u DOMAIN\user /p password /fo csvリモート結果をCSVで回収(台数が多い現場向け)

🛡 コマンドの要点と注意点

systeminfo はWMI(内部的にはWin32_*系)を参照するため、環境によっては取得に数十秒かかることがある。 また「ホットフィックス」の表示は、すべての更新が網羅されるとは限らない(例:表示されない累積更新がある)ため、 更新状態の最終確認は 設定 → Windows Update → 更新の履歴wmic qfe / Get-HotFix と突き合わせるのが安全。 リモート取得(/s)は、対象側のファイアウォール・RPC/WMI許可、認証、名前解決が揃っていないと失敗しやすい。 パスワードをコマンドに直書きする運用はログに残るリスクがあるので、運用ルールがある環境では避けたい。

🛠 現場のトラブル解決(一撃解決コマンド)

「本当に再起動した?」を一瞬で確かめたい: systeminfo | findstr /i "システム起動日時"(稼働時間の勘違いを潰せる)

OSビルドと64/32bitだけ先に知りたい: systeminfo | findstr /i "OS 名 OS バージョン システムの種類"

更新(KB)が入っているかだけ見たい: systeminfo | findstr /i "ホットフィックス" → 見つからない場合は履歴/別コマンドで再確認

🚀 実践コード

REM ▼最小セット:OSビルド・64bit/32bit・起動時刻だけ抜き出す
systeminfo | findstr /i "OS 名 OS バージョン システムの種類 システム起動日時"

REM ▼適用KB(ホットフィックス)だけ抽出してログ化(証拠提出用)
systeminfo | findstr /i "ホットフィックス" > "%USERPROFILE%\Desktop\hotfix_list.txt"

REM ▼全情報をCSVで保存(後で比較・集計しやすい)
systeminfo /fo csv > "%USERPROFILE%\Desktop\systeminfo_%COMPUTERNAME%.csv"

REM ▼リモートPCの情報取得(※権限・FW・名前解決が前提)
REM systeminfo /s PC-NAME /u DOMAIN\user /p password /fo csv > "%USERPROFILE%\Desktop\systeminfo_PC-NAME.csv"

【schtasks】:タスクスケジューラをCLIで完全制御するシステム自動化コマンド

ラボの視点 (Insight)
GUI操作の再現性のなさに困っている現場ほど刺さる。バッチ展開とリモート管理で真価を発揮。

項目内容
schtasks /create /tn "名前" /tr "実行パス" /sc daily /st 10:00毎日10時に指定プログラムを自動実行するタスク作成
schtasks /query /fo CSV /v > tasks.csv全タスクの詳細をCSVエクスポート、監査・棚卸に直結
schtasks /run /tn "タスク名"スケジュール待たずに即時実行、動作確認で多用
schtasks /delete /tn "タスク名" /f確認なしで削除、クリーンアップスクリプト向け
schtasks /change /tn "タスク名" /disableタスク削除せず無効化、トラブル時の一時停止に
schtasks /end /tn "タスク名"暴走タスクの緊急停止、/deleteと違いタスク定義は残る

🛡 コマンドの要点と注意点

タスクスケジューラのGUI操作は複数台展開で破綻する。schtasksは管理者権限必須だが、スクリプト化で数百台への一斉設定が可能。/tnでのタスク名指定ミスは即事故、本番環境では必ず/queryで存在確認してから/deleteや/changeを叩く。リモート実行は/s \\PC名 /u ユーザー /p パスワードで可能だが、平文パスワードがログに残るリスクを理解しておく。

🛠 現場のトラブル解決(一撃解決コマンド)

「特定ユーザーのタスクだけ抽出して監査したい」schtasks /query /fo LIST /v | findstr /i "ユーザー名"で該当タスクを即座に列挙。

「夜間バッチが動いたか履歴確認」schtasks /query /tn "タスク名" /fo LIST /v | findstr "最終実行時刻"で実行記録を瞬時取得。

🚀 実践コード

REM 複数サーバーへ同一タスク一括展開(サーバーリストservers.txt使用)
for /f %%s in (servers.txt) do schtasks /create /s %%s /tn "LogCleanup" /tr "C:\Scripts\cleanup.bat" /sc weekly /d SUN /st 02:00 /ru SYSTEM

REM 全タスクの実行状態を監視用に定期出力
schtasks /query /fo CSV /v | findstr /v "TaskName,準備完了" > C:\Logs\running_tasks_%date:~0,4%%date:~5,2%%date:~8,2%.csv

REM 失敗しているタスクだけ抽出(トラブルシューティング)
schtasks /query /fo LIST /v | findstr /c:"状態:" /c:"タスク名:"

【time】:システム時刻の表示と手動設定

ラボの視点 (Insight)
NTPサービスが動いている環境では使う理由がない。オフラインマシンやタイムゾーン変更前の確認専用。

項目内容
time現在のシステム時刻を表示し、Enterで変更をスキップ
time 14:30:0024時間表記で時刻を即座に変更(管理者権限必須)
echo %time%バッチファイル内で時刻を変数として取得(ログのタイムスタンプに使用)

🛡 コマンドの要点と注意点

時刻変更は証明書検証エラー、Kerberos認証失敗、スケジュールタスクの誤動作を引き起こす。Active Directory環境下では絶対に手動変更厳禁。NTPとの同期ずれが5分を超えるとドメイン認証が破綻する。仮想環境やスタンドアロン機でテスト時刻を固定する場合のみ使用価値がある。

🛠 現場のトラブル解決(一撃解決コマンド)

証明書エラーでインストーラが動かない時:システム時刻が2年以上ずれている旧型機で発生。timeで確認後、w32tm /resync /forceでNTP同期を試みる。オフライン機ならtime 15:45:00で手動修正後に再起動。

🚀 実践コード

REM バッチログにタイムスタンプを付与
echo [%date% %time%] バックアップ開始 >> backup.log

REM 時刻確認と変更を一発で(管理者権限)
time 09:00:00

REM NTP同期を強制実行してから時刻確認
w32tm /resync /force && timeout /t 3 && time /t

【taskkill】:プロセスを強制終了する(応答なし・暴走の切り札)

現場メモ
「応答なし」を待っても戻らないときは、最終的に /F が必要になる場面が多いです。/T は子プロセスまで巻き込むので、用途を選びます。

困りごと(よくある状況)コマンド補足
Chromeが固まって閉じないtaskkill /F /IM chrome.exe全インスタンス対象。未保存データがあるアプリは注意。
PIDが分かっていて、確実に止めたいtaskkill /F /PID 1234同名プロセス巻き込みを避けたいときに有効。
子プロセス含めてまとめて止めたいtaskkill /F /T /PID 1234ツリーごと終了。子側で作業中データを持つケースは要注意。
メモリを食い過ぎのプロセスを掃除したいtaskkill /F /FI "MEMUSAGE gt 500000"単位はKB。500000 ≒ 約500MB。
リモートPC上のプロセスを止めたいtaskkill /S remote-pc /U admin /IM app.exe環境により資格情報・権限・FWで詰まります。

🛡 コマンドの要点と注意点

/F なしは「終了要求」を出すだけで、応答しないプロセスには効かないことがあります。 /T はプロセスツリー全体を終了するため、子プロセス側で編集中データを持つアプリは影響が出やすいです。 システムプロセス(例:csrss.exe / winlogon.exe など)に対して実行すると、ブルースクリーンや再起動につながる可能性があります。

🛠 現場のトラブル解決(一撃解決コマンド)

「応答なし」を検出してから強制終了(まずは状況確認→必要なら終了)

tasklist /FI "STATUS eq Not Responding"

特定ユーザーのプロセスだけ狙って終了

taskkill /F /FI "USERNAME eq DOMAIN\user" /IM excel.exe

🚀 実践コード(cmd)

REM 応答なしプロセスがあれば強制終了(簡易版)
tasklist /FI "STATUS eq Not Responding" /FO CSV | findstr /V "INFO:" > nul
if %errorlevel%==0 (
  for /f "tokens=1 delims=," %%a in ('tasklist /FI "STATUS eq Not Responding" /FO CSV ^| findstr /V "イメージ"') do (
    taskkill /F /IM %%~a
  )
)

REM メモリ逼迫時の緊急対応(1000000KB ≒ 約1GB)
taskkill /F /FI "MEMUSAGE gt 1000000" /T

REM 開発環境の一括クリーンアップ(必要なものだけ残す)
taskkill /F /IM node.exe /T
taskkill /F /IM chrome.exe
taskkill /F /IM code.exe

🚀 実践コード(PowerShell)

# メモリ上限で絞って強制終了
Get-Process chrome | Where-Object { $_.WorkingSet -gt 500MB } | Stop-Process -Force

# 応答なし(ハング)だけを終了
Get-Process | Where-Object { $_.Responding -eq $false } | Stop-Process -Force

【DISM】:システムイメージを検査・修復する(更新失敗・破損の本丸)

現場メモ
sfc /scannow が効かないとき、修復元(コンポーネントストア)側が壊れていることがあります。そこを直すのがDISMです。

困りごとコマンド補足
まずは修復(オンライン)DISM /Online /Cleanup-Image /RestoreHealthWindows Updateから取得。通信できない環境は別手段へ。
破損の有無をしっかり調べたいDISM /Online /Cleanup-Image /ScanHealth時間がかかる。検査のみ。
記録された破損だけを高速確認DISM /Online /Cleanup-Image /CheckHealthスキャンはしない。判断の前段に。
.NET 3.5など機能追加を確実に行いたいDISM /Online /Enable-Feature /FeatureName:NetFx3GUIより確実。ただしソース指定が必要な場合あり。
WIMをマウントして事前カスタムしたいDISM /Mount-Wim /WimFile:C:\image.wim /Index:1 /MountDir:C:\mountオフラインイメージ整備向け。

🛡 コマンドの要点と注意点

DISMはコンポーネントストア(修復元)を整えるツールで、SFCより上流にいます。 /RestoreHealth は10〜30分以上かかることがあり、実行中は中断しないのが安全です。 企業環境ではWSUSやプロキシ、ローカルソース指定が必要になることがあります。

🛠 現場のトラブル解決(一撃解決コマンド)

基本は「DISM → SFC」の二段構え

DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow

オフライン環境(インストールメディアから修復元を指定)

DISM /Online /Cleanup-Image /RestoreHealth /Source:D:\sources\install.wim:1 /LimitAccess

.NET Framework 3.5を強制有効化(旧アプリ対策)

DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:D:\sources\sxs

ログに残して後で見返す

DISM /Online /Cleanup-Image /ScanHealth > C:\dism_scan.log

【gpupdate】:グループポリシーを今すぐ反映する(反映待ちを短縮)

現場メモ
「配布したのに効かない」を切り分ける最短手。適用結果は gpresult で確認までセットにします。

困りごとコマンド補足
とにかく全部再適用(競合解消)gpupdate /forceトラフィック増。大規模環境で一斉実行は避けたい。
PC側だけ更新(必要なら再起動)gpupdate /target:computer /boot管理者権限が必要なことが多い。
ユーザー側だけ更新(必要ならログオフ)gpupdate /target:user /logoffユーザー影響が出るので実行タイミング注意。
待たずに制御を返してスクリプト継続gpupdate /wait:0ログオンスクリプト等で便利。

🛡 コマンドの要点と注意点

ドメイン参加が前提です(ローカルのみのPCでは意味が薄いです)。 /force は全ポリシーを再取得するため、DC負荷と通信量が増えます。 ネットワーク断だと当然失敗し、期待した更新が入らないことがあります。結果確認は gpresult とセットが安全です。

🛠 現場のトラブル解決(一撃解決コマンド)

更新→結果確認まで一気に

gpupdate /force && gpresult /r

ユーザー側だけ効かないときの切り分け

gpupdate /target:user /force
gpresult /user %username% /v

【logoff】:ユーザーセッションを終了する(RDSの放置セッション整理)

現場メモ
「誰が掴んでるか」を quser で確認してから logoff。この順番が事故を減らします。

困りごとコマンド補足
自分のセッションを即ログオフlogoff未保存作業は消えます。
特定セッションIDを終了logoff 3実行前に必ずID確認。
リモートサーバー上のセッションを終了logoff 2 /server:RDS-SRV01管理者権限が必要。

🛡 コマンドの要点と注意点

shutdown が「OSごと落とす」のに対し、logoff は「ユーザー単位」です。 切断(Disconnected)とログオフは別物で、logoff はセッションを完全終了します。 マルチユーザー環境では誤爆が業務停止につながるので、まず quser で確認するのが鉄則です。

🚀 実践コード

REM 状況確認 → ID指定で終了
quser
logoff 3

REM リモートサーバーのセッション終了
logoff 2 /server:RDS-SRV01
# Disconnected状態のセッションをまとめて終了(PowerShell)
quser | Select-String "Disc" | ForEach-Object {
  $id = ($_ -split '\s+')[2]
  logoff $id
}

# 特定ユーザーのセッションを終了
$target = "testuser"
$session = ((quser | Select-String $target) -split '\s+')[2]
logoff $session

【nlbmgr】:Windows NLB(ネットワーク負荷分散)クラスタ管理GUIを起動する

現場メモ
NLBはPowerShellへ移行が進んでも、管理はGUI(NLB Manager)が残りがちです。実務では wlbs と併用して「状態確認→安全に切り離し→作業」の順番で回します。

困りごとコマンド補足
NLBの管理画面を開きたいnlbmgrクラスタ構成・ルール確認・ノード操作をGUIで実行。
各ノードの稼働状態を即確認したいwlbs queryスクリプト化・定期監視に向く。
メンテのためノードを止めたいwlbs stop新規も既存も止まりやすい。影響大。
既存セッションを保ちつつ切り離したいwlbs drainstop安全な切り離しの基本。作業前の第一手。

🛡 コマンドの要点と注意点

本番での設定変更は、いきなり全体へ当てると通信断や瞬断が起こることがあります。変更前に drainstop で対象ノードを安全に切り離してから作業するのが無難です。 ユニキャスト/マルチキャストの選択はスイッチ側の制約に影響するため、ネットワーク側との事前確認が必要になることがあります。

🛠 現場のトラブル解決(一撃解決コマンド)

「特定ノードだけ応答しない」→ 状態確認して復帰

wlbs query
wlbs start 192.168.1.101

🚀 実践コード

REM クラスタ全体の稼働状態を確認
wlbs query

REM 特定ホストを安全に切り離し(メンテナンス)
wlbs drainstop 192.168.1.101

REM メンテ後に復帰
wlbs start 192.168.1.101

REM ポートルール等の表示(検証)
wlbs display
# PowerShellでNLBノード状態を一覧(NLBモジュールが使える環境)
Get-NlbClusterNode | Select-Object Name, State | Format-Table -AutoSize

# 緊急時:特定ノードを安全に除外
Stop-NlbClusterNode -HostName "Server01" -Drain

【perfmon】:リソース可視化と診断レポート生成(根拠を残す)

現場メモ
本命は /report。60秒で「レポート(証跡)」が残るので、曖昧な重さ報告の切り分けが一気に進みます。

困りごとコマンド補足
GUIで性能カウンターを見たいperfmon基本のパフォーマンスモニター。
短時間で診断レポートを作りたいperfmon /report60秒診断+HTMLレポート。管理者権限が必要なことあり。
プロセス別の負荷を見たいperfmon /resリソースモニター起動。
安定性の履歴(クラッシュ傾向)を見たいperfmon /rel信頼性モニターを開く。

🛡 コマンドの要点と注意点

/report 実行中は一時的にディスクI/Oが増えることがあります。常時監視より「障害が出た瞬間」「定期点検」など、使いどころを絞るのが安全です。 HTMLレポートは共有・保存に向いているので、問い合わせ対応の証跡にも使えます。

🛠 現場のトラブル解決(一撃解決コマンド)

「なんか重い」→ まずレポートを取って根拠を作る

perfmon /report

🚀 実践コード

REM レポート生成(成功/失敗を分岐)
perfmon /report > nul && echo レポート生成完了 || echo 管理者権限で再実行
# 取得後にCPU上位をさっと確認(補助)
perfmon /report
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name,CPU,WS

【powercfg】:電源設定の診断と制御(スリープ阻害・勝手に復帰の犯人探し)

現場メモ
GUIでは見えない「スリープを邪魔している要因」が出ます。まず /requests、次に /lastwake の順が事故りにくいです。

困りごとコマンド補足
スリープ阻害要因を知りたいpowercfg /requestsプロセス/ドライバ/タイマーを列挙。
直前のスリープ解除原因を知りたいpowercfg /lastwake勝手に起きる原因特定に強い。
解除可能デバイス一覧が欲しいpowercfg /devicequery wake_armedデバイス名の正確な確認用。
特定デバイスの解除を止めたいpowercfg /devicedisablewake "デバイス名"完全一致が必要。
バッテリー劣化を数値で見たいpowercfg /batteryreportHTML出力。
省電力の問題点を洗い出したいpowercfg /energy短時間の分析レポート生成。
Modern Standbyの履歴を見たいpowercfg /sleepstudy対応機のみ。

🛡 コマンドの要点と注意点

管理者権限が必要な項目があります。レポート系(/batteryreport / /energy)はHTMLを生成するので、保存場所を明示すると後で探す手間が減ります。 デバイス名指定は一致が必要なため、先に /devicequery で正確な文字列を控えるのが安全です。

🛠 現場のトラブル解決(一撃解決コマンド)

「勝手に起動する」→ 犯人特定→封じる

powercfg /lastwake
powercfg /devicequery wake_armed

🚀 実践コード

REM スリープ阻害の完全診断
powercfg /requests
powercfg /devicequery wake_armed
powercfg /lastwake

REM 例:マウス・キーボード・NICの解除を無効化(名称は環境で異なる)
powercfg /devicedisablewake "HID-compliant mouse"
powercfg /devicedisablewake "HID Keyboard Device"
powercfg /devicedisablewake "Intel(R) Ethernet Connection"

REM バッテリー診断(デスクトップ保存)
powercfg /batteryreport /output "%USERPROFILE%\Desktop\battery-report.html"
start "" "%USERPROFILE%\Desktop\battery-report.html"

【print】:テキストをプリンタへ投げる(GUI不可・バッチ向けの最終手段)

現場メモ
できるならPowerShellの Out-Printer が安定です。print は「どうしてもCLIだけで」や「古い運用資産が残っている」時に使われがちです。

困りごとコマンド補足
デフォルトプリンタへ印刷print filepath.txtテキスト限定。
ネットワークプリンタを指定して印刷print /d:\\server\printer filepath.txtUNCパスが必要。
旧式機器(LPT)へ送信print /d:LPT1 file.txt環境依存が強い。

🛡 コマンドの要点と注意点

PDFや画像は対象外です(テキストのみ)。フォーマットや文字化けが出やすいので、帳票用途は避けた方が安全です。 ネットワークプリンタ指定はパス表記ミスで即エラーになるので、共有名の確認が先です。

🛠 現場のトラブル解決(一撃解決コマンド)

「毎日ログを紙で出したい」→ タスクでテキストだけ印刷

🚀 実践コード

REM 当日生成されたログを全て印刷(ネットワークプリンタ指定例)
for /f "tokens=* " %%i in ('dir /b /o-d C:\Logs\*.txt ^| findstr /r "^%date:~0,10%"') do (
  print /d:\\printserver\HP-LaserJet C:\Logs\%%i
)

REM プリンタ一覧(調査用)
wmic printer get name,sharename
# PowerShellならこちらが本命
Get-Content C:\Reports\daily.txt | Out-Printer -Name "\\printserver\Canon-MF"

# 複数ファイル一括投入
Get-ChildItem C:\Logs\*.txt | ForEach-Object {
  Get-Content $_.FullName | Out-Printer -Name "デフォルトプリンタ名"
}

【prnjobs】:印刷キューの一覧・停止・削除(頑固なジョブ対策)

現場メモ
まず -l で一覧→ID確認→-X で削除。いきなり削除すると誤爆しやすいので順番が大事です。

困りごとコマンド補足
プリンタのジョブ一覧を出したいprnjobs -p "PrinterName" -lIDを必ず控える。
特定ジョブを削除したいprnjobs -p "PrinterName" -j 342 -X誤ったID指定に注意。
一時停止/再開したいprnjobs -p "PrinterName" -j 342 -Z / -M保留→復帰。
リモート端末のキューを見たいprnjobs -s \\RemotePC -p "PrinterName" -l権限・FW・資格情報で詰まりやすい。

🛡 コマンドの要点と注意点

管理者権限が必要な場面があります。プリンタ名は共有名やUNCで正確に指定が必要です。 削除操作は他ユーザーの印刷も消せるため、必ず一覧でIDを確認してから実行します。

🛠 現場のトラブル解決(一撃解決コマンド)

「エラーで詰まって印刷が進まない」→ 一覧→該当IDを削除

prnjobs -p "Canon_Office" -l
prnjobs -p "Canon_Office" -j 342 -X

🚀 実践コード

REM ローカルプリンタのキュー確認と削除
prnjobs -p "Canon_Office" -l
prnjobs -p "Canon_Office" -j 342 -X
# リモートプリンタの詰まりジョブを一括削除(例:VBSの出力を解析)
$printer = "\\PrintServer\HP_Floor3"
$jobs = cscript //nologo C:\Windows\System32\Printing_Admin_Scripts\ja-JP\prnjobs.vbs -l -p $printer |
  Select-String "ジョブ ID" | ForEach-Object { (($_ -split ":")[1]).Trim() }

foreach ($id in $jobs) { prnjobs -p $printer -j $id -X }

【prnmngr】:プリンター追加・削除・既定設定(キッティング/ログオンスクリプト向け)

現場メモ
ドライバ名が一致しないと失敗しがちです。まず -l で状況確認、追加前にドライバ名(-m)の正確な表記を揃えるのがコツです。

困りごとコマンド補足
接続済みプリンター一覧を出したいprnmngr -l誤削除防止の前確認。
プリンターを追加したいprnmngr -a -p "名前" -r "ポート" -m "ドライバ名"ドライバは事前導入が必要。
既定プリンターを変更したいprnmngr -t -p "プリンター名"ユーザー環境の統一に。
不要プリンターを削除したいprnmngr -d -p "プリンター名"名前の一致が重要。
リモート端末を確認したいprnmngr -s \\PC名 -l -u 管理者 -w パスワード権限・FW・Remote Registry要件あり。

🛡 コマンドの要点と注意点

追加は「ドライバ名」が鬼門です。OSに登録済みのドライバ名を正確に指定しないと失敗します。 リモート操作は環境要件(権限、FW、サービス)が揃っていないと詰まりやすいので、まずローカルで成功させてから展開するのが安全です。

🛠 現場のトラブル解決(一撃解決コマンド)

「新PCに標準プリンタを一発で入れたい」→ 追加→既定→確認

🚀 実践コード

REM 追加→既定→確認(配布用)
prnmngr -a -p "営業部_Canon" -r "IP_192.168.1.100" -m "Canon Generic Plus PCL6"
prnmngr -t -p "営業部_Canon"
prnmngr -l
# リモート端末のプリンター状況を確認(例)
$pcs = @("PC01","PC02","PC03")
foreach ($pc in $pcs) {
  Write-Host "=== $pc ==="
  prnmngr -s \\$pc -l
}

【query】:RDSセッションとユーザー状態を可視化する(誰が掴んでるか即判定)

現場メモ
「ライセンス足りない/誰かが掴んでる」系は、まず quser。必要ならIDを logoff に渡して解放します。

困りごとコマンド補足
全セッションの状態を見たいquery sessionActive/Disc とIDが取れる。
ユーザー単位で詳細を見たいquery user / quserアイドル時間が重要な手がかり。
特定セッションのプロセスを見たいquery process /ID:3CPU食いの特定へ。
リモートサーバーの状況を見たいquery session /SERVER:RDS01権限・FW要件あり。

🛡 コマンドの要点と注意点

クライアントOSでは表示が限定的なことがあります。リモート指定は権限とFW(RPC系)で詰まりやすいので、通らない場合は「資格情報」「FW」「名前解決」を疑うのが早いです。 IDを使って logoff する場合、作業中ユーザーの未保存データが失われる可能性があります。

🛠 現場のトラブル解決(一撃解決コマンド)

「誰かが占有してる」→ Disc/Idleを見て解放

quser
query session

🚀 実践コード

REM 全セッション状態とユーザーを確認
query session

REM Disconnectedを抽出(目視用)
quser | findstr "Disc"

REM セッションID 3のプロセスを確認
query process /ID:3
tasklist /FI "SESSION eq 3" /FI "MEMUSAGE gt 500000"

REM リモートサーバーの全ユーザー状況
quser /SERVER:RDS01

REM Disconnectedセッションを一括ログオフ(要管理者権限)
for /f "skip=1 tokens=3" %i in ('query session ^| findstr "Disc"') do logoff %i

【reg / regini】:レジストリを読み書きする(GUI不要・配布と自動化向け)

現場メモ
regは「単発の追加・確認・export/import」が強いです。reginiは「権限(ACL)も含めて作る」寄りで、触りどころを間違えると復旧が面倒です。

困りごとコマンド補足
キー配下の値を一覧したいreg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersionパイプ処理しやすい。
値を追加/上書きしたいreg add HKCU\Software\MyApp /v Setting /t REG_DWORD /d 1 /f/fで確認スキップ。
バックアップ(.reg)を作りたいreg export HKLM\SYSTEM C:\backup.regキー単位の切り出し。
.regを一括適用したいreg import C:\settings.reg展開に向く。
値を削除したいreg delete HKCU\Software\MyApp /v OldSetting /f誤爆防止に事前確認推奨。
ACL含めて構造を作りたいregini C:\config.txt誤設定でロックする危険あり。
リモートに適用したいregini /m \\PC01 C:\deploy.txt権限・FW・環境要件あり。

🛡 コマンドの要点と注意点

HKLM配下の変更は管理者権限が必要なことが多く、ミスると起動不能にもつながります。exportしてから触る、が保険になります。 reginiは強力ですが、権限ミスでキーが開けなくなることがあるので、対象は絞って慎重に扱う方が安全です。

🛠 現場のトラブル解決(一撃解決コマンド)

「設定を全端末へ展開」→ exportで雛形→ importで配布

🚀 実践コード

REM 特定ソフトの情報検索(例)
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s /f "DisplayName" | findstr /i "Chrome"

REM 日付付きでバックアップ(簡易)
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do set DATE=%%a%%b%%c
reg export HKLM\SOFTWARE\Policies C:\Backup\Policies_%DATE%.reg

REM リモートの値を変更(例:環境要件あり)
reg add "\\RemotePC\HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" /v ClearPageFileAtShutdown /t REG_DWORD /d 1 /f

REM reginiでACL設定(例:テキスト雛形)
echo HKEY_LOCAL_MACHINE\SOFTWARE\MyApp [1 17] > C:\acl.txt
regini C:\acl.txt
# 差分を見る(例:簡易比較)
reg export HKCU\Software\Test C:\before.reg
Start-Process "notepad.exe" -Wait
reg export HKCU\Software\Test C:\after.reg
Compare-Object (Get-Content C:\before.reg) (Get-Content C:\after.reg)

# 複数マシンへ展開(例)
$servers = @("SRV01","SRV02","SRV03")
$servers | ForEach-Object { reg add "\\$_\HKLM\SOFTWARE\MyConfig" /v Enabled /t REG_DWORD /d 1 /f }

【sc.exe】:Windowsサービスを制御・構成する(停止/起動/無効化/削除)

現場メモ
表示名ではなく「サービス名(内部名)」を叩くのが鉄則です。まず sc querysc qc で確認してから触ると事故が減ります。

困りごとコマンド補足
状態とPIDを確認したいsc query wuauserv稼働状態の事実確認に。
起動種別を変更したいsc config wuauserv start=delayed-auto等号の後にスペースが必要。
起動/停止したいsc start wuauserv / sc stop wuauservnet startより確実な場面あり。
詳細構成(依存関係など)を見たいsc qc wuauserv依存の把握が重要。
リモートのサービスを確認したいsc \\RemoteServer query Spooler権限・FW要件あり。
サービスを削除したいsc delete ServiceName復旧が面倒。慎重に。

🛡 コマンドの要点と注意点

sc.exeはサービス定義(レジストリ)を直接扱います。サービス名の指定ミスが致命傷になり得るので、必ず sc qc で「対象が合っている」事実確認をしてから操作します。 削除は即反映され、依存関係次第では起動に影響が出る可能性があります。

🛠 現場のトラブル解決(一撃解決コマンド)

「止まっているサービスだけ見たい」→ inactive抽出

sc query state=inactive | findstr "SERVICE_NAME"

🚀 実践コード

REM 停止中サービスのみ抽出
sc query state=inactive | findstr "SERVICE_NAME"

REM サービス詳細を確認
sc qc wuauserv

REM 再起動(例)
sc stop Spooler
timeout /t 3
sc start Spooler

REM リモートで再起動(例:環境要件あり)
sc \\RemoteServer stop Spooler
timeout /t 3
sc \\RemoteServer start Spooler

REM 遅延自動起動へ(負荷分散)
sc config wuauserv start=delayed-auto
# 複数サーバーの状態を一括確認(例)
"Server1","Server2","Server3" | ForEach-Object { sc.exe \\$_ query W32Time }

【shutdown】:ローカル/リモートの電源状態を制御する(再起動・停止・中止)

現場メモ
リモート一斉再起動に使われがちですが、誤爆したときの保険は /a(中止)です。まず「中止できる状態か」を意識すると安心です。

困りごとコマンド補足
即再起動(強制)したいshutdown /r /t 0 /f未保存データ消失の可能性。
リモートを停止したい(猶予あり)shutdown /s /m \\PC /t 60 /c "理由"権限・FW要件あり。
実行中のシャットダウンを止めたいshutdown /a誤爆救済。
再起動後に登録アプリを再起動したいshutdown /g /t 0用途は限定的。
休止状態へ移行したいshutdown /h休止が有効な環境のみ。

🛡 コマンドの要点と注意点

/f はアプリ強制終了のため未保存データが失われる可能性があります。 リモート操作は権限とFW例外(RPC系)が揃っていないと失敗します。 監査や運用記録が必要なら /c(コメント)や /d(理由コード)を付けると後で追いやすいです。

🛠 現場のトラブル解決(一撃解決コマンド)

「複数台をまとめて再起動したい」→ リストで一括

🚀 実践コード

REM 警告付きで再起動(10分猶予)
shutdown /r /t 600 /c "定期メンテナンスのため再起動します"

REM 実行中シャットダウンの中止(誤爆救済)
shutdown /a

REM リモート複数台を一括再起動(servers.txtを用意)
for /F %i in (servers.txt) do shutdown /r /m \\%i /t 300 /c "パッチ適用完了・5分後再起動"
# PowerShellで資格情報+エラーハンドリング(例)
$cred = Get-Credential
$servers = Get-Content servers.txt
foreach ($srv in $servers) {
  Invoke-Command -ComputerName $srv -Credential $cred -ScriptBlock {
    shutdown /r /t 120 /c "管理者による再起動" /d p:2:17
  } -ErrorAction SilentlyContinue
}

【tzutil】:タイムゾーンを確認・変更する(GUI不要)

現場メモ
VM複製や海外拠点端末で「時間がズレる」系は、まず /g で現状確認してから変更が安全です。

困りごとコマンド補足
現在のタイムゾーンを確認したいtzutil /gIDを取得。
タイムゾーンを変更したいtzutil /s "Tokyo Standard Time"名称は完全一致。再起動不要。
利用可能な一覧を見たいtzutil /l名称確認に使う。
一覧から絞り込みたいtzutil /l | findstr "Tokyo"探す時に便利。

🛡 コマンドの要点と注意点

変更には管理者権限が必要なことがあります。名称は完全一致で、スペースが入るためダブルクォートで囲みます。 誤った名称だと失敗するので、事前に /l で候補を確認してから設定すると手戻りが少ないです。

🛠 現場のトラブル解決(一撃解決コマンド)

「ズレてそう」→ 現状確認→必要なら修正→ログへ

🚀 実践コード

REM 現在設定を保存してから変更
tzutil /g > tz_backup.txt
tzutil /s "Tokyo Standard Time"
echo タイムゾーン変更完了:%date% %time% >> tz_change.log
# 複数サーバーへリモート適用(PSRemotingが必要)
Invoke-Command -ComputerName Server01,Server02,Server03 -ScriptBlock {
  tzutil /s "UTC"
  tzutil /g
} -Credential (Get-Credential)
REM 条件分岐(UTCでなければ直す例)
tzutil /g | findstr "UTC" >nul
if %errorlevel% neq 0 (
  tzutil /s "UTC"
  echo Timezone corrected to UTC
)

【wmic】:WMI経由で情報抽出する(レガシーだが現場に残る)

現場メモ
非推奨でも「バッチに組み込みやすい」「出力が扱いやすい」理由で残っていることがあります。wmic product だけは遅くなりがちなので注意です。

困りごとコマンド補足
CPU名とコア数を知りたいwmic cpu get name,numberOfCores /format:list縦形式でレポート向き。
ディスクの型番・容量・状態を見たいwmic diskdrive get model,size,status状態(Status)確認に。
メモリ構成を見たいwmic memorychip get capacity,speedスロット単位。
OS情報を一発で出したいwmic os get caption,version,installdate台帳・監査用途に。
プロセスを条件指定で止めたいwmic process where name="chrome.exe" delete強制終了用途。
BIOSシリアルを取りたいwmic bios get serialnumber資産管理に。
インストール済みソフト一覧が欲しいwmic product get name,version遅い/MSI中心。実行に注意。

🛡 コマンドの要点と注意点

Windows 11でも動作するケースはありますが、非推奨です。新規運用ならPowerShellの Get-CimInstance が安定です。 特に wmic product は実行時に整合性チェックが走って極端に遅くなることがあるため、軽い調査のつもりで実行しない方が安全です。

🛠 現場のトラブル解決(一撃解決コマンド)

「障害機の構成をすぐ聞かれた」→ 1ファイルにレポート出力

🚀 実践コード

REM ハードウェア構成レポート(テキストにまとめる)
@echo off
echo === System Configuration Report === > report.txt
wmic computersystem get manufacturer,model,totalphysicalmemory /format:list >> report.txt
wmic cpu get name,numberOfCores,maxclockspeed /format:list >> report.txt
wmic diskdrive get model,size,status /format:list >> report.txt
wmic os get caption,version,installdate /format:list >> report.txt
echo Report saved to report.txt
# 後継(PowerShell)例:全ディスク健全性の確認
Get-CimInstance Win32_DiskDrive |
  Select-Object Model,Status,@{N='Size(GB)';E={[math]::Round($_.Size/1GB,2)}} |
  Format-Table -AutoSize

【dispdiag】:ディスプレイ診断情報をdatファイルに丸ごと吐き出す

ラボの視点 (Insight)
マルチモニタ環境で解像度が狂った、画面が認識されないといった現場で「何が起きてるか」をバイナリダンプで記録する。サポート依頼時の証拠収集用。

項目内容
dispdiag -out C:\disp.dat現在のディスプレイ構成・EDIDデータ・ドライバ情報を即座にファイル化
dispdiag -d -out C:\disp_full.dat追加データ含む完全ダンプ。複雑な環境下での深掘り調査用
dispdiag -delay 10 -out C:\disp.dat10秒後に収集開始。画面切り替え直後の状態を捉える
dispdiag -testacpiホットキー(Fn+F8等)の応答をテスト。キー無反応時の切り分け

🛡 コマンドの要点と注意点

ディスプレイドライバ・GPU・モニタEDIDのスナップショットを取得する。datファイルはバイナリ形式で人間には読めないが、Microsoftサポートや専用ツールで解析可能。 オプションによっては管理者権限が必要になることがある。ファイルにシステム構成が含まれるため、外部送付時は情報漏洩に注意。

🛠 現場のトラブル解決(一撃解決コマンド)

外部モニタが突然認識されなくなった時: dispdiag -d -out で接続前後の状態を記録し、EDIDエラーやドライバクラッシュの痕跡を残す。

リモートサポートで顧客環境を把握: ユーザーに dispdiag -out %TEMP%\disp.dat を実行してもらい、ファイル送付を依頼する。

🚀 実践コード

REM マルチモニタ環境で障害発生時の完全記録(デスクトップへ保存)
dispdiag -d -out "%USERPROFILE%\Desktop\dispdiag_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.dat"

REM 画面切り替え操作後の状態を遅延キャプチャ(例:ドッキング直後)
dispdiag -delay 5 -out "%USERPROFILE%\Desktop\dock_diag.dat"

REM 輝度調整が効かない場合の診断ログ(環境によっては管理者権限が必要)
dispdiag -brightnesslogging
dispdiag -out "%USERPROFILE%\Desktop\brightness_issue.dat"

【pnputil】:ドライバーストアを直接操作する低レベル管理ツール

ラボの視点 (Insight)
デバイスマネージャーの裏側で動くドライバーストアを直接制御できる公式ツール。OEM*.infの正体を知りたければこれ。

項目内容
pnputil /enum-driversドライバーストア内の全INFを列挙(OEM番号、公開名、プロバイダー、バージョン等)
pnputil /add-driver *.inf /subdirs /install指定フォルダ配下のINFを追加し、該当デバイスへ適用
pnputil /delete-driver oem12.inf /uninstall /forceストアからINF削除+使用中デバイスから除去(影響大)
pnputil /export-driver * C:\backupストア内ドライバーをINF+関連ファイルごとエクスポート
pnputil /scan-devicesハードウェア変更の再スキャン(抜き差し認識しない時の切り分け)

🛡 コマンドの要点と注意点

ドライバーストアは起動に関わる領域。/delete-driver で使用中のストレージ・ネットワーク系を消すと、BSODや起動不能につながることがある。 特に /force は問答無用で削除するため、実行前に対象OEM番号と依存デバイスを必ず確認する。

🛠 現場のトラブル解決(一撃解決コマンド)

ドライバー更新後に不安定になった時: pnputil /enum-drivers で現在のOEM番号とバージョンを確認し、旧版を /add-driver で再投入して切り分け。

複数PC展開でドライバーを標準化: マスターPCで pnputil /export-driver * → 展開先で /add-driver

🚀 実践コード

REM ドライバーストアの全INFを列挙
pnputil /enum-drivers

REM 展開用バックアップを作成(他PCへの移行のベース)
pnputil /export-driver * "C:\DriverBackup"

REM 圧縮(保存容量を減らしたい場合)
compact /c /s:"C:\DriverBackup" /i /exe:LZX

REM デバイス再スキャン(抜き差し認識しない時)
pnputil /scan-devices
# まず一覧をテキスト化(後で検索しやすい)
pnputil /enum-drivers | Out-File "$env:USERPROFILE\Desktop\drivers_enum.txt" -Encoding UTF8

# OEM番号だけ抜き出す(簡易)
Select-String -Path "$env:USERPROFILE\Desktop\drivers_enum.txt" -Pattern 'oem\d+\.inf' |
  ForEach-Object { $_.Matches.Value } | Sort-Object -Unique

【prnqctl】:プリンターキューを制御する実行コマンド

ラボの視点 (Insight)
GUI操作不要でプリンター状態を切り替える。トラブル時の迅速なキュー処理と夜間バッチでの自動化に特化。

項目内容
prnqctl -Z -p "PrinterName"指定プリンターの印刷キューを一時停止(全ジョブ保留)
prnqctl -M -p "PrinterName"一時停止中のキューを再開
prnqctl -X -p "PrinterName"キュー内の全印刷ジョブを強制削除(復元不可)
prnqctl -E -p "PrinterName"テストページ印刷で疎通確認
prnqctl -Z -s \\Server -p "PrinterName" -u domain\user -w passwordリモートプリンターを認証付きで制御(環境要件あり)

🛡 コマンドの要点と注意点

管理者権限が必要な場面が多い。プリンター名は wmic printer get name や設定画面で正確に確認する。 -X は復元不可能な削除なので、誤操作時の影響が大きい。リモート操作はFW/RPC/権限が揃っている前提。

🛠 現場のトラブル解決(一撃解決コマンド)

紙詰まり復旧後にキューが詰まる: 停止→全削除→再開→テスト印刷の順が最速。

🚀 実践コード

rem トラブル時の定番4ステップ:停止→全削除→再開→テスト印刷
prnqctl -Z -p "Canon iR-ADV C5550"
prnqctl -X -p "Canon iR-ADV C5550"
prnqctl -M -p "Canon iR-ADV C5550"
prnqctl -E -p "Canon iR-ADV C5550"

rem 複数プリンターの一斉キュークリア(例)
for %%P in ("\\SRV01\PrinterA" "\\SRV02\PrinterB" "\\SRV03\PrinterC") do (
  prnqctl -X -p %%~P
)
# 印刷ジョブがあるプリンターを抽出してキューを削除(環境により管理者権限が必要)
Get-Printer | Where-Object { $_.JobCount -gt 0 } | ForEach-Object {
  Write-Host "Clearing: $($_.Name) - Jobs: $($_.JobCount)"
  prnqctl -X -p "$($_.Name)"
}

【rundll32 printui.dll,PrintUIEntry】:プリンター管理をGUIなしで完結させる

ラボの視点 (Insight)
GPOログオンスクリプトとキッティング自動化の現場では、これがないとプリンター展開が完了しない。GUI操作を排除できる定番手段。

項目内容
/in /n"\\server\printer"ネットワークプリンターを無人インストール
/dl /n"printername"ローカルプリンターを削除
/dn /n"\\server\printer"ネットワークプリンター接続を削除
/if /b"名前" /f"driver.inf" /r"port" /m"driver"INFからドライバーごとインストール
/dd /m"drivername" /h"x64"未使用ドライバーを削除(アーキ指定)
/ga /n"\\server\printer"全ユーザー共通プリンターとして追加
/y /n"printername"既定プリンターに設定
/p /n"printername"プロパティダイアログを表示

🛡 コマンドの要点と注意点

プリンター名・ドライバー名は完全一致が前提。/ga はコンピューター単位の接続で、ユーザープロファイル肥大化を避けたい組織運用で有効。 /if の場合はポート作成が先(例:cscript prnport.vbs)。 ドライバー削除(/dd)は使用中プリンターが残っていると失敗するため、順序を守る。

🛠 現場のトラブル解決(一撃解決コマンド)

全ユーザーから特定プリンターを一括削除: /dn/dd の順で痕跡を減らす。

🚀 実践コード

REM ネットワークプリンターを全ユーザー共通で追加&既定に設定
rundll32 printui.dll,PrintUIEntry /ga /n "\\PrintServer01\Canon-MFP-3F"
rundll32 printui.dll,PrintUIEntry /y  /n "\\PrintServer01\Canon-MFP-3F"

REM 旧プリンターを完全削除(接続→ドライバーの順)
rundll32 printui.dll,PrintUIEntry /dn /n "\\OldServer\OldPrinter"
rundll32 printui.dll,PrintUIEntry /dd /m "Old Printer Driver" /h "x64"

REM INFからローカルプリンターを構築(ポート作成済み前提)
rundll32 printui.dll,PrintUIEntry /if /b "経理部-領収書印刷" /f "C:\Drivers\printer.inf" /r "IP_192.168.10.50" /m "EPSON TM-T20III"
# CSV駆動で全ユーザー共通プリンターを一括展開
Import-Csv "printers.csv" | ForEach-Object {
  $unc = $_.UNCPath
  Start-Process -FilePath rundll32.exe -ArgumentList "printui.dll,PrintUIEntry /ga /n `"$unc`"" -Wait -NoNewWindow
}

【sfc】:Windowsシステムファイルの整合性を検証し破損を自動修復する

ラボの視点 (Insight)
システムの「自然治癒力」を使うコマンド。ただし修復元(WinSxS)が壊れていると効かないため、DISM併用が前提。

項目内容
sfc /scannow全システムファイルをスキャンし、破損箇所をWinSxSから自動修復
sfc /verifyonlyスキャンのみ(修復しない)
sfc /scanfile=<ファイルパス>特定ファイルのみスキャン・修復
sfc /verifyfile=<ファイルパス>特定ファイルの整合性確認のみ

🛡 コマンドの要点と注意点

管理者権限が必要。スキャンは数十分かかることがある。修復元のWinSxSが破損していると修復失敗するため、 先に DISM /Online /Cleanup-Image /RestoreHealth を実行してから sfc /scannow が基本。 ログは C:\Windows\Logs\CBS\CBS.log に出るため、findstrで絞ると読みやすい。

🛠 現場のトラブル解決(一撃解決コマンド)

Windows Update失敗や不安定化の修復: DISM → SFC の二段構えで戻す。

🚀 実践コード

REM 標準的な修復フロー(DISM→SFC)
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow

REM スキャン結果からSFC関連行だけ抽出
findstr /c:"[SR]" %windir%\Logs\CBS\CBS.log > "%userprofile%\Desktop\sfc_sr_lines.txt"

REM 特定DLLの整合性確認・修復(例)
sfc /scanfile=C:\Windows\System32\ntdll.dll
# 管理者権限でSFC実行(起動だけ昇格)
Start-Process sfc -ArgumentList "/scannow" -Verb RunAs -Wait

# ログを要約(簡易)
Get-Content "C:\Windows\Logs\CBS\CBS.log" | Select-String "corrupt|repair|\[SR\]" |
  Out-File "$env:USERPROFILE\Desktop\sfc_summary.txt" -Encoding UTF8

【tasklist】:実行中プロセスとリソース消費を把握する

ラボの視点 (Insight)
サービス停止、メモリリーク、不正プロセス混入の初動はこれ。PIDとメモリ使用量を叩き出して taskkill に繋ぐのが定石。

項目内容
tasklist全プロセスをPID・メモリ使用量・セッション情報込みで列挙
tasklist /FI "MEMUSAGE gt 500000"500MB超のプロセスを抽出(メモリリーク切り分け)
tasklist /FI "IMAGENAME eq chrome.exe"特定プロセスの起動確認(複数インスタンスの把握)
tasklist /SVCサービスとプロセスの紐付け(svchost.exeの中身確認)
tasklist /Vユーザー名・CPU時間・ウィンドウタイトルまで取得
tasklist /FO CSV > process.csvCSV出力(定期監視・差分比較に)

🛡 コマンドの要点と注意点

PIDは終了後に再利用されるため、監視スクリプトでは「取得→処置」までの時間を空けすぎない。 リモート(/S)は資格情報が絡み、運用によっては取り回しが悪いので、可能ならPS Remotingの方が安全。

🛠 現場のトラブル解決(一撃解決コマンド)

重いプロセスを止めたい: まずフィルタで絞ってPIDを取る→taskkill。

🚀 実践コード

REM メモリ使用量が大きいプロセスを抽出(500MB超)
tasklist /FI "MEMUSAGE gt 500000"

REM 特定プロセスが存在したら強制終了
tasklist /FI "IMAGENAME eq malware.exe" 2>NUL | find /I "malware.exe" >NUL && taskkill /F /IM malware.exe

REM svchost.exe が動かしているサービスを確認
tasklist /SVC /FI "IMAGENAME eq svchost.exe"

REM リモートのプロセス一覧をCSV取得(環境により失敗することあり)
tasklist /S 192.168.1.100 /U admin /P pass123 /FO CSV > remote_process.csv

【nbtstat】:NetBIOS名前解決の状態を暴くレガシー診断ツール

ラボの視点 (Insight)
Windowsファイル共有が突然死した時、DNS以前の名前解決層で何が起きてるか掴むための道具。SMB周りの「名前は合ってるのに繋がらない」を切り分ける。

項目内容
nbtstat -cNetBIOS名→IPのキャッシュを表示。誤認識の原因確認に
nbtstat -A 192.168.1.10IPから逆引きでNetBIOS名とサービスを列挙。接続先の正体確認
nbtstat -n自分が登録しているNetBIOS名を表示。重複や不正起動の検出
nbtstat -RR名前再登録を強制(WINS/ブロードキャスト)。DHCP後のズレ修正
nbtstat -S確立中のNetBIOSセッション一覧。異常な接続元の特定に

🛡 コマンドの要点と注意点

NetBIOS over TCP/IP は古い方式だが、環境によっては共有アクセスで影響が残る。 nbtstat -R(キャッシュの再読み込み)と nbtstat -RR(再登録)は目的が違うので混同しない。 IPv6やDNSオンリー構成では効果が出ないこともある。

🛠 現場のトラブル解決(一撃解決コマンド)

「\\192.168.1.50 は開けるのに \\SERVER 名だと失敗」: nbtstat -Rnbtstat -c でキャッシュ状態を確認してから再接続。

「不明な端末がファイルサーバへ接続している疑い」: nbtstat -S で接続元IPを出し、nbtstat -A で相手の名前を確認。

🚀 実践コード

REM ファイル共有がおかしい時の診断→修復フロー
nbtstat -c
REM ↑キャッシュに古いIPが残っていないか確認

nbtstat -R
REM ↑キャッシュ再読み込み(環境によっては「クリア目的」で使われることが多い)

nbtstat -RR
REM ↑名前再登録(WINS/ブロードキャスト)

ping -a 192.168.1.100
REM ↑IPから名前逆引き(補助検証)

nbtstat -S | findstr /i "接続先サーバ名"
REM ↑特定サーバへのアクティブセッション抽出

【netsh】:Windowsネットワーク設定を全領域から直接制御するCLIツール

ラボの視点 (Insight)
GUIでは触れない深部設定まで到達可能。WinsockリセットやFWルール追加は、障害対応の「最後の一手」になりやすい。

項目内容
netsh interface ip show config全NICのIP構成(アドレス・DNS・GW)を一覧表示
netsh interface ip set address name="イーサネット" static 192.168.1.100 255.255.255.0 192.168.1.1静的IP+サブネット+GWを一括設定
netsh interface ip set address name="イーサネット" source=dhcpDHCPへ即時切替
netsh interface ip set dns name="イーサネット" static 8.8.8.8プライマリDNSを指定
netsh wlan show profiles保存済みWi-Fiプロファイル一覧
netsh wlan export profile name="MyWiFi" folder=C:\Backup key=clearWi-Fi設定をXML出力(パスワード平文含む)
netsh wlan show interfaces接続中の無線状態(SSID/強度/チャネル等)
netsh advfirewall set allprofiles state offFWを全プロファイルで無効化(検証用途向け)
netsh advfirewall firewall add rule name="AllowApp" dir=in action=allow program="C:\app.exe"特定exeの受信許可ルールを追加
netsh winsock resetWinsockカタログを初期化(通信スタック破損の最終手段)
netsh int ip resetTCP/IP設定を初期状態へ

🛡 コマンドの要点と注意点

netshは設定の深部に触れるため、誤操作でネットワーク全断が起きうる。特に netsh winsock reset は再起動が必要で、VPNやプロキシ設定も巻き戻ることがある。 FW無効化は本番ではリスクが大きいので、検証や切り分けの短時間に限るのが現実的。 静的IP設定をするなら、戻し(source=dhcp)を先に手順として用意しておく。

🛠 現場のトラブル解決(一撃解決コマンド)

ネットワーク不通で ipconfig /renew も効かない: netsh winsock resetnetsh int ip reset でスタック層から再構築(再起動前提)。

複数PCへ同一Wi-Fi設定を展開: netsh wlan export profile key=clear folder=\\server\sharenetsh wlan add profile filename="profile.xml"

🚀 実践コード

REM ▼ネットワーク完全リセット(接続障害の最終手段:再起動前提)
netsh winsock reset
netsh int ip reset
ipconfig /flushdns
shutdown /r /t 10 /c "ネットワークスタック再構築のため再起動"

REM ▼本番向け:静的IP設定→DNS設定→疎通確認(例)
@echo off
set "NIC_NAME=イーサネット"

netsh interface ip set address name="%NIC_NAME%" static 192.168.10.50 255.255.255.0 192.168.10.1
netsh interface ip set dns     name="%NIC_NAME%" static 8.8.8.8
netsh interface ip add dns     name="%NIC_NAME%" 8.8.4.4 index=2

ping -n 1 192.168.10.1 >nul && echo [OK] Gateway reachable || echo [FAIL] Check cable

REM ▼ファイアウォールルール追加(アプリ配布時の例)
netsh advfirewall firewall add rule name="MyApp_TCP" dir=in action=allow protocol=TCP localport=8080 program="C:\App\myapp.exe"
netsh advfirewall firewall add rule name="MyApp_UDP" dir=in action=allow protocol=UDP localport=8080 program="C:\App\myapp.exe"

💿 ディスク・パーティション管理

【chkdsk】:ファイルシステムの論理エラーを検出・修復するディスク検証ツール

ラボの視点 (Insight)
不良セクタの検出は物理障害の予兆。/Rは最後の手段で、通常は/Fで十分。時間をかけるべきは診断ではなく、バックアップと移行判断。

項目内容
chkdsk C:読み取り専用モードでファイルシステムの整合性を検証。エラーは表示するが修復しない
chkdsk C: /F論理エラー(ディレクトリ構造の破損、クロスリンク等)を自動修復。システムドライブは次回起動時に実行
chkdsk D: /R/Fに加え物理的な不良セクタをスキャンし、読み取り可能なデータを回復。大容量ディスクでは数時間~十数時間
chkdsk E: /Xボリュームを強制アンマウント後に検証・修復。開いているファイルハンドルを強制終了
chkdsk C: /BNTFS専用。不良クラスタリストを再評価し、ソフトエラーをクリア。/R実行後の最適化に使用

🛡 コマンドの要点と注意点

chkdskはファイルシステムメタデータ(MFT、ビットマップ等)の論理的な不整合を修復する。/Fはファイルロック中は実行不可でスケジュール予約となる。/Rは全セクタを読み取るため膨大な時間を要し、既に物理障害がある場合は症状を悪化させるリスクがある。修復処理は非可逆的でデータ消失の可能性があるため、実行前に必ずイメージバックアップを取得すること。SSDでは/Rは不要、むしろ寿命を縮める。

🛠 現場のトラブル解決(一撃解決コマンド)

起動直後の”ファイルまたはディレクトリが壊れている”エラー時:該当ドライブにchkdsk D: /Fを実行し、ファイルシステムのインデックスを再構築。
システムが起動しない場合:回復環境(WinRE)からchkdsk C: /F /Xを実行し、起動ボリュームの整合性を強制修復。

🚀 実践コード

REM システムドライブの完全検証(次回起動時に自動実行)
chkdsk C: /F
REM データドライブの不良セクタ完全スキャン(時間がかかる)
chkdsk D: /R
REM NTFSボリュームの不良クラスタ再評価(/R実行後の最適化)
chkdsk E: /B
REM 強制アンマウント+修復(使用中のドライブに対して)
chkdsk F: /X /F
REM 回復環境からの修復(WinREのコマンドプロンプト)
chkdsk C: /F /X /B

【compact】:NTFSファイルシステム上でファイル・フォルダを透過的に圧縮してディスク容量を回収するコマンド

ラボの視点 (Insight)
ZIP圧縮と違い、圧縮したままアクセス可能。ログファイルやテキストデータで効果大、既圧縮ファイル(jpg、zip)には無意味。CPU負荷と引き換えにストレージを稼ぐトレードオフ。

項目内容
compact /c /s:C:\Logs指定ディレクトリ配下を再帰的に圧縮、以降作成されるファイルも自動圧縮
compact /u /s:C:\Data圧縮を再帰的に解除、パフォーマンス改善が必要な場合に実行
compact /c /a /i /s:D:\Archive隠しファイル含め強制圧縮、エラーを無視して処理継続
compact /q C:\Temp統計情報なしで現在の圧縮状態のみ表示、スクリプト組込用

🛡 コマンドの要点と注意点

NTFS圧縮はファイル属性レベルで動作し、アクセス時にリアルタイム展開される。CPU性能が低い環境では頻繁アクセスでボトルネックになる。SSDでは書き込み増幅を招くため、アーカイブ用途に限定すべき。圧縮率はファイル形態に依存し、テキストやログで50〜70%、Office文書で30〜50%、画像・動画ではほぼゼロ。システムファイルやページファイルには適用不可。

🛠 現場のトラブル解決(一撃解決コマンド)

ディスク容量が逼迫、古いログフォルダを圧縮して即座に空き容量を確保したい時:
compact /c /s:C:\inetpub\logs /i でIISログ等を一括圧縮、通常50%以上の容量削減。
圧縮済みファイルがパフォーマンスを阻害、どこが圧縮されているか特定したい時:
compact /s:C:\ | findstr /i ""圧縮"" でドライブ全体をスキャン、圧縮箇所を可視化。

🚀 実践コード

REM バックアップディレクトリを自動圧縮し、30日以上前のファイルのみ対象
forfiles /p "D:\Backup" /s /m *.* /d -30 /c "cmd /c compact /c /i @path"
REM 圧縮前後のサイズ差分をレポート出力
compact /c /s:E:\Archive > before.txt && compact /s:E:\Archive > after.txt
REM 特定拡張子のみ圧縮(ログとテキストファイル)
for /r "C:\AppData" %i in (*.log *.txt) do compact /c /i "%i"
# 圧縮率をパーセント表示、効果測定用
Get-ChildItem -Path "C:\Data" -Recurse | Where-Object {$_.Attributes -match "Compressed"} |
Select-Object FullName, @{N="CompressedSize(MB)";E={[math]::Round($_.Length/1MB,2)}}

【defrag】:ディスク断片化を解消してアクセス速度を回復するコマンド

ラボの視点 (Insight)
SSDに古いdefragをかけると寿命を削る。Windows 8以降は /O でドライブタイプを自動判別するが、手動実行時は必ず確認してから叩け。

項目内容
defrag C: /A断片化率の分析のみ実行。実行判断の根拠データを取得
defrag C: /OHDD/SSDを自動判別して最適化。HDDはデフラグ、SSDはTRIM実行
defrag C: /X空き領域を統合。断片化予防に有効だが処理時間は長い
defrag /C /H全ドライブを高優先度で一括処理。深夜バッチ向け

🛡 コマンドの要点と注意点

HDDは断片化で物理ヘッドの移動距離が増えアクセス速度が劣化する。SSDはTRIM(未使用ブロック通知)が本質で、従来型デフラグは書き込み回数を無駄に消費する。管理者権限必須。デフラグ中はディスクI/Oが集中するため業務時間外推奨。Windows標準のスケジュールタスクで週次実行されているため、手動実行は体感的に遅い時のみで十分。

🛠 現場のトラブル解決(一撃解決コマンド)

「サーバーのHDDが遅延している、デフラグすべきか判断したい」

分析で断片化率10%超なら実行価値あり。SSDなら /O でTRIMのみ実施。

🚀 実践コード

REM 断片化状況を確認後、必要なら最適化実行
defrag D: /A
defrag D: /O /H
REM 全ドライブ一括最適化(深夜バッチ用)
defrag /C /O /H > C:\logs\defrag_%date:~0,4%%date:~5,2%%date:~8,2%.log 2>&1

【format】:ストレージを指定ファイルシステムで初期化する破壊的コマンド

ラボの視点 (Insight)
データ完全消去が前提。クイックフォーマットは論理削除のみだがデータ復旧は現実的でない。アロケーションユニットサイズの指定がパフォーマンスを左右する。

項目内容
format E: /FS:NTFS /QE:ドライブをNTFSでクイックフォーマット。ファイルテーブルのみ再構築、不良セクタスキャンなし
format E: /FS:FAT32 /Q /V:BACKUPFAT32で初期化しボリューム名を設定。4GB超ファイル不可、互換性重視の選択
format D: /FS:NTFS /X使用中ドライブを強制マウント解除して初期化。ハンドル掴んでいるプロセスを無視
format E: /FS:NTFS /A:64K64KBクラスタで初期化。大容量ファイル多数なら4K→64Kでシーケンシャル性能向上

🛡 コマンドの要点と注意点

実行時点で全データ消失、復元は専門ツールでも困難。クイックフォーマット(/Q)は物理破壊せず論理削除のみだが、通常フォーマットは不良セクタ検査で時間が10倍以上かかる。FAT32は単一ファイル4GB制限があり、USBメモリ等の互換性重視以外はNTFS一択。管理者権限必須、システムドライブ(C:)は実行不可。/Xオプションはプロセスが掴んでいるハンドルを無視して強制実行するため、データ破損リスクがある。

🛠 現場のトラブル解決(一撃解決コマンド)

USBメモリが「フォーマットする必要があります」エラーで認識しない時format F: /FS:FAT32 /Q /X で強制初期化。ファイルシステム破損を物理層無視で復旧。
仮想マシン用VHDXを高速運用したい時format V: /FS:NTFS /A:64K /Q で64KBクラスタ指定。ランダムアクセスは犠牲にして大容量ファイルのスループット最大化。

🚀 実践コード

# USB大容量メモリを互換性重視で初期化(3TB超はexFAT推奨)
format F: /FS:FAT32 /Q /V:TRANSFER
# 動画編集用外付けHDDを最適化(大容量ファイル向けクラスタ拡大)
format E: /FS:NTFS /A:65536 /Q /V:VIDEO_WORK
# 破損ドライブを強制再構築(エラー無視で実行)
format D: /FS:NTFS /X /Q
# データ完全消去が必要な時(クイックなし=不良セクタ検査実施)
format E: /FS:NTFS /V:SECURE_ERASE

【label】:ドライブのボリュームラベルを変更・削除するコマンド

ラボの視点 (Insight)
バッチ処理で複数のUSBドライブを識別する際、volコマンドとの組み合わせで真価を発揮する。GUIでクリックするより圧倒的に速い。

項目内容
label C: DataDriveC:ドライブのボリュームラベルを”DataDrive”に変更
label D:D:ドライブのラベルを削除(対話式で確認後削除)
label E: Work /MPラベル設定と同時にマウントポイント情報表示

🛡 コマンドの要点と注意点

ボリュームラベルはNTFSで32文字、FAT32で11文字が上限。システムドライブの変更には管理者権限必須。labelコマンド単独実行は対話式となり、誤入力でもEnterのみで変更回避可能。ラベル名にスペースを含む場合は引用符不要だが、特殊文字は使用不可。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ処理で挿入されたUSBドライブを識別したい時、vol E: | find "BACKUP"でラベル確認後に処理分岐させる。

複数ドライブの一括ラベル変更はfor文と組み合わせてfor %d in (D: E: F:) do label %d Archive_%dで実行。

🚀 実践コード

@echo off
rem バックアップドライブを自動識別してラベル付与
for %%d in (D E F G H I J K) do (
vol %%d: 2>nul | find "Volume" >nul
if not errorlevel 1 (
echo %%d: ドライブ検出 - ラベルを設定中...
echo BACKUP_%DATE:~-10,4%%DATE:~-5,2%%DATE:~-2,2% | label %%d:
)
)
# PowerShellでボリュームラベル一括管理
Get-Volume | Where-Object {$_.DriveLetter -ne $null} | ForEach-Object {
Set-Volume -DriveLetter $_.DriveLetter -NewFileSystemLabel "$($_.DriveLetter)_DATA"
}

【vol】:ドライブのボリュームラベルとシリアル番号を即座に確認

ラボの視点 (Insight)
バッチ処理で特定のUSBメモリや外付けHDDを識別する際、シリアル番号による判定が最も確実。ドライブレターは環境依存で信用できない。

項目内容
vol C:指定ドライブのボリュームラベルとシリアル番号を表示
volカレントディレクトリが属するドライブの情報を表示

🛡 コマンドの要点と注意点

ボリュームシリアル番号はフォーマット時に生成される一意のID。ボリュームラベルは後から変更可能だが、シリアル番号は再フォーマットしない限り不変。読み取り専用コマンドのため実行リスクはゼロ。ネットワークドライブには対応しない。

🛠 現場のトラブル解決(一撃解決コマンド)

複数の外付けドライブから特定の機器を判別したい時

事前にシリアル番号を記録しておき、バッチで照合すれば接続位置が変わっても正確に識別可能。

🚀 実践コード

@echo off
for %%d in (D E F G H) do (
vol %%d: 2>nul | find "1A2B-3C4D" >nul && (
echo Target drive found: %%d:
set BACKUP_DRIVE=%%d:
)
)
if defined BACKUP_DRIVE (
xcopy /E /I /Y C:\Important\* %BACKUP_DRIVE%\Backup\
)

【diskpart】:ディスクとパーティションを対話モードで操作する強力な破壊兵器

ラボの視点 (Insight)
GUIのディスク管理では不可能な強制削除やディスク完全消去が可能。誤操作は即データ消失だが、起動不能USBメモリの復旧やMBR/GPT変換では最終手段となる。

項目内容
diskpart対話型ディスク管理モードを起動、list disk/partition/volumeでオブジェクト一覧を表示
select disk N → clean指定ディスクを完全消去、MBR/パーティション情報も削除してまっさらな状態に
create partition primaryプライマリパーティションを作成、size=指定なしは残り全域を使用
assign letter=X選択中ボリュームにドライブ文字を割当、アクセス可能な状態に
convert gpt/mbrパーティションスタイルを変換、2TB超のディスクはGPTが必須
attributes disk clear readonly読取専用属性を解除、書込禁止USBメモリの強制解除に有効

🛡 コマンドの要点と注意点

select操作でディスク番号を間違えると本番ディスクを消去する危険性が高い。list diskで必ずサイズと状態を確認し、対象を特定してから操作する。cleanコマンドは復元不可能な完全消去を実行するため、GUI確認なしで即座にデータが消える。管理者権限必須で、システムディスクに対する操作はWindows回復環境からの実行が必要。

🛠 現場のトラブル解決(一撃解決コマンド)

USBメモリが「書込禁止」エラーで使えない時:diskpartで list disk → select disk N → attributes disk clear readonly → clean → create partition primary → format fs=ntfs quick → assign の一連操作で強制初期化。

WindowsインストールでGPT/MBR不一致エラー:起動メディアからShift+F10でdiskpart起動、select disk 0 → clean → convert gpt でパーティションテーブルを変換後インストール継続。

🚀 実践コード

diskpart
list disk
select disk 1
list partition
select partition 1
delete partition override
create partition primary
format fs=ntfs quick label="DataDrive"
assign letter=D
exit
# スクリプトでdiskpartを自動実行(USBメモリ初期化例)
@"
select disk 2
clean
create partition primary
format fs=exfat quick label="USB_DRIVE"
assign letter=E
"@ | diskpart

💻 バッチファイル・環境制御

【clip】:コマンド出力をクリップボードに直送するパイプライン終端ツール

ラボの視点 (Insight)
標準出力をGUIアプリに渡す唯一の公式ブリッジ。ファイル経由せずメモリ直結でクリップボードに流し込む。

項目内容
ipconfig /all \| clipネットワーク設定全文をクリップボードへ。サポートチケットやチャットにCtrl+Vで即投下
type error.log \| clipログファイル内容をクリップボード経由でSlack等に貼り付け。catより速い
dir /s /b *.dll \| clipDLLファイルのフルパス一覧をExcelやNotionに直接ペースト可能な形式で取得
echo %CD% \| clip現在のディレクトリパスをコピー。エクスプローラーのアドレスバーに貼って移動

🛡 コマンドの要点と注意点

パイプで受け取った標準入力をUTF-16LEでクリップボードに格納。既存のクリップボード内容は問答無用で上書きされる。リダイレクトやファイル出力と異なり、出力先が存在しないため実行結果の視覚的確認ができない点に注意。PowerShellのSet-Clipboardと違い日本語は環境依存でコードページ変換が発生する。

🛠 現場のトラブル解決(一撃解決コマンド)

「障害報告でシステム情報を即座に提出したい」systeminfo | clip 実行後、チャットツールにペーストで完結。スクショより軽量で検索可能。
「特定エラーコードの出現行だけ抽出して共有」findstr /i ""0x800"" app.log | clip でフィルタ済みログを即座に転送可能。

🚀 実践コード

REM サーバー接続診断結果をクリップボード経由でドキュメント化
ping 192.168.1.1 -n 10 | findstr /i "ms TTL 損失" | clip
REM 環境変数一覧をスプレッドシートに貼り付け用に整形コピー
set | sort | clip
REM PowerShellプロセス一覧をタブ区切りでコピー(Excel直貼り用)
tasklist /fi "imagename eq powershell.exe" /fo table | clip

【cls】:コマンドプロンプトの画面をクリアする

ラボの視点 (Insight)
バッチの途中で使わないと、エラーログが埋もれて本番障害の原因特定が遅れる。デバッグ時は意図的に使わない方が賢い。

項目内容
clsコンソール画面の表示内容を全消去。スクロールバッファも初期化される
cls (バッチ内)処理のフェーズ区切りで使用し、画面の視認性を確保

🛡 コマンドの要点と注意点

画面表示を消すだけで、コマンド履歴やプロセスには一切影響しない。リダイレクトやログ出力には無関係。クリア後は以前の出力を確認できないため、本番バッチでは慎重に使用する。デバッグ中は cls を入れずに全ログを追える状態にしておくのが鉄則。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ処理のフェーズごとに画面を整理したい時:各処理ブロックの冒頭で cls を実行し、echo でフェーズ名を表示すれば進行状況が把握しやすい。

🚀 実践コード

@echo off
cls
echo ========================================
echo サーバー正常性チェック開始
echo ========================================
ping -n 1 192.168.1.1 >nul && echo [OK] GW到達可能 || echo [NG] GW到達不可
pause
cls
echo ========================================
echo ディスク容量チェック開始
echo ========================================
wmic logicaldisk get caption,freespace,size
pause

【color】:コマンドプロンプトの色を16進数2桁で変える

ラボの視点 (Insight)
バッチ処理の進行状態を視覚化する唯一のネイティブ手段。エラー時は赤、警告は黄、正常は緑で塗り分ければ、無人実行ログも一目で判別できる。

項目内容
color 0A黒背景+緑文字。サーバー監視やログ出力の正常系表示に定番
color 4F赤背景+白文字。致命的エラー発生時の警告画面として機能
color 1F青背景+白文字。情報表示モード。デフォルトの黒より目に優しい
color 6E黄背景+明黄文字。警告レベルの通知に使用。視認性は最悪なので注意喚起専用
color引数なしでデフォルト(通常は0F or 07)に復帰

🛡 コマンドの要点と注意点

第1桁が背景、第2桁が文字色。同じ色指定(color 00color FF)は画面が真っ黒/真っ白になり操作不能になるため即座にclscolorで復旧が必要。色変更は現在のウィンドウにのみ作用し、新規起動したcmdには引き継がれない。レジストリ(HKCU\Console)のColorTable設定と混同しないこと。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ実行中に色が変わらない時clsを直前に実行。画面バッファが更新されないと色変更が反映されない仕様がある。
色指定ミスで画面が見えなくなった時Alt+Space → E → Lで全選択→Enterでコマンド履歴からcolorを実行、またはウィンドウを閉じて再起動。

🚀 実践コード

@echo off
color 0A & echo [INFO] バックアップ開始...
timeout /t 2 /nobreak >nul
robocopy C:\Source D:\Backup /MIR /R:1 /W:1 >nul 2>&1
if %errorlevel% geq 8 (
color 4F & cls & echo [ERROR] バックアップ失敗 - エラーレベル: %errorlevel%
pause & exit /b 1
)
color 0E & echo [WARN] 一部ファイルスキップ
timeout /t 3 /nobreak >nul
color 07 & cls & echo 処理完了。通常モードに復帰
多段階バッチでの状態管理:
color 1F & echo === フェーズ1: データ検証 ===
verify_data.bat
if errorlevel 1 (color 4E & echo 検証失敗 & exit /b)
color 0B & echo === フェーズ2: 変換処理 ===
convert.bat
color 02 & echo === 完了 ===

【echo】:バッチ実行制御とテキスト出力の基盤コマンド

ラボの視点 (Insight)
バッチファイルの先頭に@echo offを書かない奴は素人。デバッグ時はon、本番はoffが鉄則。

項目内容
@echo offバッチ内の全コマンド表示を抑制。@により自身も非表示化
echo.空行挿入。視認性向上に必須
echo 文字列 > file.txtファイル新規作成・上書き。既存データは消失
echo 文字列 >> file.txtファイル追記。ログ出力の標準手法
echo %変数名%環境変数・バッチ変数の値を表示。デバッグ用途
echo ^>特殊文字リダイレクト記号等を文字として出力。^でエスケープ

🛡 コマンドの要点と注意点

バッチファイルでは実行コマンドが標準で画面表示されるため、@echo offによる制御が必須。>は完全上書き、>>は追記と動作が全く異なるため誤用は致命的。特にログファイル操作では>一発で全履歴が消滅する。特殊文字(<>|&等)は^による事前エスケープが必要。UTF-8出力時はchcp 65001との併用で文字化けを回避。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ実行時にコマンドが画面を埋め尽くす時:先頭に@echo offを配置し、処理開始・完了のみechoで通知。
変数に正しく値が入っているか確認したい時echo デバッグ: %変数名%で即座に変数内容を可視化。

🚀 実践コード

@echo off
chcp 65001 >nul
echo [%date% %time%] バッチ処理開始 > process.log
echo.
set TARGET_DIR=C:\backup
echo 対象: %TARGET_DIR%
echo [INFO] バックアップ先: %TARGET_DIR% >> process.log
if exist ""%TARGET_DIR%"" (
echo ^> ディレクトリ確認OK
echo [%date% %time%] 処理成功 >> process.log
) else (
echo ^[ERROR^] ディレクトリが存在しません
echo [%date% %time%] エラー発生 >> process.log
exit /b 1
)
echo.
echo 処理完了。ログ: process.log

【for】:リスト・ファイル・範囲に対する繰り返し処理の実行

ラボの視点 (Insight)
バッチ自動化の要。オプション/D/R/L/Fの使い分けが実務レベルの分岐点。

項目内容
for %i in (*.log) do del %iカレントディレクトリの指定パターンファイルを順次処理
for /R C:\logs %f in (*.txt) do echo %fサブディレクトリ再帰でファイル探索・処理を実行
for /L %n in (1,1,10) do mkdir dir%n数値範囲の連番処理でフォルダ・ファイル生成
for /F "tokens=2 delims=," %a in (data.csv) do echo %aCSV等の区切りテキストから特定列を抽出処理
for /F %i in ('tasklist ^| find "chrome"') do echo %iコマンド実行結果をリスト化して反復処理

🛡 コマンドの要点と注意点

コマンドライン直接実行は%変数、バッチファイル内は%%変数と記述が異なる点が最大の罠。/Fオプションはtokensで列指定、delimsで区切り文字、skipで行スキップが可能。パイプやリダイレクトを含むコマンドを(' ')内で実行する際は特殊文字^でエスケープ必須。大量ファイル処理時はパフォーマンス低下とメモリ消費に注意、処理件数が数万超える場合はPowerShellへの移行を検討すべき。

🛠 現場のトラブル解決(一撃解決コマンド)

古いログファイルを日付判定で自動削除したい時
forfiles /P C:\logs /S /M *.log /D -30 /C ""cmd /c del @path""で30日以上前のログを再帰削除。forコマンドより日付判定が正確。
特定プロセスのPIDを抽出してkillしたい時
for /F ""tokens=2"" %p in ('tasklist ^| find ""app.exe""') do taskkill /PID %p /Fでプロセス名からPID取得→強制終了を自動化。

🚀 実践コード

REM バッチファイル例:サブディレクトリ含む全エラーログから特定文字列を抽出しレポート生成
@echo off
set OUTPUT=error_report.txt
echo Error Report - %date% %time% > %OUTPUT%
for /R "C:\AppLogs" %%f in (*.log) do (
for /F "tokens=*" %%l in ('findstr /I "ERROR FATAL" "%%f"') do (
echo [%%f] %%l >> %OUTPUT%
)
)
echo Report saved to %OUTPUT%
REM 連番ファイルを一括リネーム(接頭辞付与)
setlocal enabledelayedexpansion
set N=1
for %%f in (*.jpg) do (
ren "%%f" "photo_!N!_%%f"
set /A N+=1
)

【goto】:バッチファイル内の指定ラベルへ実行位置を移動

ラボの視点 (Insight)
エラー分岐とクリーンアップ処理の分離に使う。多用するとスパゲッティ化するが、適切に使えば冗長なコード削減とメンテナンス性向上を両立できる。

項目内容
goto :LABEL指定ラベル(:LABEL)の位置へ処理をジャンプ。以降の行を順次実行
if errorlevel 1 goto :ERRORコマンド失敗時に即座にエラー処理へ分岐。多段階処理の異常系を一元管理
goto :EOFバッチファイル(またはサブルーチン)の終端へジャンプ。即座に終了可能

🛡 コマンドの要点と注意点

バッチ内でのフロー制御を実現する基本命令。ラベルは:で始まり、空白や特殊文字を含まない英数字で命名。同一ラベルの重複は最初の出現位置が優先される。無限ループはset /aとカウンタ変数で必ず脱出条件を設定。可読性低下を防ぐため、ラベルは機能単位で命名し、深いネストはcallによるサブルーチン化を検討すべき。

🛠 現場のトラブル解決(一撃解決コマンド)

複数の外部ツール実行で一つでも失敗したら全体をロールバックしたい時、各処理後にif errorlevel 1 goto :ROLLBACKを配置し、:ROLLBACKラベル以降でクリーンアップ処理を集約。正常系は:SUCCESSへ飛ばして終了メッセージだけ表示する構造にすれば、エラーハンドリングが一元化され保守性が向上。

🚀 実践コード

@echo off
setlocal
echo [1/3] データベースバックアップ開始...
sqlcmd -S localhost -Q ""BACKUP DATABASE..."" > nul 2>&1
if errorlevel 1 goto :ERROR_DB
echo [2/3] ファイル同期開始...
robocopy C:\Source D:\Backup /MIR /R:1 /W:1 > nul
if errorlevel 8 goto :ERROR_SYNC
echo [3/3] ログ圧縮開始...
powershell Compress-Archive -Path C:\Logs\* -DestinationPath D:\Archive\log.zip -Force
if errorlevel 1 goto :ERROR_COMPRESS
goto :SUCCESS
:ERROR_DB
echo [ERROR] データベースバックアップ失敗。処理中断。
goto :CLEANUP
:ERROR_SYNC
echo [ERROR] ファイル同期でクリティカルエラー。ロールバック実行。
del D:\Backup\*.* /Q
goto :CLEANUP
:ERROR_COMPRESS
echo [ERROR] ログ圧縮失敗。手動確認が必要。
goto :CLEANUP
:SUCCESS
echo [SUCCESS] 全バッチ処理完了。
goto :END
:CLEANUP
echo クリーンアップ処理実行中...
del %TEMP%\batch_*.tmp /Q 2>nul
exit /b 1
:END
endlocal
exit /b 0

【if】:条件分岐によるバッチ処理の制御コマンド

ラボの視点 (Insight)
バッチの自動化で最も使うのはファイル存在チェックとERRORLEVEL判定。変数の引用符囲みを怠ると空文字やスペース入り値で構文エラーになる。

項目内容
if exist [ファイル名] (処理)ファイル・ディレクトリの存在確認。バックアップや上書き前チェックに必須
if errorlevel 1 (処理)直前コマンドの終了コードが指定値以上なら真。大きい値から順に判定すること
if /i ""%var%""==""値"" (処理)大文字小文字を無視して比較。ユーザー入力や環境変数の判定で使用
if not ""%var%""=="""" (処理)変数の空チェック。引用符で囲まないと空変数で構文エラー発生
if defined 変数名 (処理)変数が定義されているか確認。未定義変数による異常動作を防ぐ

🛡 コマンドの要点と注意点

変数展開時は必ず"%var%"と二重引用符で囲む。空文字やスペース含み値でif ==が構文エラーになる。errorlevelは指定値「以上」で真となるため、判定順序は降順(9,8,7…)が鉄則。文字列比較は==演算子だが、数値的な大小比較にはgeq,leq,gtr,lssを使用。else節は必ず条件文と同じ行か括弧で囲む必要がある。

🛠 現場のトラブル解決(一撃解決コマンド)

ログファイルが存在する時だけアーカイブして新規作成したい時
if exist app.log (move app.log app_%date:~0,4%%date:~5,2%%date:~8,2%.log && type nul > app.log)
前処理が成功した時だけ次の処理を実行したい時
robocopy src dst /mir && if %errorlevel% leq 1 (echo Success) else (echo Failed && exit /b 1)

🚀 実践コード

@echo off
setlocal enabledelayedexpansion
rem 引数チェックと処理振り分け
if "%~1"=="" (
echo Usage: %~nx0 ^ ^
exit /b 1
)
if not exist "%~1" (
echo Error: Source file not found.
exit /b 2
)
rem コピー先の存在確認と上書き判定
if exist "%~2" (
set /p confirm="File exists. Overwrite? (Y/N): "
if /i not "!confirm!"=="Y" exit /b 0
)
copy /y "%~1" "%~2"
if errorlevel 1 (
echo Copy failed with errorlevel %errorlevel%
exit /b %errorlevel%
) else (
echo Copy completed successfully.
)

【path】:実行ファイル検索パスを表示・変更する環境変数操作コマンド

ラボの視点 (Insight)
セッション内のPATH変更は子プロセスに引き継がれるが、端末を閉じれば消える。システム全体への恒久的変更はGUI(SystemPropertiesAdvanced.exe)かsetxを使え。

項目内容
path現在のセッションで有効なPATH環境変数を全て表示
path C:\Tools;%path%指定ディレクトリを既存PATHの先頭に追加(優先度最高)
path %path%;C:\Tools指定ディレクトリを既存PATHの末尾に追加(優先度最低)
path;PATHを空にリセット(カレントディレクトリのみ検索対象)

🛡 コマンドの要点と注意点

pathコマンドによる変更は現在のcmd.exeセッション限定で有効。バッチファイル内で使えば子プロセスに継承されるが、別の端末や再起動後は無効。同名の実行ファイルが複数のPATH内に存在する場合、先頭に近いディレクトリが優先される。path;でリセットするとシステムコマンド(dir、cd等)すら実行不能になるため即座に復元が必要。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ内で一時的にツールパスを追加して実行後に元へ戻したい時

set句でバックアップを取り、処理後に復元する。

現在のPATHをセミコロン区切りでなく1行ずつ見やすく確認したい時

echoとパイプでパース処理を挟む。

🚀 実践コード

REM バッチファイル内での安全なPATH一時変更パターン
@echo off
set ORIGINAL_PATH=%path%
path C:\CustomTools\bin;%path%
REM ここで一時的に追加したツールを使用
customtool.exe --process
REM 処理完了後に復元
path %ORIGINAL_PATH%
# PowerShellでPATHを見やすく1行ずつ表示
$env:Path -split ';' | ForEach-Object { $_ }
# cmd互換で実現する場合
echo %path:;=&echo.%

【pause】:バッチ処理を手動制御下に置く停止コマンド

ラボの視点 (Insight)
自動化と手動制御の境界を作る。デバッグ時は神、本番運用では地雷。

項目内容
pause「続行するには何かキーを押してください…」を表示し処理停止
pause >nul標準メッセージを非表示化、echo併用で独自メッセージ実装
echo 確認後Enter押下 & pause >nulカスタムメッセージ+待機の実戦パターン

🛡 コマンドの要点と注意点

バッチ実行を任意タイミングで停止させユーザー介入を強制する。デバッグ時は各処理ブロック間に挟んで変数状態や実行結果を目視確認できる利点がある。本番環境では自動実行を阻害するため削除必須。タスクスケジューラやJenkins等から実行する場合、pauseが残っていると処理が永久停止してインシデント化する。

🛠 現場のトラブル解決(一撃解決コマンド)

重要処理前に確認挟みたい時echo [警告]DB全削除を実行します & pause >nulでデフォルトメッセージを消して独自警告を表示。
デバッグ用一時停止set /p dummy=Enter押下で続行:でpauseより柔軟な制御が可能。

🚀 実践コード

@echo off
echo ========== 本番DB更新処理 ==========
echo.
echo [警告] 本番環境のデータを更新します
echo 続行する場合はEnterキーを押してください
echo 中止する場合はCtrl+Cを押してください
pause >nul
echo 処理開始...
sqlcmd -S prod-server -d MainDB -i update.sql
if %errorlevel% neq 0 (
echo [エラー] SQL実行失敗
pause
exit /b 1
)
echo 処理完了
pause
REM デバッグ用:各ステップで変数状態を確認
@echo off
set LOG_PATH=C:\logs\app.log
echo ログパス: %LOG_PATH%
pause
dir %LOG_PATH%
echo ファイル存在確認完了
pause
type %LOG_PATH% | find ""ERROR""
echo エラー抽出完了
pause

【prompt】:コマンドプロンプトの表示記号をカスタマイズ

ラボの視点 (Insight)
バッチ運用中のログ記録や深い階層作業時の現在位置確認が本命。デバッグ時の時刻表示が地味に効く。

項目内容
prompt $p$gデフォルト形式(C:\Users\username>)。現在のフルパス+大なり記号
prompt $d$s$t$_$p$g日付・時刻を上段、パスを下段に分離。バッチ実行の時系列追跡に有効
prompt $v$_$p$gOSバージョン+パス。異なるWindows環境での検証作業で誤操作防止
prompt [$c$n$f]$s$g[C] >のようにドライブ文字のみ表示。長いパス表示を避けたい時
prompt引数なし実行でデフォルト($p$g)に復帰

🛡 コマンドの要点と注意点

セッション限定設定であり、ウィンドウを閉じれば消滅する。恒久化には環境変数PROMPTをシステム設定で登録するか、起動バッチに記述。複数階層の深いディレクトリでは$pが画面幅を圧迫するため$n(ドライブのみ)や改行$_での段分けが実用的。ANSIエスケープ$eで色付けも可能だが、レガシー環境では文字化けリスクあり。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチ実行ログで各コマンドの実行時刻を記録したい時: prompt $t$gで時刻プロンプト化後、echo出力をリダイレクト。コマンド実行毎に時刻が自動記録される。
深い階層で迷子になる時: prompt $d$s$t$_$p$_$gで日時+改行+フルパスを上部固定表示。

🚀 実践コード

REM バッチデバッグ用・時刻付きプロンプト
prompt $t$s$p$g
dir
ping 127.0.0.1
REM 複数環境検証時・OS情報付きプロンプト
prompt [$v]$s$p$g
REM 起動バッチで恒久化(autoexec.batやレジストリ代替)
@echo off
prompt $e[32m$p$e[0m$g
REM 緑色パス表示(ANSI対応環境のみ)
# PowerShellで同等機能(関数promptのカスタマイズ)
function prompt {
"PS [$(Get-Date -Format 'HH:mm:ss')] $($executionContext.SessionState.Path.CurrentLocation)> "
}

【set】:セッション内で環境変数を生成・変更・削除する変数制御コマンド

ラボの視点 (Insight)
バッチファイルの変数操作の基幹。永続化しないため検証環境やCI/CDパイプラインで既存設定を汚さず使える。

項目内容
set現在セッションの全環境変数を一覧表示
set 変数名=値セッション内で変数を作成または上書き
set 変数名=指定変数をセッションから削除
set /A 変数=式整数演算を実行して結果を格納(+,-,*,/,%,&,^,|使用可)
set /P 変数=プロンプトユーザー入力を変数に格納(対話型バッチ構築)
set 文字列指定文字列で始まる変数のみフィルタ表示

🛡 コマンドの要点と注意点

設定した変数はコマンドプロンプトまたはバッチファイルのプロセス内でのみ有効。子プロセスには継承されるが、親プロセスや他セッションには影響しない。=の前後にスペースを入れると変数名に空白が含まれエラー源になる。PATH等のシステム変数を上書きする際は%PATH%で既存値を保持しないと環境が破壊される。永続化が必要ならsetxを使うが即座には反映されない。

🛠 現場のトラブル解決(一撃解決コマンド)

特定プレフィックスの変数だけ確認したい時: set JAVA でJAVA関連変数のみ抽出表示。
バッチ内でタイムスタンプ付きログファイル名を生成したい時: /Aで日時計算や文字列分解と組み合わせて動的ファイル名を構築。

🚀 実践コード

REM 一時的な開発環境構築(既存PATHを保持しつつ追加)
set PATH=C:\DevTools\bin;%PATH%
set JAVA_HOME=C:\Java\jdk-17
set MAVEN_OPTS=-Xmx2048m
REM バッチ内での計算処理とユーザー入力
set /A total=0
set /P count=処理する件数を入力:
set /A total=%count%*100
echo 推定処理時間: %total% 秒
REM デバッグ用:特定変数の存在確認
if not defined TEMP (echo TEMP変数が未定義) else (echo TEMP=%TEMP%)
REM CI/CDでの動的バージョン設定
set /A BUILD_NUMBER=%BUILD_NUMBER%+1
set VERSION=1.2.%BUILD_NUMBER%
echo ビルドバージョン: %VERSION%

【start】:プロセスを新規ウィンドウで非同期起動する制御コマンド

ラボの視点 (Insight)
バッチから複数プロセスを並列起動したい時、これがないと全て同期実行で詰む。/WAITの有無でスクリプト設計が180度変わる。

項目内容
start "" "C:\path\app.exe"新規ウィンドウで非同期起動。第1引数は必ずウィンドウタイトル(空でも""必須)
start /B commandウィンドウ生成せず現在のコンソールでバックグラウンド実行
start /WAIT /D "C:\work" app.exe作業ディレクトリ指定+終了待機。バッチの同期処理に必須
start /MIN /LOW calc.exe最小化+低優先度で起動。リソース食うツールの常駐に有効
start https://example.com関連付けで既定ブラウザ起動。URLエンコード不要

🛡 コマンドの要点と注意点

startはプログラムを新規プロセスとして分離起動するため、呼び出し元のバッチは即座に次行へ進む。/WAITなしで後続処理がある場合、起動直後のファイルアクセスや結果待ちで競合が発生する。パスにスペースがある場合、start "" "C:\Program Files\app.exe"のように空文字のタイトル引数が必須。これを忘れるとパスの一部がタイトルとして解釈され起動失敗する。/Bは新規ウィンドウを生成しないがプロセスは別。Ctrl+Cで親バッチが死んでも子は生き残る。

🛠 現場のトラブル解決(一撃解決コマンド)

重い処理を並列実行しつつ全完了を待ちたい時

WAITは直列なので複数プロセスを/Bでバックグラウンド起動後、tasklistループで監視するか、PowerShellのStart-Jobに切り替える。

🚀 実践コード

@echo off
REM 複数ツールを並列起動して全完了後にログ集約
start "backup" /WAIT /MIN robocopy C:\data D:\backup /MIR /LOG:backup.log
start "archive" /WAIT /MIN 7z a -t7z archive.7z C:\temp\* /LOG:archive.log
echo 全処理完了 %date% %time% >> summary.log

REM スペース含むパスの正しい記法(タイトル必須)
start "" "C:\Program Files\VideoLAN\VLC\vlc.exe" "D:\movie.mp4"
REM 低優先度でバックグラウンドエンコード
start /B /LOW ffmpeg -i input.mp4 -c:v libx264 output.mp4
# PowerShellで複数プロセスの真の並列待機
$jobs = @(
Start-Process -FilePath "task1.exe" -PassThru
Start-Process -FilePath "task2.exe" -PassThru
)
$jobs | Wait-Process
Write-Host "全タスク完了"

【timeout】:指定秒数だけスクリプト実行を停止する待機コマンド

ラボの視点 (Insight)
バッチの連続処理で前工程の書き込み完了を待つ、サービス起動後の初期化時間を確保する——sleepの代替として実務では不可欠。

項目内容
timeout 1010秒待機後に次行へ進む。任意のキー押下で即座に中断可能
timeout 30 /nobreak30秒間キー入力を無視して強制待機。自動処理の時間制御に必須
timeout -1無限待機。Ctrl+C以外で中断不可、デバッグ時の停止ポイントとして有効
timeout 0待機なしで即実行。条件分岐での待機スキップに利用

🛡 コマンドの要点と注意点

バッチ内で前処理の完了を待つ、サービス再起動後の安定待機、ログ出力の可読性確保など実行タイミング制御が本質。デフォルトは任意キーで中断されるため、無人運用では/nobreak必須。/tオプションは存在せず秒数を直接指定する構文のみ有効。リダイレクト時は標準入力が無効になるため< nul併用で動作安定。

🛠 現場のトラブル解決(一撃解決コマンド)

サービス再起動後に次処理を実行したいが初期化待ちが必要な時
net stop "ServiceName" && timeout 15 /nobreak > nul && net start "ServiceName"で停止→15秒待機→起動を確実に実行。
タスクスケジューラ連携でログを目視確認してから終了したい時

バッチ末尾にtimeout 5を配置すれば5秒間コンソール表示を保持、キー押下で即終了可能。

🚀 実践コード

@echo off
echo ファイルコピー開始...
robocopy "C:\Source" "D:\Backup" /MIR /R:2 /W:3
echo コピー完了。ネットワークドライブ切断まで10秒待機
timeout 10 /nobreak > nul
net use Z: /delete /yes
echo 処理完了
REM サービス依存関係のある連続起動(DB→Webサーバー)
net start MSSQLSERVER
timeout 20 /nobreak > nul
net start W3SVC

【title】:コマンドプロンプトのタイトルバーを変更

ラボの視点 (Insight)
複数窓を開くエンジニアほど恩恵を受ける。タスクバーの判別が一瞬で終わる。

項目内容
title [文字列]現在のコマンドプロンプトのタイトルバーを指定文字列に変更
title %date% - %computername%環境変数を組み合わせて動的なタイトル生成が可能

🛡 コマンドの要点と注意点

ウィンドウ識別のための視覚的補助コマンド。システムへの影響は皆無だが、スペースを含む文字列でもクォート不要。バッチファイルで処理フェーズごとにタイトル変更すれば、タスクマネージャーから処理状況を即座に把握できる。PowerShellでは$host.ui.RawUI.WindowTitleで同等の操作。

🛠 現場のトラブル解決(一撃解決コマンド)

長時間実行するバッチで進捗を可視化したい時: 各処理ブロックの先頭にtitleを配置。タスクバーを見るだけで現在のフェーズを判別可能。
本番・検証・開発環境を同時操作する時: 接続先ごとに色分けされたタイトルで誤操作を防止。

🚀 実践コード

@echo off
rem 環境判別用タイトル設定
title [PROD] %COMPUTERNAME% - Database Backup
rem 処理フェーズごとのタイトル更新
title [1/3] データベース接続中...
sqlcmd -S server -Q "BACKUP DATABASE..."
title [2/3] ファイル転送中...
robocopy /MIR C:\backup \\server\backup
title [3/3] 完了 - %date% %time%
echo バックアップ完了
pause
# PowerShellでの同等処理
$host.ui.RawUI.WindowTitle = "[PROD] $env:COMPUTERNAME - Deployment"

【where】:実行ファイルの優先度とパスを瞬時に可視化

ラボの視点 (Insight)
PATH衝突時にどの実行ファイルが呼ばれるかを即座に判定。バージョン違いの共存環境では必須の診断ツール。

項目内容
where pythonPATH上のpython.exeを優先順位順に表示。複数インストール時の実行バージョン特定
where /r C:\Users *.dll指定ディレクトリ配下を再帰検索。DLL地獄の原因調査に有効
where $PATH:*.exe環境変数PATH内の全実行ファイルを列挙。システム全体の実行可能コマンド把握
where /q node && echo 存在スクリプト内での存在確認。終了コード0/1で分岐処理

🛡 コマンドの要点と注意点

whereはPATH環境変数の順序に従って検索し、最初に見つかったファイルが実際に実行される。複数結果が表示された場合、最上位が優先実行対象。/rによる全ディスク検索は時間がかかるため、検索範囲を絞ること。拡張子.exeの省略可能だが、ワイルドカード使用時は明示が必要。

🛠 現場のトラブル解決(一撃解決コマンド)

Node.jsのバージョン違いが混在し意図しないバージョンが動く時
where nodeで全パスを確認後、不要なパスを環境変数から除外またはsetx PATHで順序変更。
Pythonスクリプトで特定ツールの有無を判定したい時
where /q git.exeを終了コードで判定し、インストール誘導分岐を実装。

🚀 実践コード

rem 複数Javaバージョンの実行優先度を確認
where java
rem システム全体からnode_modules配下のeslint.cmdを検索
where /r C:\ eslint.cmd
rem バッチファイル内でDocker存在確認と分岐
where /q docker
if %errorlevel% neq 0 (
echo Docker未検出。インストールが必要です。
exit /b 1
)
rem PATH上の全Python関連実行ファイルを抽出
where $PATH:python*

【endlocal】:setlocalで開始したローカル環境変数スコープを閉じる

ラボの視点 (Insight)
バッチ内で環境汚染を防ぐ基本技。ネストも可能で、スコープ管理はプログラミング言語と同じ発想。

項目内容
endlocalsetlocalで作ったローカルスコープを終了、環境変数・カレントディレクトリを呼び出し前の状態に復元
endlocal & set VAR=%VAR%ローカルスコープを抜けつつ変数値を親スコープへ持ち出す(遅延展開の応用)

| | |🛡 コマンドの要点と注意点

setlocalとペアで使用し、バッチ内の環境変数変更を隔離する。バッチ終了時は暗黙的にendlocalが実行されるが、明示的に書くことで意図が明確化され、ネスト構造での早期開放も可能。setlocal未実行時のendlocalは無効だが、エラーも出ない。遅延展開(enabledelayedexpansion)もendlocalで無効化される点に注意。

🛠 現場のトラブル解決(一撃解決コマンド)

関数的処理でローカル変数を使いつつ戻り値を返したい時endlocal & set ""RESULT=%LOCALVAR%""で、ローカルスコープを閉じる瞬間に変数を親へ引き継ぐ。コマンド連結の評価タイミングを利用した定石。

🚀 実践コード

@echo off
set ORIGINAL=GlobalValue
echo Before: %ORIGINAL%
setlocal
set ORIGINAL=LocalValue
set TEMPVAR=OnlyLocal
echo Inside: %ORIGINAL%, %TEMPVAR%
endlocal
echo After: %ORIGINAL%, %TEMPVAR%
REM 出力: GlobalValue, (空白=未定義)
REM 戻り値パターン
setlocal
set RESULT=ComputedValue
endlocal & set "RETURN=%RESULT%"
echo Returned: %RETURN%

【exit】:バッチ処理の終了制御と戻り値の伝播

ラボの視点 (Insight)
/bの有無で挙動が別物。つけなければcmd.exe自体が死ぬ、つければバッチだけ終わる。終了コードは後続処理の分岐条件そのもの。

項目内容
exitcmd.exeプロセス全体を終了。ウィンドウごと消える
exit /b現在のバッチスクリプトのみ終了。呼び出し元に制御を返す
exit /b 1終了コード1で終了。エラーハンドリングや条件分岐の判定材料
exit /b %ERRORLEVEL%直前コマンドの終了コードを引き継いで終了

🛡 コマンドの要点と注意点

/bなしのexitは親プロセスごと道連れにする。バッチからバッチを呼ぶ構造では必ず/bをつけないと呼び出し元まで終了する。終了コードは0が成功、1以上がエラーの慣習。%ERRORLEVEL%は最後に実行されたコマンドの結果を保持しており、if errorlevel 1で分岐可能。

🛠 現場のトラブル解決(一撃解決コマンド)

バッチから別バッチを呼び、失敗時だけ処理を中断したい時
call deploy.bat && echo Success || (echo Failed & exit /b 1)で呼び出し先の終了コードを検知して即座に終了。

🚀 実践コード

@echo off
:: 前提条件チェック→失敗なら即終了
if not exist config.ini (
echo [ERROR] config.ini not found
exit /b 2
)
:: メイン処理
call process.bat
if %ERRORLEVEL% neq 0 (
echo [ERROR] Process failed with code %ERRORLEVEL%
exit /b %ERRORLEVEL%
)
:: 正常終了
echo [INFO] All tasks completed
exit /b 0
# PowerShellでバッチの終了コードを受け取る
cmd /c "your_script.bat"
if ($LASTEXITCODE -ne 0) {
Write-Error "Batch failed: exit code $LASTEXITCODE"
exit $LASTEXITCODE
}

rem】:バッチファイルにコメントを挿入し、後続処理には一切影響を与えない

ラボの視点 (Insight)
デバッグ時の行無効化や引き継ぎドキュメント化に使う。ただし大量に入れるとバッチ実行が遅延するため、パフォーマンスクリティカルな処理ではremより::を選ぶ。

項目内容
rem [コメント文]バッチファイル内にコメント行を挿入。実行時はスキップされる
:: [コメント文]ラベル構文を流用したコメント。remより高速だが、コードブロック内やパイプでは誤動作リスクあり
rem echo 無効化したいコマンド既存コマンドの先頭に付けて一時的に無効化。削除せず保持可能

🛡 コマンドの要点と注意点

remは標準的で安全だが、ループ内や大量実行では処理コストが蓄積する。::は高速だがforループ内や()で囲まれたコードブロック、リダイレクト直後では構文エラーを引き起こす場合がある。プロダクション環境ではrem、開発時の一時コメントアウトは::で使い分けが正解。

🛠 現場のトラブル解決(一撃解決コマンド)

デバッグ中に特定処理だけ無効化したい時: コマンド行頭にremを追加。復元時はremを削除するだけで履歴も残る。
本番バッチで実行ログに処理フェーズを残したい時: remの代わりにecho [Phase 1] データ収集開始で実行ログに記録。

🚀 実践コード

@echo off
rem === サーバーヘルスチェック自動化スクリプト ===
rem 作成日: 2025-01-15 / 担当: システム運用チーム
:: 初期化処理(高速化のため::を使用)
set LOG_FILE=C:\logs\health_%date:~0,4%%date:~5,2%%date:~8,2%.log
rem --- ディスク容量チェック ---
wmic logicaldisk get caption,freespace,size >> %LOG_FILE%
rem 以下は次期リリースまで無効化
rem net use \\backup-server\share /user:admin pass123
rem xcopy C:\data \\backup-server\share /E /Y
echo 処理完了: %LOG_FILE%

🔐 セキュリティ・ユーザー権限管理

【gpresult】:適用中のグループポリシーを可視化する診断コマンド

ラボの視点 (Insight)
ポリシーが効かない時の第一手。OUの階層やリンク順、ループバック処理まで全部出る。HTMLレポートは上司への証跡にもなる。

項目内容
gpresult /r現在のユーザーとコンピューターに適用されているGPOの要約を表示。適用元のOUとGPO名が即座に分かる
gpresult /h C:\report.html全GPO設定をHTML形式で出力。ブラウザで階層構造を視覚的に確認可能、証跡資料に最適
gpresult /scope:computer /vコンピューター構成のみを詳細表示。スコープを絞ることで情報の海に溺れない
gpresult /z > full.txt全詳細をテキストファイルへリダイレクト。レジストリ値やWMIフィルター適用状況まで含む完全ダンプ
gpresult /s RemotePC /u domain\admin /p * /h remote.htmlリモート端末のGPO状態を取得。VPN越しのトラブルシュートで威力を発揮

🛡 コマンドの要点と注意点

グループポリシーの適用結果セット(RSoP)を取得する診断ツール。Active Directory環境で「設定したはずのポリシーが効かない」場合、OUのリンク順、セキュリティフィルタリング、WMIフィルター、ループバック処理のどこで弾かれているかを特定できる。/v/zは出力が膨大なため必ずファイルリダイレクト推奨。管理者権限不要だが、リモート実行時は対象マシンへの管理アクセス権が必要。gpupdateで強制更新後、反映確認の定番セット。

🛠 現場のトラブル解決(一撃解決コマンド)

「新しいGPOを設定したのに端末に反映されない」gpupdate /force実行後にgpresult /rで適用GPO一覧を確認。表示されなければOUリンクかセキュリティフィルタリングの設定ミス。
「ユーザーログオン時のスクリプトが動かない」gpresult /scope:user /v | findstr /i ""script""でログオンスクリプトの適用状況とパスを即座に確認可能。

🚀 実践コード

REM 完全診断セット:GPO更新→結果確認→HTMLレポート生成
gpupdate /force && gpresult /h "%USERPROFILE%\Desktop\GPO_Report_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.html" && echo レポート生成完了
REM リモート端末の緊急診断(パスワード入力プロンプト表示)
gpresult /s CLIENTPC01 /u DOMAIN\AdminUser /p * /scope:computer /h \FileServer\Reports\%COMPUTERNAME%_GPO.html
REM 特定ポリシーの適用状況をピンポイント抽出
gpresult /z | findstr /i "Windows Update"
PowerShellでの構造化データ取得(Get-GPResultantSetOfPolicyの方が高機能)
Get-GPResultantSetOfPolicy -ReportType Html -Path "C:\GPReport_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"

複数リモート端末の一括診断
$computers = @("PC01","PC02","PC03")
$computers | ForEach-Object {
gpresult /s $_ /h "C:\Reports\$($_)_GPO.html"
}

【icacls】:NTFS権限を表示・変更するコマンド

ラボの視点 (Insight)
GUIでは埒が明かない権限トラブルも、icaclsなら1行で解決。継承設定の破壊と再構築が現場の7割を占める。

項目内容
icacls "C:\path"指定パスのACL(アクセス制御リスト)を表示
icacls "C:\path" /grant Users:(OI)(CI)F /tUsersグループにフルコントロールを付与し、サブフォルダ・ファイルへ継承
icacls "C:\path" /remove "DOMAIN\User" /t特定ユーザーのACLエントリを削除(継承含む)
icacls "C:\path" /inheritance:r /t継承されたACLを削除し、明示的な権限のみ残す
icacls "C:\path" /save acl_backup.txt /tACL情報をテキストファイルへバックアップ
icacls "C:\" /restore acl_backup.txtバックアップからACLを復元(パス構造維持が必須)
icacls "C:\path" /setowner "Administrators" /t /c所有者を変更、エラーを無視して継続
icacls "C:\path" /reset /t /c既定の継承されたACLに完全リセット

🛡 コマンドの要点と注意点

icaclsはNTFSのACL操作に特化し、cacls/xcaclsの後継として継承制御(OI/CI)と所有者変更を統合。/deny/grantより優先されるため、deny設定の存在確認が先決。/t(再帰)と/c(エラー継続)の組み合わせは大量ファイル処理で必須だが、誤設定は全ツリーを汚染する。バックアップなしの/reset/inheritance:rは復旧不能なACL破壊を招く。管理者権限でも所有者が異なれば操作失敗するため、/setownerで事前取得が定石。

🛠 現場のトラブル解決(一撃解決コマンド)

「アクセス拒否で削除できないフォルダを強制削除したい」: takeown /f "C:\LockedFolder" /r /d y && icacls "C:\LockedFolder" /grant Administrators:F /t /c && rd /s /q "C:\LockedFolder" で所有権取得→権限付与→削除を一気に実行。
「共有フォルダの権限が継承で滅茶苦茶になった」: icacls "C:\Share" /save acl.bak /t でバックアップ後、icacls "C:\Share" /reset /t /c で継承ツリーを初期化し、必要な明示的権限のみ再設定。

🚀 実践コード

:: 部署フォルダの権限テンプレート適用(継承有効・既存権限保護なし)
icacls "D:\DeptShares\Sales" /inheritance:e
icacls "D:\DeptShares\Sales" /grant:r "CORP\SalesTeam:(OI)(CI)(M)" /t
icacls "D:\DeptShares\Sales" /grant:r "CORP\Managers:(OI)(CI)(F)" /t
icacls "D:\DeptShares\Sales" /remove "Users" /t
:: 権限監査用:全サブフォルダの明示的ACLのみ抽出
for /d /r "C:\Data" %d in (*) do @icacls "%d" | findstr /v "Successfully" | findstr /v "^$"
:: 移行前バックアップと検証
icacls "E:\Archive" /save "E:\ACL_backup_%date:~0,4%%date:~5,2%%date:~8,2%.txt" /t /c
icacls "E:\" /verify "E:\ACL_backup_*.txt"

【NET USER】:Windowsローカルアカウントの作成・削除・パスワード変更を行うコマンド

ラボの視点 (Insight)
一時作業員の追加やトラブル時のアカウント無効化はGUIより圧倒的に速い。ドメイン環境では/DOMAINを付け忘れるとローカルに作ってしまい、後で気づいて青ざめるパターンが定番。

項目内容
net userシステム内の全ユーザーアカウント一覧を表示
net user [ユーザー名]指定ユーザーの詳細情報(パスワード期限、最終ログイン、アカウント有効状態)を表示
net user [名前] [パスワード] /add新規ローカルユーザーを作成
net user [名前] /delete指定ユーザーを完全削除
net user [名前] /active:noアカウントを無効化(削除せずロック)
net user [名前] /expires:2024/12/31アカウント有効期限を設定
net user [名前] * /domainドメインユーザーのパスワードを対話式で変更

🛡 コマンドの要点と注意点

管理者権限必須。パスワードをコマンドラインに直書きするとイベントログに残るため、機密性が高い場合は*で対話式入力を使う。/DOMAINオプションはドメイン参加PCでのみ有効で、ローカル操作と混同するとまったく別のアカウントを触ってしまう。アカウント削除は即座に実行され、ユーザープロファイルは残るがログイン不可になる点に注意。

🛠 現場のトラブル解決(一撃解決コマンド)

パスワードを忘れた管理者アカウントを復旧したい時:セーフモードで起動しnet user administrator *でパスワードリセット。
退職者アカウントを即座に無効化したい時net user [退職者名] /active:noで削除せずロック、データ引継ぎ後に/deleteで完全削除。

🚀 実践コード

REM 一時作業員用アカウントを30日間限定で作成し、Usersグループに追加
net user tempworker P@ssw0rd123 /add /expires:2024/12/31
net localgroup Users tempworker /add
REM 全ユーザーのパスワード有効期限を一括確認
for /f "skip=4 tokens=1" %u in ('net user') do @net user %u | findstr /C:"パスワードの有効期限"
REM ドメイン環境で特定ユーザーの詳細をリモート確認
net user jsmith /domain
# 複数の一時アカウントを一括作成し、即座に無効化(事前準備用)
1..5 | ForEach-Object { net user "temp$_" "TempPass$_!" /add /active:no }
# パスワード期限切れ間近のローカルユーザーを検出
net user | Select-String -Pattern "^\w+" | ForEach-Object {
$user = $_.Matches.Value
net user $user | Select-String -Pattern "パスワードの有効期限"
}

【whoami】:実行中のユーザーコンテキストとトークン情報を即座に確認

ラボの視点 (Insight)
「何の権限で動いているか」を見誤ると設定変更もトラブル対応も全て空振りする。runas後やタスクスケジューラ経由の実行では特に必須の確認作業。

項目内容
whoami現在の実行ユーザーを「ドメイン\ユーザー名」形式で表示
whoami /userSID(セキュリティ識別子)を含めたユーザー情報を出力、アカウント移行時の同定に使える
whoami /priv現在のトークンが持つ特権一覧を表示、SeDebugPrivilegeやSeBackupPrivilegeの有効/無効状態を確認
whoami /groups所属グループとその属性(Mandatory/Enabled等)を列挙、昇格後のAdministrators所属確認に使用
whoami /all上記すべての情報を一括出力、トラブル時の証跡として全情報を取得

🛡 コマンドの要点と注意点

/privで表示される特権の「状態」列が重要。Enabledでなければ権限があっても使えない。UAC昇格済みでも一部特権はデフォルトDisabledのため、管理者プロンプトで実行しても期待する権限が得られない場合がある。ドメイン環境ではグループポリシー適用タイミングで所属グループが変動するため、作業前の確認が鉄則。

🛠 現場のトラブル解決(一撃解決コマンド)

管理者昇格が本当に効いているか確認したい時: whoami /groups | findstr AdministratorsでAdministrators行の属性を確認、Mandatory LabelがHighなら昇格成功。
バッチやタスクで実行ユーザーを記録したい時: whoami /user /fo csvでCSV形式出力、ログへの追記や監査証跡に最適。

🚀 実践コード

:: 管理者権限での実行確認(昇格判定)
whoami /groups | findstr /C:"S-1-16-12288" >nul && echo 昇格済み || echo 要昇格
:: トラブル時の権限情報フルダンプ(ログファイル出力)
whoami /all > "%TEMP%\whoami_log_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt"
:: 特定特権の有効性チェック(SeBackupPrivilege例)
whoami /priv | findstr SeBackupPrivilege | findstr Enabled
# PowerShellで権限チェックと分岐処理
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) { Write-Error "管理者権限で実行してください"; exit 1 }
# 現在のトークン情報を構造化して取得
whoami /priv /fo csv | ConvertFrom-Csv | Where-Object { $_.'State' -eq 'Enabled' }

【cmdkey】:リモートアクセス用の認証情報をOSに埋め込むコマンド

ラボの視点 (Insight)
資格情報マネージャーのCLI版。ログオンスクリプトや夜間バッチで複数サーバーへ自動接続する際、毎回対話認証を回避するために使う。

項目内容
cmdkey /add:ターゲット名 /user:ユーザー名 /pass:パスワード指定リソースへの認証情報を資格情報マネージャーに登録。次回アクセス時から自動認証が有効になる
cmdkey /list現在保存されている全資格情報を表示。ターゲット名と種類のみ確認可能、パスワードは表示されない
cmdkey /delete:ターゲット名指定リソースの認証情報を削除。アクセス権剥奪やセキュリティ監査時に使用
cmdkey /add:ターゲット名 /user:ユーザー名パスワード省略時はプロンプトで入力要求。スクリプト履歴に平文パスワードを残さない安全な登録方法

🛡 コマンドの要点と注意点

資格情報は%USERPROFILE%\AppData\Local\Microsoft\Credentials配下に暗号化保存されるが、同一ユーザーでログオンすれば復号可能。バッチファイルに/passを直書きすると履歴やログから漏洩リスクあり。net useとの違いは、cmdkeyは認証情報の登録のみで接続は行わない点。登録後にmstscnet useを実行すると自動的に認証が通る。

🛠 現場のトラブル解決(一撃解決コマンド)

夜間バッチで複数共有フォルダへ順次アクセスする際、認証ダイアログで止まる問題

事前に全ターゲットへcmdkeyで認証登録しておけば、スクリプト実行中の対話要求が発生しない。

ドメイン資格情報とローカル資格情報が競合してアクセス拒否される場合
cmdkey /listで既存登録を確認し、競合するターゲットを/deleteで削除後に正しい認証情報を再登録。

🚀 実践コード

REM 複数サーバーへ一括で資格情報登録(バッチ自動化用)
cmdkey /add:fileserver01 /user:domain\admin /pass:P@ssw0rd
cmdkey /add:fileserver02 /user:domain\admin /pass:P@ssw0rd
cmdkey /add:192.168.1.50 /user:localadmin /pass:AdminPass
REM 登録確認
cmdkey /list
REM net useと組み合わせて即座にドライブマウント
net use Z: \\fileserver01\share
net use Y: \\fileserver02\backup
REM 作業終了後は認証情報を削除(セキュリティ対策)
cmdkey /delete:fileserver01
cmdkey /delete:fileserver02
cmdkey /delete:192.168.1.50
# PowerShellで安全にパスワードを扱う方法
$target = "192.168.1.100"
$user = "admin"
$pass = Read-Host "パスワードを入力" -AsSecureString
$credential = New-Object System.Management.Automation.PSCredential($user, $pass)
# cmdkeyへ渡すために平文変換(一時的)
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
cmdkey /add:$target /user:$user /pass:$plainPass
# 使用後即座にメモリからクリア
Remove-Variable plainPass

❓ よくある質問(FAQ)

長大なコマンドガイドをより安全・確実に活用するためのポイントをまとめました。

コマンドを実行しても「アクセスが拒否されました」と表示されます。

ほとんどの場合、「管理者権限」が不足しています。 Windowsボタンを右クリックし、「ターミナル(管理者)」または「コマンドプロンプト(管理者)」を選択して実行してください。特にシステム修復(sfc, dism)やネットワーク設定(netsh, arpの変更)には必須です。

PowerShellがあるのに、なぜ今さら「コマンドプロンプト」を学ぶのですか?

「軽量さ」「互換性」「バッチファイルの資産」という3つの圧倒的メリットがあるからです。 PowerShellは強力ですが、起動が重く、実行ポリシー制限(Execution Policy)に阻まれることがあります。一方、コマンドプロンプトはあらゆるWindows環境で即座に、かつ確実に動作します。現場のエンジニアにとって「枯れた技術」ほど信頼できるものはありません。

コマンドの結果をテキストファイルに保存して共有したいです。

コマンドの末尾に > filename.txt を付け足してください。 画面に表示されるはずの内容がすべてファイルに書き出されます。

例:ipconfig /all > network_info.txt

パス(ファイル場所)にスペースが含まれる場合にエラーが出ます。

パス全体をダブルクォーテーション " で囲んでください。 Windowsはスペースを「コマンドの区切り」と誤認します。"C:\Program Files\..." のように囲むことで、1つのパスとして正しく認識されます。

実行したコマンドを途中で強制終了したい時は?

キーボードの Ctrl + C を押してください。 ping -t などの無限ループや、時間がかかりすぎている処理を安全にストップさせることができます。

以前実行したコマンドをもう一度呼び出すには?

キーボードの「上矢印キー(↑)」を押してください。 履歴をさかのぼって再実行できます。また、F7 キーを押すと実行履歴がリスト形式で表示され、さらに便利です。


著者から:このガイドを使い倒すためのコツ

このガイドは10万文字に迫る「辞書」です。最初から最後まで読むのではなく、以下の使い道をおすすめします。

  1. ブラウザの検索機能(Ctrl + F)を活用する: 「IP」「削除」「修復」などのキーワードでページ内を検索するのが最短ルートです。
  2. まずは「ラボの視点」だけを流し読みする: 各コマンドの「急所」だけを把握しておけば、いざという時の判断スピードが劇的に上がります。
  3. 「実践コード」を自分のメモ帳にストックする: 現場で頻用する組み合わせを自分なりにカスタマイズしていきましょう。

まとめ

コマンドプロンプトの真価は、単体コマンドの実行ではなく、パイプやリダイレクト、バッチ化による「自動化」にある。

現場でトラブルに直面した際は、本ガイドを辞書として活用してほしい。GUIでは数十分かかる作業が、正しいコマンド一行で数秒で終わる。その圧倒的な効率こそが、エンジニアがコマンドを学ぶ最大の理由だ。

Tamaglo

最後までお読みいただきありがとうございました。