Existe alguma forma de abordar universalmente a pasta padrão Arquivos de Programas no Windows 7/2008 via arquivo .BAT?

2

Eu gostaria de escrever um arquivo de lote, onde alguns comandos direcionam itens na pasta Program Files , que é naturalmente compatível com o Windows XP até o Windows 7 x64 e Server 2008 R2. No entanto, o nome da pasta que eu preciso nos sistemas de 64 bits é Program Files (x86) .

Existe um comando em lote que me permitirá detectar a arquitetura do sistema e escrever uma instrução IF para usar a pasta apropriada? Como alternativa, existe uma variável de ambiente universalmente aplicável que me aponte para a pasta correta? Ou, eu teria que definir parte do meu script para procurar a pasta x86 e usá-la, se presente, usando apenas a outra pasta, se não for?

    
por Iszi 16.02.2012 / 21:33

2 respostas

1

Não me lembro onde encontrei isso, mas você é bem-vindo a isso. Eu modifiquei para verificar 32 bits e 64 bits do Windows 7. Deve ser bastante auto-explicativo.

@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

::Check if 32 or 64 bit
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor
@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

::Check if 32 or 64 bit
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor%pre%
REG.exe Query %RegQry% > checkOS.txt
Find /i "x86" < CheckOS.txt > StringCheck.txt

    If %ERRORLEVEL% == 0 (
        :Run Windows 7 32 bit specific commands here.
        Echo "This is 32 Bit Windows 7"
    ) ELSE (
        :Run Windows 7 64 bit specific commands here.
        Echo "This is 64 Bit 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
REG.exe Query %RegQry% > checkOS.txt Find /i "x86" < CheckOS.txt > StringCheck.txt If %ERRORLEVEL% == 0 ( :Run Windows 7 32 bit specific commands here. Echo "This is 32 Bit Windows 7" ) ELSE ( :Run Windows 7 64 bit specific commands here. Echo "This is 64 Bit 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
    
por 16.02.2012 / 22:21
1

Você pode apenas verificar se ProgramFiles (x86) está vazio ou não. Contanto que nenhum usuário ou programa o configure manualmente.

@ECHO OFF

IF "%ProgramFiles(x86)%"=="" GOTO 64 ELSE goto 86

:64
ECHO %ProgramFiles(x86)%

GOTO Quit

:86
ECHO %ProgramFiles%

GOTO Quit

:Quit
PAUSE

Alternativamente, você pode verificar a variável PROCESSOR_ARCHITECTURE - se for um sistema de 32 bits, deve ser "x86", se for um x86-64, deve ser "AMD64", se for uma CPU Itanium, deve ser "IA64" . Eu não testei o Itanium, no entanto. E não tenho certeza do que isso diria no caso de um sistema Windows de 32 bits sendo instalado em uma máquina x86-64.

Estes foram verificados / testados no Windows 7 e devem funcionar no Vista. O Windows XP de 64 bits sempre foi desonesto, por isso pode não funcionar lá.

    
por 16.02.2012 / 23:38

Tags