0

このスニペットを含むバッチ ファイルがあります。

systeminfo|findstr /B "Host Name:"|findstr /C:"COMPNAME-SET"
if %ERRORLEVEL% EQU 0 (
echo This computer is either a test machine or has not had it's name configured yet. Continuing will run the script in test mode.
pause
)

理由はわかりませんが、一番上の行が機能しません。出力は次のとおりです。

Z:\>systeminfo | findstr /B "Host Name:"  | findstr /C:"IGSWIDWB-SET"
The syntax of the command is incorrect.
Z:\>

" マークの後に余分なスペースがあるようです。以前はパイプとコマンドの間にスペースを使用していましたが、このエラーを修正するためにそれらを削除しました。違いはありませんでした。ファイルがWindows スタイルの文字を使用した Windows 形式で、今何をすればよいかわかりません. これは、私が使用している標準のバッチ スクリプトです。

このコードにより、私が開発した自動セットアップ スクリプトでラップトップかデスクトップかを判断できます。ホスト名には特定のプロトコルがあり、この手順に基づいて一連のインストールをナビゲートします。

誰が何が悪いのか知っていますか?ありがとう!

[name here] への応答として、その前 (およびその後) に実行されるコードを次に示します。ただし、言葉を変更したため、それが何であるかは明らかではありません。私は内部文書を共有しないことを好む組織で働いていますが、難読化してもかまいません。失敗する部分は、最初の systeminfo がある行にあります。

::@echo off
setlocal
set BATDIR=%~dp0%
set SCRIPTVER=3.2
cls
set SUBDEPARTMENT=false

if not [%1]==[] (
    if "%1" EQU "/help" (
        echo Calling For Help.
        CALL :HELP
        goto :EOF
       )

    if "%1" EQU "/SUBDEPARTMENT" (
        set SUBDEPARTMENT=true
    echo Set SUBDEPARTMENT options to true.
    ::echo SUBDEPARTMENT Switch does not work on this version of the script.  ::CD VERSION ONLY :: Continuing without.
    echo.
    goto CONTINUE
    )
)

:Continue
color 0B
   echo XXXX AutoInstaller Script for Windows 7/XP (x86/amd64)
   echo Version %SCRIPTVER% - Build Date: 11/14/2012
   echo Estimated Install Time: 80(Core) to 180(SUBDEPARTMENT) minutes
   echo Computer will reboot to phase 2 once completed.
   echo A log file for this script can be found at %USERPROFILE%\AutoInstallerLog.txt
   echo ---------------------------------------------------------------
echo Preparing System...
echo Auto Install Log, generated on: > %USERPROFILE%\AutoInstallerLog.txt
echo AutoInstaller Script Version: %SCRIPTVER% >> %USERPROFILE%\AutoInstallerLog.txt
DATE /T >> %USERPROFILE%\AutoInstallerLog.txt
echo This log file reflects what steps completed in the ASI script. It does not mean they completed correctly so please make sure that all software is installed correctly!
echo Make sure the computer has been renamed to match the type [e.g. COMPUTER_PROTOCOL]. Make sure it  has also been rebooted it so that it takes effect.
echo SystemInfo Output: >> %USERPROFILE%\AutoInstallerLog.txt
systeminfo >> %USERPROFILE%\AutoInstallerLog.txt

::Setting script parameters
echo.
echo Configuring script parameters.

::Check if it's a test machine
echo systeminfo^|findstr /B "Host Name:"^|findstr /C:"TESTCOMP_NAME"
systeminfo|findstr /B "Host Name:"|findstr /C:"TESTCOMP_NAME"
if %ERRORLEVEL% EQU 0 (
echo This computer is either a test machine or has not had it's name configured yet. Continuing will run the script in test mode.
pause
set TestComp=1
::TestOS
   systeminfo|findstr /C:"XP Professional"
   if %ERRORLEVEL% EQU 0 (
      set OS=XP
      goto :finishTestOS
     )

    systeminfo | findstr /C:"7 Enterprise"
    if %ERRORLEVEL% EQU 0 (
      set OS=7
      goto :finishTestOS
     )
     :finishTestOS

set STYLE=workstation
goto :AdminCheck
)
::Debug Statement:
echo NEXT PArT!!! LINE 67
::::OS Version
:getOS
   systeminfo|findstr /C:"XP Professional"
   if %ERRORLEVEL% EQU 0 (
      set OS=XP
      goto :finishOS
     )

    systeminfo|findstr /C:"7 Enterprise"
    if %ERRORLEVEL% EQU 0 (
      set OS=7
      goto :finishOS
     )


    :finishOS
    echo This system is running Windows %OS%.

