質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.00%

  • バッチファイル

    182questions

    バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

バッチファイルで発生したエラーについて教えて下さい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 267

dai3922

score 17

前提・実現したいこと

バッチファイルで下記のエラーが発生しました。
別の場所でご教授頂き、下記のコードを教えて頂きましたが、
実際に組み込むと下記のエラーが発生します。
やりたいことは、各クライアントPCにインストールしているソフトウェアの
名称とバージョンをログファイルに出力することです。
OSバージョン、32bit・64bitのOSによって分岐させ、
複数のレジストリを参照しています。

宜しくお願い致します。

=教えて頂いたコード 開始=
@echo off
setlocal enabledelayedexpansion
set RK="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
set SS=%%i
if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
if not "!SN!"=="" (echo !SN!@!SV!)
set SN=
set SV=
)
if "!SS!"=="DisplayName"    (set SN=%%k)
if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV!)
=教えて頂いたコード 終了=

発生している問題・エラーメッセージ

エラー:キー名が無効です。
※上記エラーがレジストリ参照、findstr、の実行で数回表示されます。

該当のソースコード

@echo off

rem *****初期設定 開始*****
rem サーバIPアドレス設定
 set srv_IP=192.168.1.1

rem 設定ファイルダウンロード元取得
for /f "tokens=1,* skip=1 delims==" %%a IN (\\%srv_IP%\設定ファイル.ini) do (
    set %%a=%%b
)
rem *****初期設定 終了*****

rem IPアドレス取得(OSで分岐)
 if "%os_ver%" == Windows 7 (
 for /f "tokens=14" %%f in ('ipconfig ^| findstr "IPv4"') do set strIP=%%f
 )
 if "%os_ver%" == Windows 10 (
 for /f "tokens=15" %%f in ('ipconfig ^| findstr "IPv4"') do set strIP=%%f
 )
rem IPアドレスから「中分類(使用者、メーカー)」を取得
findstr "%strIP%," %IP_list_pass%
 for /f "tokens=1-6 delims=," %%i in ('findstr "%strIP%," %IP_list_pass%') do (set PC_user=%%m)
rem 取得結果書込み用ファイルの保存先フォルダ名をセット
 set TMP_Folder=C:\work_log\クライアント更新ログ

rem 取得結果書込み用ファイルの名称設定
 set output_file=softwarelist_%PC_user%.log
rem ファイルサイズが1M以上なら取得結果書込み用ファイルを削除
 for %%F in (%TMP_Folder%\%output_file%) do if %%~zF GEQ 1000000 del %TMP_Folder%\%output_file%

rem *****取得結果書込み用ファイル書込み 開始*****
rem ヘッダ日時編集(空白文字を「0」に置換)
 set time2=%time: =0%
rem 取得結果書込み用ファイルの作成とヘッダ日時記述
 echo *****%date% %time2:~0,2%%time2:~3,2%%time2:~6,2% start***** >>%TMP_Folder%\%output_file%

rem *****32bitか64bitか判断して処理 開始*****
rem 遅延環境変数の展開を有効
setlocal enabledelayedexpansion

if "%PROCESSOR_ARCHITECTURE%" EQU "x86" (
  echo "x86"
rem レジストリからソフト一覧取得①
set RK="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
  set SS=%%i
  if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
    if not "!SN!"=="" (echo !SN!@!SV!)
    set SN=
    set SV=
  )
  if "!SS!"=="DisplayName"    (set SN=%%k)
  if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV! >>%TMP_Folder%\%output_file%)

rem レジストリからソフト一覧取得②
set RK="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
  set SS=%%i
  if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
    if not "!SN!"=="" (echo !SN!@!SV!)
    set SN=
    set SV=
  )
  if "!SS!"=="DisplayName"    (set SN=%%k)
  if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV! >>%TMP_Folder%\%output_file%)
)

if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
  echo "x64"
rem レジストリからソフト一覧取得①
set RK="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
  set SS=%%i
  if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
    if not "!SN!"=="" (echo !SN!@!SV!)
    set SN=
    set SV=
  )
  if "!SS!"=="DisplayName"    (set SN=%%k)
  if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV! >>%TMP_Folder%\%output_file%)

rem レジストリからソフト一覧取得②
set RK="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
  set SS=%%i
  if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
    if not "!SN!"=="" (echo !SN!@!SV!)
    set SN=
    set SV=
  )
  if "!SS!"=="DisplayName"    (set SN=%%k)
  if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV! >>%TMP_Folder%\%output_file%)

rem 64bitOS専用ソフト一覧取得
set RK="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
set FK="DisplayName DisplayVersion CurrentVersion"
for /f "tokens=1,2,*" %%i in ('reg query %RK% /s ^| findstr %FK%') do (
  set SS=%%i
  if "!SS:~0,18!"=="HKEY_LOCAL_MACHINE" (
    if not "!SN!"=="" (echo !SN!@!SV!)
    set SN=
    set SV=
  )
  if "!SS!"=="DisplayName"    (set SN=%%k)
  if "!SS!"=="DisplayVersion" (set SV=%%k)
)
if not "!SN!"=="" (echo !SN!@!SV!)
pause
rem if not "!SN!"=="" (echo !SN!@!SV! >>%TMP_Folder%\%output_file%)
)
rem *****32bitか64bitか判断して処理 終了*****

rem ヘッダ日時記述
 echo *****%date% %time2:~0,2%%time2:~3,2%%time2:~6,2% end***** >>%TMP_Folder%\%output_file%
rem *****取得結果書込み用ファイル書込み 終了*****

exit

試したこと

課題に対してアプローチしたことを記載してください

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

if( )の中で、RKFKをセットしていますので、%RK%%FK%でなく、!RK!!FK!で参照してください。%RK%%FK%だと、空になり、reg query /sというコマンドになり当然エラーです。

あと、
if "%os_ver%" == Windows 7 (もおかしいです。これだと、「"%os_ver%"Windowsに等しい場合、7というコマンドを実行しろ」という意味になります。
if "%os_ver%" == "Windows 7" (が正しいと思われます。

全般的に、これだけ長いスクリプトを書くだけの基礎知識に欠けていると思います。意味もわからずコピペを重ねた印象です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 08:56

    ご回答ありがとうございます。
    大変助かりました。
    おっしゃる通り、教えて頂いたコードというものを組み込んだ際の
    遅延環境変数の書き方をまず理解していませんでした。
    ご指摘どうもありがとうございます。
    一度自分の中で落とし込んで身につけようと思います。

    今後とも宜しくお願い致します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • バッチファイル

    182questions

    バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。