2016-04-08 1 views
0

S'il vous plaît voir les codes 2 échantillons:Quelqu'un peut-il s'il vous plaît donner une explication à ces différentes sorties

@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" 
    set ProgFileDir=%ProgramFiles% 
) ELSE (

    Echo "This is 64 Bit Operating System" 
     set ProgFileDir=%ProgramFiles(x86)% 
) 
del checkos.txt 
del stringcheck.txt 

echo --------------- 
echo "%ProgFileDir%" 
echo ---------------- 
pause 

Cela me donne une mauvaise sortie:

"This is 64 Bit Operating System" 
--------------- 
"C:\Program Files (x86" <==Notice how the closing brace is trimmed 
---------------- 
Press any key to continue . . . 

Si je change la position de la déclaration set ProgFileDir=%ProgramFiles(x86)% en dehors du support:

@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" 
    set ProgFileDir=%ProgramFiles% 
) ELSE (

    Echo "This is 64 Bit Operating System" 
) 
del checkos.txt 
del stringcheck.txt 

     set ProgFileDir=%ProgramFiles(x86)% 
echo --------------- 
echo "%ProgFileDir%" 
echo ---------------- 
pause 

-je obtenir le résultat correct:

"This is 64 Bit Operating System" 
--------------- 
"C:\Program Files (x86)" <== with the closing brace 
---------------- 
Press any key to continue . . . 

Qu'est-ce que je fais de mal ici? J'exécute ce fichier de commandes sur Windows 7 64 bits OS.

+0

En plus de votre question, vous pouvez simplifier le code en détectant la variable système sans créer 2 fichiers temporaires. [http://ss64.com/nt/syntax-64bit.html](http://ss64.com/nt/syntax-64bit.html]] – enjoying

Répondre

2

Je pense que votre fichier .bat a été de se confondre avec le ( ci-dessus del checkos.txt vous aussi sur le préfixe avec un accent circonflexe: ^

@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" 
    set ProgFileDir=%ProgramFiles% 

) ELSE ( 
ECHO "This is 64 Bit Operating System" 
) 
set ProgFileDir= %ProgramFiles(x86)% 

del checkos.txt 
del stringcheck.txt 

echo --------------- 
echo "%ProgFileDir%" 
echo ---------------- 
pause 

également lire sur la commande set HERE

2
@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" 
    set "ProgFileDir=%ProgramFiles%" 
) ELSE (

    Echo "This is 64 Bit Operating System" 
     set "ProgFileDir=%ProgramFiles(x86)%" 
) 
del checkos.txt 
del stringcheck.txt 

echo --------------- 
echo "%ProgFileDir%" 
echo ---------------- 
GOTO :EOF 

Utilisation de la set "var=string" syntaxe supprime le "string" de la portée de l'analyseur et garantit également que les espaces de fin sur la ligne sont non inclus dans la valeur attribuée.

Depuis le ) dans programfiles(x86) est maintenant dans les oreilles de lapin, il est Oart d'une chaîne, transformant au large de sa signification particulière (fermeture de la clause else.) Peut-être une manière plus conventionnelle en utilisant la syntaxe d'origine est d'échapper à la ) avec un caret ainsi: ^) qui désactive la signification spéciale des caractères dans la mesure où l'analyseur est concerné et les rend à des caractères ordinaires.

?? Je ne suis pas sûr si la variable programfiles(x86) est établie pour les systèmes d'exploitation 32 bits. Si tel est le cas,

set "progfiledir=%programfiles%" 
if defined programfiles(x86) set "progfiledir=%programfiles(x86)%" 

semblerait obtenir le même résultat ...