【发布时间】:2012-09-07 16:51:04
【问题描述】:
【问题讨论】:
-
这很好,直到一个打包错误的应用程序创建这些文件夹之一(比如 Program Files (x86)\ 在 32 位系统上)并且您的脚本失败(在那里)
-
你最终使用了哪个答案?
标签: windows command-line
【问题讨论】:
标签: windows command-line
这是按照微软知识库参考 (http://support.microsoft.com/kb/556009) 执行检查的正确方法,我已将其重新编辑为一行代码.
它不依赖任何环境变量或文件夹名称,而是直接在注册表中检查。
如下面的完整批处理文件所示,它将环境变量 OS 设置为 32BIT 或 64BIT,您可以根据需要使用它.
@echo OFF
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
if %OS%==32BIT echo This is a 32bit operating system
if %OS%==64BIT echo This is a 64bit operating system
【讨论】:
find /i "x86",就没有“x32”这样的东西)
setlocal 放在 @echo off 行之后 - 这将确保环境的生命周期将随着批处理的终止而结束,因此使用 OS 变量应该没有伤害。
我使用以下任何一种:
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:64BIT
echo 64-bit...
GOTO END
:32BIT
echo 32-bit...
GOTO END
:END
或者我设置了bit 变量,我稍后在我的脚本中使用它来运行正确的设置。
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (set bit=x64) ELSE (set bit=x86)
或者...
:CheckOS
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x86) else (set bit=x64)
希望这会有所帮助。
【讨论】:
IF DEFINED ProgramFiles(x86) ...
%PROCESSOR_ARCHITECTURE% 的测试不是错误的吗?我在 64 位上得到 AMD64。如果%PROCESSOR_ARCHITECTURE% 总是有效,那么它是一个 比检查任何有缺陷的软件可以创建的目录而不考虑 CPU 的目录更好的解决方案。
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x64) 中交换正负分支。
如果你只做这些似乎可以工作:
echo "%PROCESSOR_ARCHITECTURE%"
我发现 these script 会根据操作系统架构(x64 或 x86)执行特定操作:
@echo off
echo Detecting OS processor type
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto 64BIT
echo 32-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\i386\DPMAgentInstaller_x86 /q
goto END
:64BIT
echo 64-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\amd64\DPMAgentInstaller_x64 /q
:END
"C:\Program Files\Microsoft Data Protection Manager\DPM\bin\setdpmserver.exe" -dpmservername sa
请尝试不使用 GOTO 的方法...
对于使用 Unix 系统的人,uname -m 可以解决问题。
【讨论】:
PROCESSOR_ARCHITECTURE 来找出操作系统位数是不够的。上面的示例仅测试脚本cmd.exe 进程位数本身。要测试问题中所述的操作系统位数,您还需要检查 PROCESSOR_ARCHITEW6432 变量是否存在,因为 64 位操作系统上可能存在 32 位进程。
在命令提示符下运行以下命令:
开始 -> 运行 -> 输入cmd 并在生成的黑框中输入以下命令:
wmic os get osarchitecture
【讨论】:
wmic os get osarchitecture | find "64" > NUL && set NumBits=64 || set NumBits=32 否则,我认为这是最简洁的答案...前提是wmic 始终存在于路径上...。
*** Start ***
@echo off
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
REG.exe Query %RegQry% > checkOS.txt
Find /i "x86" < CheckOS.txt > StringCheck.txt
If %ERRORLEVEL% == 0 (
Echo "This is 32 Bit Operating system"
) ELSE (
Echo "This is 64 Bit Operating System"
)
*** End ***
【讨论】:
'ProgramFiles(x86)' 是 cmd.exe(32 位和 64 位版本)自动定义的环境变量,仅适用于 Windows 64 位机器,所以试试这个:
@ECHO OFF
echo Check operating system ...
if defined PROGRAMFILES(X86) (
echo 64-bit sytem detected
) else (
echo 32-bit sytem detected
)
pause
【讨论】:
PROCESSOR_ARCHITECTURE=x86
会出现在Win32上,并且
PROCESSOR_ARCHITECTURE=AMD64
将出现在 Win64 上。
如果您不正常地运行 32 位 cmd.exe 进程,那么 Windows 会提供两个环境变量:
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
【讨论】:
cmd.exe 有两个版本,一个是 64 位,一个是 32 位(您通常可以在这里找到:C:\Windows\SysWOW64\cmd.exe)。
如果您以管理员身份运行脚本,则该脚本可以使用 wmic 命令。
FOR /f "tokens=2 delims==" %%f IN ('wmic os get osarchitecture /value ^| find "="') DO SET "OS_ARCH=%%f"
IF "%OS_ARCH%"=="32-bit" GOTO :32bit
IF "%OS_ARCH%"=="64-bit" GOTO :64bit
ECHO OS Architecture %OS_ARCH% is not supported!
EXIT 1
:32bit
ECHO "32 bit Operating System"
GOTO :SUCCESS
:64bit
ECHO "64 bit Operating System"
GOTO :SUCCESS
:SUCCESS
EXIT 0
【讨论】:
这是我个人最喜欢的一个逻辑炸弹:)
::32/64Bit Switch
ECHO %PROCESSOR_ARCHITECTURE%|FINDSTR AMD64>NUL && SET ARCH=AMD64 || SET ARCH=x86
ECHO %ARCH%
PAUSE
使用 AND (&&) 和 OR (||),这是一个 IF THEN ELSE 批处理构造。
【讨论】:
c:\windows\syswow64\cmd.exe 内运行,那么它会输出 x86。在这种情况下,您可以检查%PROCESSOR_ARCHITEW6432%,它将是 AMD64。
setlocal enabledelayedexpansion - 无论如何我都将其用作反射。
这里的所有答案都不适用于我的情况(64 位处理器,但 32 位操作系统),所以这是对我有用的解决方案:
(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
【讨论】:
这是一个简洁的版本:
set isX64=False && if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( set isX64=True ) else ( if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( set isX64=True ) )
echo %isX64%
不要使用“Program Files (x86)”目录作为任何证据:顽皮的软件可以轻松地在 32 位机器上创建此目录。请改用 PROCESSOR_ARCHITECTURE 和 PROCESSOR_ARCHITEW6432 环境变量。
【讨论】:
我通常会做以下事情:
:Check_Architecture
if /i "%processor_architecture%"=="x86" (
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
REM Run 32 bit command
) ELSE (
REM Run 64 bit command
)
) else (
REM Run 64 bit command
)
【讨论】:
我真的不明白这里给出的一些答案(对不起)。例如,投票最多的答案不会返回 Windows 架构,而是会为您提供处理器架构。在 64 位 CPU 上运行 32 位 Windows 构建时,您会得到错误的结果(这是对正在使用的硬件的查询)。
最安全的选择是从注册表中查询 BuildLabEx 值。
确定 x86 (intel) 还是 x86-64 (amd)
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre." && set "_ARCH_=x86" || set "_ARCH_=x86-64"
确定 x86 (intel)、x86-64 (amd) 或 arm
set "_ARCH_=unknown"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre." && set "_ARCH_=x86"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".amd64fre." && set "_ARCH_=x86-64"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".armfre." && set "_ARCH_=arm"
另一种选择(前面提到过)
if defined ProgramFiles(x86) ( set "_ARCH_=x86-64" ) else ( set "_ARCH_=x86" )
后者的问题是当你弄乱你的变量时,你就不能使用这个方法。检查文件夹是否存在也会在以前安装有剩余(或某些用户故意创建文件夹)时出现问题。
【讨论】:
这是一个单行代码,64 位的 %errorlevel% 为 0,非 64 位的为 1。我不能保证它适用于所有版本的 Windows,但演示了一种确定它的方法。如果您知道要查找的所有可能性,则可以添加多个 findstrqueries。
set | findstr /i processo.*64 > nul 2>&1
基本上,您正在转储环境变量,并使用正则表达式来搜索其行中某处包含“processo”+“64”的内容。管道只是为了抑制匹配线。如果我在当前设备上将其更改为 set | findstr /i processo.*64,结果如下:
C:\Windows\System32>set | findstr /i processo.*64
PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 9, GenuineIntel
这是查看您的处理器是否为 64 位 AMD 的单行程序
set | findstr /i processo.*amd.*64 > nul 2>&1
您可以将这些作为起点,并根据您的要求对其进行改进。我最终在已知的环境变量名称上使用了这个,因为它在我正在使用的不同主要版本的 Windows 中更可靠。
【讨论】:
IWISH=I had a food processor as fast as amd graphics drivers like model 5564这样的奇怪东西
findstr 查询。我不能保证每个版本的 64 位 Windows 都有这个环境变量。如果您想尽可能彻底,您可以查找您感兴趣的 Windows 版本的每个版本的环境变量,并查询每个可能的变量和值以消除您的谨慎。
不同版本的 Windows 中的许多 DOS 命令是相似的,但可能支持不同的参数。此外,较新版本的 Windows 可能支持新命令或淘汰旧命令。因此,如果您希望编写一个可以在不同类型的机器上运行的批处理文件,确定运行该批处理文件的 Windows 版本可能是有益的。这样批处理文件可以执行适合操作系统的命令。
以下批处理文件将确定计算机是否运行 Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP、Windows 2000 或 Windows NT。它可以根据需要轻松修改以支持其他版本的 Windows,或根据检测到的 Windows 版本设置环境变量。请注意,要让此批处理文件正确区分较新版本的 Windows Server 和消费者版本的 Windows,它比您可能在其他地方看到的批处理文件更加复杂。我已经解释了下面的原因。
1) 打开记事本窗口。
2) 将以下文本复制到记事本中(您可能希望在某些行换行时访问此提示的打印版本):
@echo off
ver | find "2003" > nul
if %ERRORLEVEL% == 0 goto ver_2003
ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp
ver | find "2000" > nul
if %ERRORLEVEL% == 0 goto ver_2000
ver | find "NT" > nul
if %ERRORLEVEL% == 0 goto ver_nt
if not exist %SystemRoot%\system32\systeminfo.exe goto warnthenexit
systeminfo | find "OS Name" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i
echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7
echo %vers% | find "Windows Server 2008" > nul
if %ERRORLEVEL% == 0 goto ver_2008
echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista
goto warnthenexit
:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit
:ver_2008
:Run Windows Server 2008 specific commands here.
echo Windows Server 2008
goto exit
:ver_vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit
:ver_2003
:Run Windows Server 2003 specific commands here.
echo Windows Server 2003
goto exit
:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit
:ver_2000
:Run Windows 2000 specific commands here.
echo Windows 2000
goto exit
:ver_nt
:Run Windows NT specific commands here.
echo Windows NT
goto exit
:warnthenexit
echo Machine undetermined.
:exit
3) 将文件另存为 %WINDIR%\whichvers.bat
4) 现在,从命令提示符输入:
哪一个
这将显示您正在运行的 Windows 版本。
注意事项:
使用 SYSTEMINFO 命令而不是依赖 VER 命令的原因是 Windows Server 2008 与其他 Windows 版本“共享”版本号(请参阅 Microsoft)。因此,依靠“版本号”6.0 来检测 Windows Vista 或依靠 6.1 来检测 Windows 7 无法将计算机与 Windows Server 2008 或 Windows Server 2008 R2 区分开来。
%TEMP%\osname.txt 的创建完全是因为我无法放置 systeminfo | 的结果。直接在 for /f 命令中找到“操作系统名称” - 它不喜欢管道命令。您可能会找到一种更简单的方法来处理从 SYSTEMINFO 获取信息 - 如果是这样,请发表评论。
环境变量 %vers% 有前导空格。我可以使用更长的批处理文件来删除它们,但在这种情况下没有必要。
批处理文件会检测 SYSTEMINFO,因为它假定如果超出旧操作系统检测范围,正在运行的 Windows 版本甚至更旧,并且不会有此实用程序。在 Windows 7 64 位上,它仍然位于 %SystemRoot%\system32 文件夹中 - 如果更高版本的 Windows 变为仅 64 位,则可能必须更新此批处理文件。
返回到 Windows XP 和 DOS 页面。
【讨论】:
经过多次试验和错误,我设法获得了一些不同的工作示例,但最重要的是当批处理在 32 位 CMD 上的 64 位操作系统上启动时。最后,这是我可以开始工作的最简单的检查,它适用于 Win2k-Win8 32/64。 也非常感谢 Phil 在这方面为我提供了帮助。
set bit64=n
if /I %Processor_Architecture%==AMD64 set bit64=y
if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" set bit64=y
【讨论】:
您可以使用以下注册表位置来检查计算机运行的是 32 位还是 64 位 Windows 操作系统:
HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0
您将在右窗格中看到以下注册表项:
Identifier REG_SZ x86 Family 6 Model 14 Stepping 12
Platform ID REG_DWORD 0x00000020(32)
以上x86和0x00000020(32)表示操作系统版本为32位。
【讨论】:
set bit=64
IF NOT DEFINED PROGRAMFILES(X86) (
set "PROGRAMFILES(X86)=%PROGRAMFILES%"
set bit=32
)
REM Example 1: REG IMPORT Install%bit%.reg (all compatibility)
REM Example 2: CD %PROGRAMFILES(X86)% (all compatibility)
【讨论】:
If $SYSTEM_os_arch==x86 (
Echo OS is 32bit
) else (
ECHO OS is 64bit
)
【讨论】:
正确的方式,正如 SAM 之前写的那样:
reg 查询“HKLM\Hardware\Description\System\CentralProcessor\0”/v “标识符” |查找 /i "x86" > NUL && 设置 OS=32BIT ||设置操作系统=64BIT
但 /v "Identifier" 有点正确。
【讨论】:
仅供参考,请尝试不要使用 %PROCESSOR_ARCHITECTURE%,因为 SCCM 在 2012 版左右进行了更改,该更改始终在 32 位进程下启动包/程序(它可以安装 x64,但环境变量将显示为 x86)。我现在用;
如果存在 "%SystemDrive%\Program Files (x86)" GOTO X64
杰克
【讨论】:
set "_os=64"
if "%PROCESSOR_ARCHITECTURE%"=="x86" (if not defined PROCESSOR_ARCHITEW6432 set "_os=32")
基于:https://blogs.msdn.microsoft.com/david.wang/2006/03/27/howto-detect-process-bitness/
【讨论】: