はじめに
近年、非IT企業 が自前でAIを用いて業務アプリや業務自動化ツールを作成し始めているという話を耳にする機会が増えてきました。
実際、AIは特別な技術ではなく、日常の一般的なツールへ変化しつつあり、導入率は上昇傾向です。
ではAIを使って業務アプリや自動化ツールをどの程度自動で作れるのか、今回3回に分けて検証してみました。
検証内容
初回のテーマは「AI が簡単なバッチファイルをどこまで正確に作れるのか」です。
対象としたのはテレワーク業務でもよく使われる VPN 接続の自動化バッチで、作業としては煩雑ですが数秒とはいえ積み重なると無視できない手間となります。
そこで今回は生成AI に「VPN 接続を自動実行するバッチファイル」を作らせ、どこまで実用レベルのものができるのかを検証することにしました。
尚、手動でのVPN接続は次のような手順で行うとします。
1.Windowsの設定画面からVPN接続設定を開く
2.対象のVPN名を選択
3.ユーザー名、およびパスワードを入力
4.OKボタンを押す
5.コントロールパネルから資格情報マネージャーを開く
6.Windows資格情報のSessionを削除する
開発環境
OS:Windows 11 Pro(64bit)
使用した生成AI:Microsoft 365 Copilot
コマンド環境:コマンドプロンプト
VPN クライアント:Windows標準VPN(L2TP/IPSec)
生成AIへの指示
以下の条件でバッチファイルを作成してください
————————————————————————–
①以下の接続情報でVPN接続を行う
■接続情報
・接続名:test
・IPアドレス:xxx.xxx.xxx.xxx
・ユーザー名:test_user
・パスワード:test_pass
②VPN接続後に資格情報マネージャーのSessionを削除する
③本バッチファイルの同階層にログを出力する
生成AIでの作成結果
@echo off
chcp 65001
setlocal ENABLEDELAYEDEXPANSION
rem ============================
rem 設定値(必要に応じて変更)
rem ============================
set "VPN_NAME=test"
rem ※VPN接続先(IPアドレス)はVPNプロファイル側に設定済みであること(xxx.xxx.xxx.xxx)
rem rasdialは接続名・ユーザー名・パスワードを受け取ります
set "VPN_USER=test_user"
set "VPN_PASS=test_pass"
rem ▼削除対象の「Windows 資格情報」ターゲット名(今回:*Session)
set "CRED_TARGET=*Session"
rem ▼ドライラン(削除実行せずログに候補だけ出力): 1=有効 / 0=無効
set "DRY_RUN=0"
rem ============================
rem ログ設定(同階層に出力)
rem ============================
for /f "tokens=1-5 delims=/:. " %%a in ("%date% %time%") do (
set "YY=%%a" &; set "MM=%%b" &; set "DD=%%c" &; set "hh=%%d" &; set "nn=%%e"
)
rem 例: 20260311_0028 のような形式に
set "LOGFILE=%~dp0vpn_%YY%%MM%%DD%_%hh%%nn%.log"
(
echo ============================
echo 開始: %date% %time%
echo スクリプト: %~nx0
echo ログ: %LOGFILE%
echo ============================
echo.[INFO] VPN接続開始: %VPN_NAME%
rem 既存セッションの確認と切断
rasdial | findstr /I /C:"%VPN_NAME%" >nul 2>&;1
if not errorlevel 1 (
echo.[INFO] 既存のVPNセッションを切断します: %VPN_NAME%
rasdial "%VPN_NAME%" /disconnect
if errorlevel 1 (
echo.[WARN] 切断時にエラーが発生しました。続行します。
) else (
echo.[INFO] 切断完了。
)
)
rem VPN接続(ユーザー名/パスワードを使用)
rasdial "%VPN_NAME%" "%VPN_USER%" "%VPN_PASS%"
if errorlevel 1 (
echo.[ERROR] VPN接続に失敗しました。処理を終了します。
goto :END
) else (
echo.[INFO] VPN接続に成功しました。
)
echo.[INFO] 「Windows 資格情報」の指定ターゲット削除を開始します。
echo.[INFO] 対象: "%CRED_TARGET%"
if /I "%DRY_RUN%"=="1" (
echo.[DRYRUN] 削除は行いません(確認のみ)。
) else (
cmdkey /delete:%CRED_TARGET% >nul 2>&1
if errorlevel 1 (
echo.[WARN] 削除失敗: "%CRED_TARGET%"(未存在または権限不足の可能性)
) else (
echo.[INFO] 削除成功: "%CRED_TARGET%"
)
)
echo.[INFO] 全処理が完了しました。
:END
echo 終了: %date% %time%
) >> "%LOGFILE%" 2>&;1
endlocal
echo ログを出力しました: "%LOGFILE%
バッチファイルを実行
VPN接続名、ユーザー名、パスワードをバッチファイルに手入力し、コマンドプロンプトにて実行します。
【実行結果ログ】
============================
開始: 2026/03/16 23:31:23.28
スクリプト: bat_test.bat
ログ: C:\bat_test\vpn_20260316_2331.log
============================
[INFO] VPN接続開始: test
test に接続中...
ユーザー名とパスワードを確認中...
Remote Access error 691 - The remote connection was denied because the user name and password combination you provided is not recognized, or the selected authentication protocol is not permitted on the remote access server.
For more help on this error:
Type 'hh netcfg.chm'
In help, click Troubleshooting, then Error Messages, then 691
[ERROR] VPN接続に失敗しました。処理を終了します。
エラーを調査した結果、今回使用したユーザー名には記号が含まれており、それを認識できていないため、正しくVPNに接続できなかったようです。
そのため、再度生成AIにてユーザー名の記号を認識できるようにバッチファイルを作成してみます。
生成AIへの再指示
以下の条件でコマンドプロンプトで実行するバッチファイルを作成してください
————————————————————————–
①以下の接続情報でVPN接続を行う
■接続情報
・接続名:test
・IPアドレス:xxx.xxx.xxx.xxx
・ユーザー名:test_user
・パスワード:test_pass
②接続名、ユーザー名、パスワードに記号を含むことが可能にする
③VPN接続後に資格情報マネージャーのSessionを削除する
④本バッチファイルの同階層にログを出力する
生成AIでの再作成結果
@echo off
chcp 65001 >nul
setlocal EnableExtensions DisableDelayedExpansion
REM =========================================
REM 設 定 値(必要に応じて変更)
REM - 記号対応:
REM * !(感嘆符)はこのスクリプトの設計で安全に扱えます
REM * %(パーセント)は CMD の仕様上、直書きする場合は %% と2つ書いてください
REM もしくは外部ファイル読み込み方式をお使いください(下に対応実装あり)
REM =========================================
set "VPN_NAME=test"
set "VPN_USER=test_user"
set "VPN_PASS=test_pass"
REM -----------------------------------------
REM (任意)同階層のファイルからユーザー名/パスワードを読み込む
REM - vpn_user.txt の1行目がユーザー名
REM - vpn_pass.txt の1行目がパスワード
REM ※ % を含む値を安全に扱いたい場合に推奨の運用です
REM -----------------------------------------
if exist "%~dp0vpn_user.txt" (
set /p "VPN_USER="<"%~dp0vpn_user.txt"
)
if exist "%~dp0vpn_pass.txt" (
set /p "VPN_PASS="<"%~dp0vpn_pass.txt"
)
REM =========================================
REM ログ: 同階層に時刻付きファイル名で出力
REM - wmic が使えれば yyyymmdd_hhmmss 形式
REM - 使えない場合は %DATE%/%TIME% を整形して代替
REM =========================================
set "TS="
for /f "tokens=2 delims==" %%A in ('wmic os get localdatetime /value 2^>nul ^| find "="') do set "TS=%%A"
if defined TS (
set "TS=%TS:~0,8%_%TS:~8,6%"
) else (
set "TS=%DATE%_%TIME%"
set "TS=%TS:/=%"
set "TS=%TS:\=_%"
set "TS=%TS::=-%"
set "TS=%TS:.=%"
set "TS=%TS: =0%"
set "TS=%TS:,=%"
)
set "LOG=%~dp0vpn_%VPN_NAME%_%TS%.log"
(
echo [INFO] 開始: %DATE% %TIME%
echo [INFO] 接続名: %VPN_NAME%
echo [INFO] ログ: %LOG%
) >> "%LOG%"
REM =========================================
REM 既存接続の切断(任意・エラー無視)
REM =========================================
rasdial "%VPN_NAME%" /disconnect >> "%LOG%" 2>&1
REM =========================================
REM VPN 接続
REM - 記号対応のため、一時的に遅延展開を有効にし、!VAR! 形式で渡す
REM - これにより % を含む値も安全(! は事前に無効状態で代入しているためOK)
REM =========================================
set "EC="
setlocal EnableDelayedExpansion
rasdial "!VPN_NAME!" "!VPN_USER!" "!VPN_PASS!" >> "%LOG%" 2>&1
set "EC=!ERRORLEVEL!"
endlocal & set "EC=%EC%"
if not "%EC%"=="0" (
echo [ERROR] VPN 接続に失敗しました。ExitCode=%EC% >> "%LOG%"
goto :AFTER
) else (
echo [INFO] VPN 接続に成功しました。 >> "%LOG%"
)
REM =========================================
REM 資格情報マネージャーの「Session/セッション」資格情報を削除
REM - cmdkey /list の出力を CMD のみで解析(英語/日本語 UI 両対応)
REM - 対象: Persist: Session / 永続性: セッション のみ
REM =========================================
set "TMPFILE=%TEMP%\cmdkey_list_%RANDOM%%RANDOM%.txt"
cmdkey /list > "%TMPFILE%" 2>&1
setlocal EnableDelayedExpansion
set "currentTarget="
for /f "usebackq tokens=1* delims=:" %%A in ("%TMPFILE%") do (
set "k=%%A"
set "v=%%B"
REM 先頭空白を除去
for /f "tokens=* delims= " %%X in ("!k!") do set "k=%%X"
for /f "tokens=* delims= " %%Y in ("!v!") do set "v=%%Y"
REM Target / ターゲット を検知して保持
if /i "!k!"=="Target" set "currentTarget=!v!"
if /i "!k!"=="ターゲット" set "currentTarget=!v!"
REM Persist: Session または 永続性: セッション を検知したら削除
if /i "!k!"=="Persist" (
echo !v! | findstr /i "Session" >nul
if not errorlevel 1 (
if defined currentTarget (
echo [INFO] セッション資格情報を削除: !currentTarget! >> "%LOG%"
cmdkey /delete:!currentTarget! >> "%LOG%" 2>&1
)
set "currentTarget="
)
)
if /i "!k!"=="永続性" (
echo !v! | findstr "セッション" >nul
if not errorlevel 1 (
if defined currentTarget (
echo [INFO] セッション資格情報を削除: !currentTarget! >> "%LOG%"
cmdkey /delete:!currentTarget! >> "%LOG%" 2>&1
)
set "currentTarget="
)
)
)
endlocal
del /q "%TMPFILE%" >nul 2>&1
:AFTER
echo [INFO] 完了: %DATE% %TIME% >> "%LOG%"
echo.
echo ✅ 実行完了。ログを出力しました:
echo "%LOG%"
echo.
endlocal
exit /b %EC%
バッチファイルを再実行
生成AIに指示をしていない内容まで変更されていましたが、内容に問題は無かったため、コマンドプロンプトにて再実行します。
【実行結果ログ】
[INFO] 開始: 2026/03/17 23:08:25.42
[INFO] 接続名: test
[INFO] ログ: C:\bat_test\test_,=.log
No connections
Command completed successfully.
test に接続中...
ユーザー名とパスワードを確認中...
ネットワークにコンピューターを登録中...
test に正常に接続しました。
Command completed successfully.
[INFO] VPN 接続に成功しました。
[INFO] 完了: 2026/03/17 23:09:06.15
ログのファイル名や内容に変更はありましたが、正しくVPN接続できたことを確認しました。
【VPN接続後の画面キャプチャ】

まとめ
生成AIを使えば簡単なバッチファイルは作成できるものの、実業務で活用するには出力が毎回異なる可能性を踏まえたトライ&エラーが不可欠であり、そのためには一定の知識が求められます。