はじめに
テスト環境のLinuxサーバーにある特定のフォルダをWindowsへ転送する作業を自動化する方法をまとめます。
実行環境
- Windows11
- Linux(Debian)
全体の流れ
初回のみ
├─ register_wifi.bat でWi-Fi登録
通常使用
└─ download.bat でフォルダ転送
実装
1. 初回のみ
register_wifi.bat
@echo off
chcp 65001 > nul
setlocal
set SSID_PREFIX=WiFi-
set WIFI_PASSWORD=YourWiFiPassword123
set /p SSID_SUFFIX="Wi-Fi末尾: "
if "%SSID_SUFFIX%"=="" echo 入力なし && pause && exit /b 1
set FULL_SSID=%SSID_PREFIX%%SSID_SUFFIX%
netsh wlan show profiles | find "%FULL_SSID%" > nul 2>&1
if not errorlevel 1 echo 既に登録済み && pause && exit /b 0
echo 登録中
set XML=%TEMP%\wifi_%RANDOM%.xml
powershell -Command "$ssid='%FULL_SSID%';$pass='%WIFI_PASSWORD%';\"$ssid$ssidESSautoWPA2PSKAESfalsepassPhrasefalse$pass\" | Out-File '%XML%' -Encoding UTF8"
netsh wlan add profile filename="%XML%" > nul 2>&1
del "%XML%" 2> nul
if errorlevel 1 (echo 失敗) else (echo 完了: %FULL_SSID%)
pause
使い方
- 設定値を編集
- バッチファイルを実行
- SSID末尾を入力(例 - 1234)
2. フォルダ転送(通常使用)
download.bat
@echo off
chcp 65001 > nul
setlocal
set LINUX_IP=IPアドレス
set LINUX_USER=root
set LINUX_PASSWORD=Password123
set REMOTE_FOLDER=/root/data
set LOCAL_FOLDER=C:\LinuxData
set SSID_PREFIX=WiFi-
if exist "C:\Program Files (x86)\WinSCP\WinSCP.com" set W=C:\Program Files (x86)\WinSCP\WinSCP.com
if exist "C:\Program Files\WinSCP\WinSCP.com" set W=C:\Program Files\WinSCP\WinSCP.com
if "%W%"=="" echo WinSCP未検出 && pause && exit /b 1
set /p S="Wi-Fi末尾: "
if "%S%"=="" echo 入力なし && pause && exit /b 1
set FULL_SSID=%SSID_PREFIX%%S%
netsh wlan show profiles | find "%FULL_SSID%" > nul 2>&1
if errorlevel 1 (
echo 未登録: %FULL_SSID%
echo register_wifi.bat を先に実行してください
pause
exit /b 1
)
echo [1/3] 接続中
netsh wlan connect name="%FULL_SSID%" > nul 2>&1
if errorlevel 1 echo 接続失敗 && pause && exit /b 1
timeout /t 15 /nobreak > nul
echo [2/3] 確認中
ping -n 1 %LINUX_IP% -w 1000 > nul 2>&1
if errorlevel 1 echo サーバー接続失敗 && pause && exit /b 1
echo [3/3] フォルダ転送中
set T=%TEMP%\winscp_%RANDOM%.txt
(
echo option batch abort
echo option confirm off
echo open
sftp://%LINUX_USER%:%LINUX_PASSWORD%@%LINUX_IP%/
echo lcd "%LOCAL_FOLDER%"
echo get -delete "%REMOTE_FOLDER%/*"
echo exit
) > "%T%"
"%W%" /script="%T%" > nul 2>&1
set R=%errorlevel%
del "%T%" 2> nul
if %R% equ 0 (echo 完了 && explorer "%LOCAL_FOLDER%") else echo 失敗
pause
使い方(初回実行時)
- 設定値を編集
-
register_wifi.batを実行してWi-Fiプロファイルを登録 -
download.batを実行 - SSID末尾を入力(例 - 1234)
- 自動でフォルダ転送完了
使い方(2回目以降)
-
download.batを実行 - SSID末尾を入力(例 - 1234)
- 自動でフォルダ転送完了
3. XML生成の改善
問題点
- エスケープだらけで読みにくい
改善版
- PowerShell活用
powershell -Command "$ssid='%FULL_SSID%';\"...\""
- XMLテンプレート使用時
作業フォルダ/
├── template.xml ← 1回だけ作成
├── register_wifi_template.bat ← Wi-Fi登録
└── download.bat ← フォルダ転送
xmlファイル
template.xml
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>SSID_PLACEHOLDER</name>
<SSIDConfig>
<SSID>
<name>SSID_PLACEHOLDER</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
<MSM>
<security>
<authEncryption>
<authentication>WPA2PSK</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>false</protected>
<keyMaterial>PASSWORD_PLACEHOLDER</keyMaterial>
</sharedKey>
</security>
</MSM>
</WLANProfile>
register_wifi_template.bat
REM テンプレートファイルの存在確認
if not exist "%~dp0wifi_template.xml" (
echo エラー wifi_template.xml が見つかりません
pause
exit /b 1
)
REM 一時XMLファイル作成
set TEMP_XML=%TEMP%\wifi_%RANDOM%.xml
REM テンプレートを読み込んでプレースホルダーを置換
powershell -Command "(Get-Content '%~dp0wifi_template.xml') -replace 'SSID_PLACEHOLDER', '%FULL_SSID%' -replace 'PASSWORD_PLACEHOLDER', '%WIFI_PASSWORD%' | Set-Content '%TEMP_XML%' -Encoding UTF8"
4. WinSCP自動化
WinSCPスクリプトの基本構造
set T=%TEMP%\winscp_%RANDOM%.txt
(
echo option batch abort
echo option confirm off
echo open sftp://user:pass@host/
echo lcd "C:\local"
echo get "/remote/*"
echo exit
) > "%T%"
WinSCP.com /script="%T%"
ポイント
-
option batch abort- エラー時に中断 -
option confirm off- 確認ダイアログ無効 -
get -delete- 転送後リモートから削除(削除したくない場合は-deleteを削除)
setlocal の役割
setlocal
set XML=%TEMP%\wifi.xml
...
pause
REM ← ここで自動的に環境変数がクリア
効果
- バッチファイル内の変数変更がローカルスコープに制限
- 終了時に自動的に元に戻る
- グローバル環境変数を汚染しない
転送オプション
リモートファイルを残す場合
echo get "%REMOTE_FOLDER%/*"
リモートファイルを削除する場合
echo get -delete "%REMOTE_FOLDER%/*"
フォルダ構造ごと転送
echo get -delete "%REMOTE_FOLDER%"
-delete オプションを使用すると、転送後にリモートのファイルが削除されます。必要なファイルが消えないよう注意してください。
セキュリティ問題
パスワード平文保存
set WIFI_PASSWORD=YourWiFiPassword123
set LINUX_PASSWORD=Password123
リスク
- バッチファイルが見られるとパスワードが露出
対策
- ファイルのアクセス権限を制限
- 信頼できる場所に保管
- 定期的なパスワード変更
- 可能であればSSH鍵認証を検討
今後の改善案
- SSH鍵認証の導入
- タスクスケジューラでの定期実行
- PowerShellへの完全移行
参考