Windows11でnetshコマンドの結果を変数に格納するには?

Windows
記事内に広告が含まれています。

Windows 11でnetshコマンドを実行し、その結果を変数に格納する方法はいくつかあります。
通常、コマンドの出力を変数に格納する目的は、スクリプト内で処理を行うためです。
ここでは、主に「バッチファイル」と「PowerShell」の2つの方法について詳しく解説します。

バッチファイルでnetshの結果を変数に入れる方法

Windowsのバッチファイル(.bat)では、forコマンドを使ってコマンドの出力を変数に格納できます。
例えば、Wi-FiのSSID一覧を取得して変数に格納したい場合、以下のように記述します。
これで正しく動きそうですが。。。

@echo off
for /f "delims=" %%A in ('netsh wlan show profiles') do (
    set "output=%%A"
    echo %output%
)
pause

上記のスクリプトではうまく動作しませんでした!
私の環境では文字化けもしてしまいました。

このスクリプトは、netsh wlan show profilesの出力を1行ずつ処理し、outputという変数に格納して表示します。
ただし、バッチファイルの変数の性質上、forループ内で格納した値を使用する場合は、enabledelayedexpansionを有効にし、!output!のように!で変数を囲む必要があります。
さらにコマンドプロンプトのエンコーディングとnetshのエンコーディングが一致していないと文字化けが発生します。
今回の例では”netsh wlan show profiles“の出力がUTF-8(またはUTF-16) でエンコードされていて、Shift-JIS(コードページ932)のコマンドプロンプトで直接出力すると、文字化けが発生しました。

解決策

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
for /f "delims=" %%A in ('netsh wlan show profiles') do (
    set "output=%%A"
    echo !output!
)
endlocal
pause

上記ではバッチファイルの最初に chcp 65001(UTF-8)を追加し、文字化け対策しています。
>nul は、余計な表示を抑えるために >nul を追加しています。
※文字化けが発生しない場合は上記の処理は必要ありません。
そして”setlocal enabledelayedexpansion“で遅延環境変数の展開を有効に設定し、netshの結果を格納した変数の値を!output!で表示しています。

PowerShellでnetshの結果を変数に入れる方法

バッチファイルよりも柔軟に処理を行いたい場合は、PowerShellを利用するのが便利です。
PowerShellでは、コマンドの出力を簡単に変数に格納できます。

$output = netsh wlan show profiles
Write-Output $output

このスクリプトは、netsh wlan show profilesの出力を$outputという変数に格納し、後で表示しています。
PowerShellの変数は、文字列のリスト(配列)として扱われるため、特定の行だけを取得したり、フィルタリングしたりするのも簡単です。

こちらも文字化けが発生した場合には以下のようにすると良いです。

$output = cmd /c "netsh wlan show profiles" | Out-String
Write-Output $output

例えば、Wi-Fiプロファイル名(SSID)だけを抽出したい場合は、次のように記述できます。

$output = netsh wlan show profiles | Select-String "すべてのユーザープロファイル"
$ssids = $output -replace "    すべてのユーザープロファイル : ",""
Write-Output $ssids

このスクリプトは、Select-Stringを使ってWi-Fiプロファイル名が含まれる行を抽出し、-replaceを使って不要な文字を削除しています。
これにより、Wi-Fiプロファイル名だけが取得できます。

netshの結果をファイルに保存して後で読み込む方法

netshコマンドの出力を変数に格納する方法として、まず一度ファイルに保存し、その後でファイルの内容を変数に読み込む方法もあります。

バッチファイルの場合:

@echo off
netsh wlan show profiles > output.txt
set /p output=<output.txt
echo %output%

この方法は、コマンドの出力が長い場合や、特定の行を処理したいときに便利です。

PowerShellの場合は、次のように記述できます。

netsh wlan show profiles > output.txt
$output = Get-Content output.txt
Write-Output $output

このようにすれば、Get-Contentを使ってファイルの内容を読み込み、変数に格納できます。

まとめ

Windows 11でnetshコマンドの出力を変数に格納するには、バッチファイルのforコマンドやPowerShellの変数を活用できます。
バッチファイルではenabledelayedexpansionを有効にする必要があり、PowerShellではSelect-StringGet-Contentを使うと便利です。
また、長い出力を処理する場合は、ファイルに保存してから読み込む方法も有効です。
用途に応じて適切な方法を選択すると、スクリプトの利便性が向上します。

免責規定

この記事で提供される情報は、一般的なガイダンスを目的としており、すべての環境やシステムでの動作を保証するものではありません。
OSのバージョンやリリースによっては、記載されている事が実行できない、または異なる結果をもたらす可能性があります。
また、会社所有のパソコン、スマホ、タブレットなどでは、ポリシーや権限によって実行できない場合があります。
この記事の情報を使用することによって生じる問題や結果について、筆者およびサイト管理者は責任を負いません。
すべての操作は自己責任で行ってください。

最後までお読みいただきありがとうございました。
またお会いしましょう!

コメント

タイトルとURLをコピーしました