批处理文件|符号:无缘无故地插入空格

时间:2012-11-14 19:00:43

标签: windows batch-file pipe

我有一个包含此代码段的批处理文件:

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:\>

“mark”之后有一个额外的空间。我曾经在管道和命令之间使用了一个空格,但是为了解决这个错误我删除了它们。它没有任何区别。我已经确定了文件是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
)

1 个答案:

答案 0 :(得分:1)

您发布的代码段没有任何问题。它的工作原理很好。

我假设您在显示的代码中看到“额外”空格,因为ECHO为ON。这些空间是解析器如何处理行的工件。您不应该担心它们(尽管在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 batch) Goto within if block behaves very strangely的已接听答案。

您遇到的另一个问题是您尝试在带括号的代码块中访问%ERRORLEVEL%。该值在分析时扩展,并且整个块一次被解析,因此该值将是您在进入IF块之前存在的ERRORLEVEL。有许多方法可以解决。

  • 延迟扩展:if !errorlevel!==0 ...
  • if not errorlevel 1 ...(阅读IF声明的文档)
  • 成功时使用&&进行条件执行,和/或||进行条件执行失败。在您的情况下systeminfo|findstr ... && set OS=...

我怀疑你可能有其他问题,但我没有时间诊断一切。