在 .cmd 中使用 Windows 命令测试是 32 位还是 64 位并运行命令

Posted

技术标签:

【中文标题】在 .cmd 中使用 Windows 命令测试是 32 位还是 64 位并运行命令【英文标题】:Using Windows Command in .cmd to test if 32 bit or 64 bit and run a command 【发布时间】:2012-09-04 13:15:56 【问题描述】:

我正在编写一个脚本来查找注册表值并将该值返回到 Windows 命令提示符屏幕,并将其添加到 .txt 文件中。我已经到了需要测试机器是 32 位还是 64 位的地步,这样我就知道使用哪个命令在注册表中找到我需要的值。

我正在按照我在下面写的内容寻找逻辑:

如果是 32 位则(运行此命令) 别的 (运行此命令)

我希望不必有任何文本文件或此脚本工作所需的任何其他内容。以下是我到目前为止的代码。由于注册表位置是私有的,我将位置更改为一个虚构的位置。 (注意:我确实有一个文本文件,该脚本从中读取我插入计算机和服务器的名称。到目前为止,我的代码可以工作,但是使用 2 个注册表查找命令,当它检查 32 位机器时,我显然没有得到正确的结果对于 64 位注册表位置)

@echo off

Setlocal

::sets the ldt variable to the local date and time in yyyymmdd_hhmmss
for /f "skip=1" %%c in ('wmic os get LocalDateTime') do set ldt=%%c
set ldt=%ldt:~0,8%_%ldt:~8,6%


::searches for computer names in servers.txt and then calls server sub routine. Once it goes back to the for loop it moves onto the next line in servers.txt
for /f %%c in (servers.txt) do (
set server=%%c
call:server
)
pause
goto:eof

--------------------------------------------------------------------
:server
set stamp=%date% at %time%
set DateTime=%stamp%

::Tests for a good ping, if no ping then move onto next machine
ping -n 1 -w 250 %server% > nul 
if %errorlevel% NEQ 0 (
  ECHO No Ping on %server%
  ECHO No Ping on %server% >>AuditScript_%ldt%.txt
  goto:eof
)
call:screen
call:log
goto:eof

--------------------------------------------------------------------
:screen
echo.
echo Computer name: %server%
reg query "\\%server%\HKLM\SOFTWARE\Registry Folder1\Information\" /V "Datavalue" | FIND "Datavalue"
reg query "\\%server%\HKLM\SOFTWARE\Wow6432Node\Registry Folder1\Information" /V "Datavalue" | FIND "Datavalue"
echo.
goto:eof

--------------------------------------------------------------------
:log
echo. >>AuditScript_%ldt%.txt
echo Registry value for %server% on %stamp% >>AuditScript_%ldt%.txt
reg query "\\%server%\HKLM\SOFTWARE\Registry Folder1\Information\" /V "Datavalue" | FIND "Datavalue" >>AuditScript_%ldt%.txt
reg query "\\%server%\HKLM\SOFTWARE\Wow6432Node\Registry Folder1\Information" /V "Datavalue" | FIND "Datavalue" >>AuditScript_%ldt%.txt
echo. >>AuditScript_%ldt%.txt
goto:eof

--------------------------------------------------------------------

【问题讨论】:

您可能会使用PROCESSOR_ARCHITECTURE:,如下所述:blogs.msdn.com/b/david.wang/archive/2006/03/26/…。根据social.msdn.microsoft.com/Forums/en/netfx64bit/thread/…,对应的注册表键(所以你可以远程查询)是:“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE” 仍然无法尝试使其与 windows 命令一起使用,但仍在尝试。感谢您的建议 【参考方案1】:
:: Installed OS
Set _Bitness=64
IF %PROCESSOR_ARCHITECTURE% == x86 (
  IF NOT DEFINED PROCESSOR_ARCHITEW6432 Set _Bitness=32
  )
Echo Operating System is %_Bitness% bit

我认为这行得通

【讨论】:

【参考方案2】:
FOR /F "tokens=3" %%x in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /V PROCESSOR_ARCHITECTURE') do set CPU=%%x
echo CPU Architecture: %CPU%
if "%CPU:~-2%"=="64" (
  echo Do This
) else (
  echo Do That
)

【讨论】:

【参考方案3】:

通过 cmd 你可以像这样检查%PROCESSOR_ARCHITECTURE% 变量:

echo %PROCESSOR_ARCHITECTURE% 这将根据操作系统输出x86x64

所以你可以使用类似的东西:

@echo off

if %PROCESSOR_ARCHITECTURE% == x86 (
goto :x86
) else (
goto :x64
)

:x86
start "foo.exe"
goto :eof

:x64
start "bar.exe"
goto :eof

【讨论】:

+1 一种完全合理且实际上是最有效的方法。我没想到自己会像我一样摆弄注册表。 8-D【参考方案4】:

试试这个:

setlocal EnableDelayedExpansion

for /f "delims== tokens=2" %%a in ('wmic os get osarchitecture /value') do (
  set arch=%%a
)

if "%arch%"=="32-bit" (
  rem do some
) else (
  rem do other
)

endlocal

【讨论】:

我最终使用了另一种方法,但感谢您的帮助。我不知道你可以使用 wmic 做到这一点。不过,我投票支持你,再次感谢。

以上是关于在 .cmd 中使用 Windows 命令测试是 32 位还是 64 位并运行命令的主要内容,如果未能解决你的问题,请参考以下文章

安卓手机运行用 电脑windows的cmd命令

cmd设置时区

windows下C与C++执行cmd命令并实时获取输出

我可以在 Windows 命令行中测试 tesseract ocr 吗?

如何消除QT运行程序会伴随一闪而过的cmd命令窗口

NGINX 命令 重启 WINDOWS