【bat】バッチファイルでコンピューター名を取得する方法完全ガイド|%COMPUTERNAME%・wmic・hostname・条件分岐・実践例まで徹底解説

【bat】バッチファイルでコンピューター名を取得する方法 bat

バッチファイルでコンピューター名を取得したい場面は意外と多くあります。たとえばPC名をログに残すPC名で処理を分岐するPC別にフォルダを分けてファイルを整理するといった使い方です。本記事では %COMPUTERNAME% 環境変数を中心に、hostname コマンドや wmic による取得方法、for /f を使った変数への格納方法、そして実践的な応用パターンを完全解説します。

この記事でわかること

  • %COMPUTERNAME% でコンピューター名を即座に取得する方法
  • hostname / wmic コマンドとの違いと使い分け
  • for /f で外部コマンド結果を変数に格納するパターン
  • コンピューター名で処理を分岐・フォルダ分け・ログ記録する応用例
  • 実践例3本(PC名付きログ管理・PC別フォルダ整理・複数PC設定切り替え)
スポンサーリンク

1. コンピューター名取得の3手法比較

Windowsバッチファイルでコンピューター名を取得する方法は主に3つあります。それぞれの特徴を理解して、用途に合った手法を選びましょう。

手法 記述例 取得速度 主な用途
%COMPUTERNAME% echo %COMPUTERNAME% 最速(展開済み変数) 基本的なPC名取得、条件分岐
hostname hostname 速い(外部コマンド) コマンド結果の確認・比較用途
wmic wmic computersystem get name 遅め(WMI経由) PC名以外のシステム情報と同時取得
通常は %COMPUTERNAME% 一択
速度・可読性ともに %COMPUTERNAME% が最も優れています。hostnamewmic は、外部コマンド結果を for /f で取得する練習としては有益ですが、PC名を取得するだけなら %COMPUTERNAME% を使いましょう。

2. %COMPUTERNAME% でコンピューター名を取得する(基本)

%COMPUTERNAME% はWindowsが自動的に設定するシステム環境変数です。追加のコマンドなしに、変数展開だけでPC名を即座に取得できます。環境変数の使い方を理解しておくとより活用の幅が広がります。

2-1. 基本の表示

@echo off
echo コンピューター名: %COMPUTERNAME%
pause

実行結果の例(PC名が MYPC-001 の場合):

コンピューター名: MYPC-001

2-2. 変数に格納して使い回す

%COMPUTERNAME% はそのまま使える変数ですが、スクリプト内で何度も参照する場合は自分の変数に格納しておくと管理しやすくなります。

@echo off
set "PC_NAME=%COMPUTERNAME%"
echo PC名: %PC_NAME%
echo ログファイル: %PC_NAME%_log.txt
pause
set に引用符をつける理由
set "変数名=値" の形式で引用符を付けると、行末の空白や & などの特殊文字が変数に入り込むのを防げます。set PC_NAME=%COMPUTERNAME% でも動きますが、引用符ありの書き方が安全です。

2-3. 大文字・小文字の処理

%COMPUTERNAME%常に大文字で返ります(例: MYPC-001)。もし小文字に変換したい場合はPowerShellを使う必要があります。

@echo off
:: %COMPUTERNAME% は常に大文字で返る
echo 大文字: %COMPUTERNAME%

:: 小文字にしたい場合はPowerShellを経由
for /f "delims=" %%i in ('powershell -NoProfile -Command "[System.Environment]::MachineName.ToLower()"') do set "PC_LOWER=%%i"
echo 小文字: %PC_LOWER%
pause

3. hostname コマンドで取得する

hostname は外部コマンドとして実行されるため、for /f と組み合わせて変数に格納する方法をとります。外部コマンドの結果を変数に格納する方法の基本パターンです。

@echo off
:: hostname コマンドの結果を変数に格納
for /f "delims=" %%i in ('hostname') do set "PC_NAME=%%i"
echo コンピューター名: %PC_NAME%
pause

