ChatGPTにスペースが混入したreg query の結果を整形するスクリプトを作らせてみた
まず、指令内容
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" の結果を環境変数に入れて "REG_SZ" を 分割トークンにして別の行で表示する |
@echo off setlocal enabledelayedexpansion :: レジストリキーをクエリして変数に格納 for /f "tokens=1,2,* delims= " %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"') do ( if "%%B"=="REG_SZ" ( set key_name=%%A set key_value=%%C echo Key: !key_name! echo Value: !key_value! ) ) endlocal |
これが結果。キー名と結果にスペースが混入することが想定されてないので%Bに代入された値が、レジストリのクラス名ではないことがある問題が発生したので、次のような指令を与えてみた
各エントリーには必ずREG_SZ が含まれているが、エントリーにはスペースが含まれることがあるので、REG_SZをセパレーターとして分割するだけにしてください |
それに対する結果が、delims=REG_SZ を指定するという回答だった。当然、delimsに文字列は指定できないのだが、指令をそのままできる前提で実行しようとしてるのが問題点。 そこで、次のように指令を与える
delims に文字列を指定することはできないので forで文字列全体をいったん取得してから分環境変数の置換機能で分割する処理にしてください |
すると、うまく出てきたので、今度は、前後のスペースを除去するように指令して調整させたところ完成した
@echo off setlocal enabledelayedexpansion :: レジストリキーをクエリして変数に格納 for /f "skip=2 tokens=*" %%A in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"') do ( set "entry=%%A" :: REG_SZ を基準に分割 set "key_name=!entry: REG_SZ=!" set "key_value=!entry:* REG_SZ =!" :: 前後のスペースをトリミングする call :trim key_name key_name call :trim key_value key_value :: トリミング後に出力 echo Key: "!key_name!" echo Value: "!key_value!" ) endlocal exit /b :: トリミング関数 :trim setlocal set "str=!%1!" :: 文字列の前後から空白を削除 for /f "tokens=* delims= " %%a in ("!str!") do set "str=%%a" for /l %%i in (0,1,31) do if "!str:~-1!"==" " set "str=!str:~0,-1!" endlocal & set "%~2=%str%" exit /b |
間違った前提を指摘すると当然のように間違ってると回答してくるところが謎なのですが、そういうところは最適化できないのかねって思うAIだった。(((・ω・)))
Comments