::Get Form Factor
:getStyle
    systeminfo | findstr /B "Host Name:" | findstr /C:"WORKSTATION_PROTOCOL"
    if %ERRORLEVEL% EQU 0 (
      set STYLE=laptop
     ) else (
      set STYLE=workstation
     )
     :finishStyle
    echo This system is a %STYLE%.

if not defined STYLE (
    echo System style not configured correctly. The name of the computer likely does not follow protocol, it must have PROTOCOLS in it.
    goto :ERROREND
)

if not defined OS (
    echo OS not detected properly. The script may need to be updated to detect new versions of Windows.
    goto :ERROREND
)
4

1 に答える 1

1

あなたが投稿したコードスニペットに問題はありません。単独で問題なく動作します。

ECHO がオンになっているため、表示されるコードに「余分な」スペースが表示されていると思います。これらのスペースは、パーサーが行を処理する方法の成果物です。それらについて心配する必要はありません (ただし、ECHO がオンのときに出力を見ることは、問題を診断するための非常に貴重なツールです)。

ECHO ON 出力は、多くのバッチ コンストラクトに対して変更されます。たとえば、次の完全に有効なコード

if "a"=="b" >test.txt echo matched

ECHOがONの場合は以下のように表示されます

if "a" == "b" echo matched 1>test.txt

スペースが追加され、リダイレクトが最後に移動され、リダイレクトの前に 1 (stdout を表す) が挿入されていることがわかります。これはすべて完全に正常です。コマンドは正常に実行されます。(もちろん、IF は FALSE と評価されるため、何もしません) IF 条件が TRUE に変更された場合、一致した後の余分なスペースは出力に含まれません。

ECHO ON 出力に余分なスペースが表示されることを心配する必要はありません。ただし、ソース コード内の余分なスペースに注意する必要があります。元のソース コードに追加の末尾スペースがある場合、出力に含まれます。

構文エラーの問題は、コードの別の場所にあると思われます。おそらく、エラーが発生しているコード コンテキストをさらに提供できます。

質問の更新に応じて回答を更新

思ったところにエラーが発生していません!構文エラーは、次の複雑な IF ステートメントにあります。

:finishTestOS括弧で囲まれたコード ブロック内でラベルを使用しようとしています。括弧内のラベルの直後に有効な非ラベル行が続いていない場合、常に構文エラーが発生します。(実際にはルールはもう少し複雑かもしれませんが、ここでは重要ではありません)

ラベルの下に REM ステートメントを配置するだけで、構文エラーを解消できます。

:finishTestOS
rem

しかし - あなたはまだ大きな問題を抱えているでしょう - コードはあなたが望むようには機能しません. 括弧で囲まれたコード ブロック内のラベルに GOTO を試みてはなりません。詳細については、 (Windows バッチ) Goto within if ブロックが非常に奇妙な動作をする に対する受け入れられた回答を参照してください。

%ERRORLEVEL%もう 1 つの問題は、括弧で囲まれたコード ブロック内にアクセスしようとすることです。値は解析時に展開され、ブロック全体が一度に解析されるため、値は IF ブロックに入る前に存在していた ERRORLEVEL になります。解決できる方法はいくつかあります。

  • 遅延拡張:if !errorlevel!==0 ...
  • if not errorlevel 1 ... (IFステートメントのドキュメントを読んでください)
  • &&成功時の条件付き実行および/または失敗時の条件付き実行に使用し||ます。あなたの場合systeminfo|findstr ... && set OS=...

他にも問題があるのではないかと思いますが、すべてを診断する時間はありません。

于 2012-11-14T20:30:15.943 に答える