%COMPUTERNAME%hostname は通常同じ値を返しますが、厳密には以下の違いがあります。

比較項目 %COMPUTERNAME% hostname
値の形式 常に大文字 OSの設定に依存(通常大文字)
取得タイミング セッション開始時に展開済み コマンド実行時に取得
ドメイン環境 NetBIOS名 DNS名(FQDN対応)
処理速度 最速 外部コマンドのため若干遅い

4. wmic コマンドで詳細なPC情報と一緒に取得する

wmic computersystem get name はPC名に加えて、モデル名・製造元・メモリ情報などのシステム情報をまとめて取得できます。PC名だけなら %COMPUTERNAME% で十分ですが、システム情報の収集スクリプトでは wmic がよく使われます。

wmic は Windows 11 / Server 2025 以降では非推奨
Microsoftは wmic を非推奨(deprecated)とし、PowerShellへの移行を推奨しています。Windows 10/11でも現時点では動作しますが、将来のWindowsで削除される可能性があります。新規スクリプトでは %COMPUTERNAME% や PowerShell を優先しましょう。

4-1. wmic でPC名を取得する

@echo off
:: wmic の出力(ヘッダー含む)を for /f で変数に格納
for /f "skip=1 tokens=* delims= " %%i in ('wmic computersystem get name') do (
    if not "%%i"=="" set "PC_NAME=%%i"
)
echo コンピューター名: %PC_NAME%
pause

skip=1 でヘッダー行(”Name”)をスキップし、if not "%%i"=="" で空行を除外しています。wmic の出力は末尾にスペースが入ることがあるため、比較処理で使う場合は後述のトリミング処理を組み合わせましょう。

4-2. wmic でPC名とモデル名を同時取得する

@echo off
:: PC名とモデル名を同時取得(システム台帳スクリプトなどに活用)
for /f "skip=1 tokens=1,2 delims=," %%i in ('wmic computersystem get name^,model /format:csv') do (
    if not "%%i"=="" (
        set "PC_NAME=%%i"
        set "PC_MODEL=%%j"
    )
)
echo PC名  : %PC_NAME%
echo モデル: %PC_MODEL%
pause

5. コンピューター名で処理を分岐する

コンピューター名を使った条件分岐は、複数台のPCで同じバッチを使いながら、PC別に処理を変えるときに役立ちます。たとえば開発機・テスト機・本番機で接続先サーバーや処理内容を自動的に切り替えられます。

5-1. 特定のPCのみ処理を実行する

@echo off
set "PC_NAME=%COMPUTERNAME%"

:: 特定のPCのみ処理を実行
if "%PC_NAME%"=="SERVER-01" (
    echo サーバー処理を実行します
    call :server_task
) else (
    echo このPCではサーバー処理を実行しません
)
goto :end

:server_task
echo [%PC_NAME%] バックアップを開始...
exit /b

:end
pause

5-2. PC名のプレフィックスで分岐する(部分一致)

if 文は完全一致しか判定できません。「PC名が DEV- で始まる場合」のような前方一致は、findstr を組み合わせて判定します。

@echo off
set "PC_NAME=%COMPUTERNAME%"

:: PC名に "DEV-" が含まれるか判定
echo %PC_NAME% | findstr /i "^DEV-" >nul 2>&1
if %errorlevel%==0 (
    echo 開発機です: %PC_NAME%
    set "ENV=development"
) else (
    echo %PC_NAME% | findstr /i "^PROD-" >nul 2>&1
    if %errorlevel%==0 (
        echo 本番機です: %PC_NAME%
        set "ENV=production"
    ) else (
        echo その他のPC: %PC_NAME%
        set "ENV=unknown"
    )
)
echo 環境: %ENV%
pause

5-3. PC名リストファイルとの照合

許可するPC名のリストをテキストファイルに用意しておき、実行PCがリストに含まれるか確認するパターンです。管理対象PCが多い場合に有効です。

@echo off
:: allowed_pcs.txt の内容例:
::   SERVER-01
::   PC-ADMIN
::   BACKUP-SRV

set "PC_NAME=%COMPUTERNAME%"
set "ALLOWED_LIST=allowed_pcs.txt"

if not exist "%ALLOWED_LIST%" (
    echo エラー: 許可リストファイルが見つかりません
    exit /b 1
)

findstr /i /x "%PC_NAME%" "%ALLOWED_LIST%" >nul 2>&1
if %errorlevel%==0 (
    echo [OK] %PC_NAME% は許可リストに含まれています
    call :main_task
) else (
    echo [NG] %PC_NAME% は許可リストにありません。処理を中止します
    exit /b 1
)
exit /b

:main_task
echo メイン処理を実行...
exit /b

6. コンピューター名をログに記録する

バッチ処理のログにコンピューター名を含めると、複数PCで共有フォルダに書き込む場合でも、どのPCからの記録かが一目でわかります。IPアドレスをログに記録する方法と組み合わせると、より詳細なトレースができます。

6-1. コンピューター名付きログの基本

@echo off
set "PC_NAME=%COMPUTERNAME%"
set "LOG_FILE=%~dp0execution_log.txt"

:: 日時とPC名をログに記録
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"
for /f "tokens=1-3 delims=: " %%a in ("%TIME: =0%") do set "NOW=%%a:%%b:%%c"
echo [%TODAY% %NOW%] [%PC_NAME%] 処理を開始 >> "%LOG_FILE%"

echo 処理を実行中...

echo [%TODAY% %NOW%] [%PC_NAME%] 処理を完了 >> "%LOG_FILE%"
echo ログに記録しました: %LOG_FILE%
pause

6-2. PC名をファイル名に使う

PC名をログファイル名に含めると、複数PCのログを同じフォルダに集約しても衝突しません。日付をファイル名に使う方法と組み合わせるとさらに便利です。

@echo off
set "PC_NAME=%COMPUTERNAME%"

:: 今日の日付を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"

:: PC名 + 日付をファイル名に使う
set "LOG_FILE=%~dp0logs\%PC_NAME%_%TODAY%.txt"

:: logsフォルダがなければ作成
if not exist "%~dp0logs" mkdir "%~dp0logs"

echo 処理開始 >> "%LOG_FILE%"
echo ログファイル: %LOG_FILE%
pause

出力例(MYPC-001 で 2024/10/15 に実行した場合):

ログファイル: C:\scripts\logs\MYPC-001_20241015.txt

7. 取得したコンピューター名の末尾空白を除去する

wmic や一部の外部コマンドから取得したPC名には、末尾に余計な空白が含まれることがあります。このまま比較すると意図しないミスマッチが起きるため、トリミングが必要です。

@echo off
setlocal enabledelayedexpansion

:: wmic で取得(末尾空白が含まれる可能性あり)
for /f "skip=1 tokens=* delims= " %%i in ('wmic computersystem get name') do (
    if not "%%i"=="" set "PC_RAW=%%i"
)
echo 生の値: [%PC_RAW%]

:: 末尾空白を除去するループ
:trim_loop
if "!PC_RAW:~-1!"==" " (
    set "PC_RAW=!PC_RAW:~0,-1!"
    goto trim_loop
)
echo トリム後: [%PC_RAW%]
pause
%COMPUTERNAME% は末尾空白なし・トリミング不要
%COMPUTERNAME% で取得した値は末尾空白が入りません。wmic や for /f 経由の取得値だけトリミングを検討してください。

8. 実践例3本

実践例1:PC名・ユーザー名・IPアドレスを一括でシステム台帳に記録する

コンピューター名・ログインユーザー名IPアドレスをまとめて共有フォルダのCSVファイルに記録するスクリプトです。社内PC管理や棚卸し作業に活用できます。

@echo off
setlocal enabledelayedexpansion

:: ─── 基本情報取得 ───────────────────────────────────
set "PC_NAME=%COMPUTERNAME%"
set "USER_NAME=%USERNAME%"

