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だった。(((・ω・)))

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です