batch file帮助:确定版本以决定操作

当我们的办公室升级到Window 7时,我被委托更新loginscript与Windows 7一起工作。上述脚本的创build者早已不在了,而且我不是batch file专家。

我想要做的是确定操作系统。 当我执行一些networkingpipe理任务时,我需要能够login到服务器而不运行login脚本,而如果login到Windows XP或Windows 7计算机,则需要运行login脚本。

我发现我无法使用VER命令,因为Windows 7和Windows Server 2008会返回完全相同的结果。

这是我的:

if exist %loginscriptdir%\sysinfo.txt goto setver if not exist %loginscriptdir%\sysinfo.txt wmic os get name /value > %loginscriptdir%\sysinfo.txt type %loginscriptdir%\sysinfo.txt > %loginscriptdir%\sysinfo1.txt :setver set WinVer=Unknown set errorlevel=0 If %WinVer% == "Unknown" ( findstr /c:"Windows XP Professional" %loginscriptdir%\sysinfo1.txt if %errorlevel%==1 set WinVer=XP ) else ( findstr /c:"Windows 7 Enterprise" %loginscriptdir%\sysinfo1.txt if %errorlevel%==1 set WinVer=Win7 ) set result=false if %WinVer% == "XP" set result=true if %WinVer% == "Win7" set result=true if "%result%" == "false" ( goto skipicon1 

在整个剧本中,我都是在rest时间写下来find价值的。 例:

 REM ----- ECHO "%WinVer%" ECHO "%result%" ECHO "%errorlevel%" ECHO Press any key to continue 4. pause>null REM ----- 

第四次rest是在我粘贴的脚本的末尾。 这是结果:

 "Unknown" "false" "0" Press any key to continue 4. 

干得好。 这是我发现从win2kpro-winserver2k10获得操作系统的最好方法。 它也告诉它是否是32/64位,并且安装了什么样的sp,但是你不需要。 在这个例子中只需检查%cap%。

 @echo off setlocal call :GetOS cap bit sp echo %cap%%bit% (%sp%) exit /b :GetOS caption servicepack setlocal set arc=%PROCESSOR_ARCHITECTURE% set key="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" for /f "tokens=3*" %%a in ( 'reg query %key%^|findstr /i ProductName') do set cap=%%a %%b for /f "tokens=3*" %%a in ( 'reg query %key%^|findstr /i CSDVersion') do set sp=%%a %%b endlocal & set %1=%cap% & set %2=%arc% & set %3=%sp% exit /b 

代码的问题是%errorlevel%值的扩展。 由于它包含在圆括号的范围内,所以直到范围结束后才会更新该值。 这意味着%errorlevel%将始终等于其范围开始时的值。 要解决这个问题,你必须使用延迟扩展。 setlocal enabledelayedexpansion!errorlevel! 。 这里是关于延迟扩展的StackOverflow文章: 启用和禁用延迟扩展,它是做什么的?

您可能只想使用ss64.com http://ss64.com/nt/ver.html中显示的版本检测方法

这里是ss64.com的例子,但简化了:

 @echo off setlocal :: Get windows Version for /f "tokens=4,5,6 delims=[.] " %%A in ('ver') do ( set "Major=%%~A" set "Minor=%%~B" set "Build=%%~C" ) if "%Major%.%Minor%"=="5.1" goto WinXP if "%Major%.%Minor%"=="6.1" goto Win7 echo Unsupported Version Detected "%Major%.%Minor%" goto End :WinXP echo Windows XP Detected goto End :Win7 echo Windows 7 or server 2008 Detected goto End :End endlocal exit /b 0