:: IPアドレスを取得(IPv4のみ)
for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr /i "IPv4"') do (
    set "IP_ADDR=%%i"
    set "IP_ADDR=!IP_ADDR: =!"
    goto :got_ip
)
:got_ip

:: 日時を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a/%%b/%%c"
for /f "tokens=1-3 delims=: " %%a in ("%TIME: =0%") do set "NOW=%%a:%%b:%%c"

:: ─── 出力先 ─────────────────────────────────────────
:: 共有フォルダのCSVに追記(ヘッダーがなければ追加)
set "CSV_FILE=\\server\share\pc_inventory.csv"
if not exist "%CSV_FILE%" (
    echo 記録日時,PC名,ユーザー名,IPアドレス > "%CSV_FILE%"
)

echo %TODAY% %NOW%,%PC_NAME%,%USER_NAME%,%IP_ADDR% >> "%CSV_FILE%"

echo [記録完了]
echo  PC名    : %PC_NAME%
echo  ユーザー: %USER_NAME%
echo  IP      : %IP_ADDR%
echo  記録先  : %CSV_FILE%
pause

実践例2:PC名ごとにバックアップフォルダを分けて管理する

複数台のPCから同じバックアップ先フォルダを使う場合に、PC名サブフォルダを自動作成して整理するスクリプトです。稼働時間をログに記録するバッチと組み合わせると、PC別の稼働管理もできます。

@echo off
setlocal enabledelayedexpansion

set "PC_NAME=%COMPUTERNAME%"
set "SRC=%USERPROFILE%\Documents"
set "BACKUP_ROOT=D:\Backups"

:: 日付を取得
for /f "tokens=1-3 delims=/ " %%a in ("%DATE%") do set "TODAY=%%a%%b%%c"

:: PC名+日付でバックアップフォルダを作成
set "DEST=%BACKUP_ROOT%\%PC_NAME%\%TODAY%"
if not exist "%DEST%" mkdir "%DEST%"

echo バックアップ開始: %PC_NAME% → %DEST%

:: robocopy でバックアップ(差分のみ)
robocopy "%SRC%" "%DEST%" /mir /xo /r:2 /w:3 /log:"%BACKUP_ROOT%\%PC_NAME%\backup_%TODAY%.log"

if %errorlevel% lss 8 (
    echo [成功] バックアップ完了: %DEST%
) else (
    echo [エラー] バックアップ失敗。ログを確認してください
)
pause

実践例3:PC名で設定ファイルを自動切り替えして初期設定を実行する

開発・テスト・本番の各PC名に応じて、読み込む設定ファイルを自動的に切り替えるスクリプトです。同じバッチを複数環境で共有しながら、PC別の初期設定を自動化できます。

@echo off
setlocal enabledelayedexpansion

set "PC_NAME=%COMPUTERNAME%"
set "CONFIG_DIR=%~dp0config"

:: ─── PC名 → 環境名 のマッピング ─────────────────────
set "ENV_NAME=unknown"

echo %PC_NAME% | findstr /i "^DEV-" >nul 2>&1
if %errorlevel%==0 set "ENV_NAME=development"

if "%ENV_NAME%"=="unknown" (
    echo %PC_NAME% | findstr /i "^TEST-" >nul 2>&1
    if !errorlevel!==0 set "ENV_NAME=testing"
)

if "%ENV_NAME%"=="unknown" (
    echo %PC_NAME% | findstr /i "^PROD-" >nul 2>&1
    if !errorlevel!==0 set "ENV_NAME=production"
)
if "%ENV_NAME%"=="unknown" (
    echo %PC_NAME% | findstr /i "^SRV-" >nul 2>&1
    if !errorlevel!==0 set "ENV_NAME=production"
)

echo PC名  : %PC_NAME%
echo 環境  : %ENV_NAME%

:: ─── 環境別設定ファイルを読み込む ───────────────────
set "CONFIG_FILE=%CONFIG_DIR%\%ENV_NAME%.cfg"

if not exist "%CONFIG_FILE%" (
    echo エラー: 設定ファイルが見つかりません: %CONFIG_FILE%
    exit /b 1
)

for /f "usebackq tokens=1,* delims==" %%a in ("%CONFIG_FILE%") do (
    if not "%%a"=="" set "%%a=%%b"
)

echo サーバー: %SERVER_HOST%
echo DBパス : %DB_PATH%
echo 設定読み込み完了。初期設定を実行します...
pause

config\development.cfg の内容例:

SERVER_HOST=dev-server.local
DB_PATH=D:\dev\database
LOG_LEVEL=debug

9. まとめ:コンピューター名取得チートシート

やりたいこと コード 備考
PC名を表示する echo %COMPUTERNAME% 最もシンプル
PC名を変数に格納 set "PC=%COMPUTERNAME%" スクリプト内での使い回しに
hostname で取得・格納 for /f "delims=" %%i in ('hostname') do set "PC=%%i" DNS名を使いたい場合
wmic で取得(非推奨) for /f "skip=1 tokens=*" %%i in ('wmic computersystem get name') do ... 他のシステム情報と同時取得
PC名が一致するか確認 if "%COMPUTERNAME%"=="対象PC名" ... 完全一致の条件分岐
PC名が特定文字列を含む echo %COMPUTERNAME% | findstr /i "文字列" >nul 前方一致・部分一致に
PC名をログファイル名に set "LOG=%COMPUTERNAME%_%TODAY%.txt" 複数PCのログを区別
PC名でフォルダを分ける set "DIR=backup\%COMPUTERNAME%" PC別バックアップ管理

FAQ

Q%COMPUTERNAME% が空になってしまいます。

A%COMPUTERNAME% が空になる場合は、@echo off の前に setlocal がないか確認してください。また、set COMPUTERNAME= のように誤って上書きしていないか確認しましょう。echo %COMPUTERNAME% を直接コマンドプロンプトで実行して値が出れば、バッチ内の変数操作で上書きされている可能性があります。

Qコンピューター名を変更するにはどうすればよいですか?

Aバッチファイルからコンピューター名を変更するには管理者権限が必要です。wmic computersystem where name="%COMPUTERNAME%" call rename name="新しいPC名"netdom renamecomputer %COMPUTERNAME% /NewName:新しいPC名 /Force が使えます。変更後は再起動が必要です。なお、ドメイン参加済みPCでは追加の手順が必要な場合があります。

QFQDN(完全修飾ドメイン名)を取得したい場合は?

A%COMPUTERNAME% はNetBIOS名(短い名前)を返します。FQDN(例: mypc.example.com)を取得したい場合は、for /f %%i in ('powershell -NoProfile -Command "[System.Net.Dns]::GetHostEntry('').HostName"') do set "FQDN=%%i" を使います。

Q%COMPUTERNAME% と hostname の結果が違います。

Aドメイン環境では %COMPUTERNAME%(NetBIOS名)と hostname(DNS名)が異なる場合があります。例えば %COMPUTERNAME%MYPC でも、hostnamemypc.corp.example.com になることがあります。短いPC名で比較したい場合は %COMPUTERNAME% を使いましょう。

QリモートPCのコンピューター名を取得するには?

Anbtstat -A リモートIPアドレスping -a リモートIPアドレス でリモートPCのNetBIOS名を調べられます。管理者権限があれば wmic /node:"リモートPC名" computersystem get name で直接取得も可能です。リモートPC管理には 複数PCに一括コマンドを送る方法 も参照してください。

Qタスクスケジューラで実行したときに %COMPUTERNAME% が空になります。

Aタスクスケジューラで実行するバッチは環境変数の読み込み方が対話型セッションと異なります。スケジューラの「プログラム/スクリプト」欄に cmd.exe、引数に /c "バッチファイルのフルパス" と指定し、「ログオン時に実行」か「ログオンしているかどうかにかかわらず実行」に設定すると%COMPUTERNAME% が正しく展開されます。