2017-08-14 2 views
0

J'utilise le script ci-dessous pour automatiser certains processus qui faciliteraient ma vie professionnelle. Lors de l'exécution de cette version actuelle, elle est défectueuse et ferme le programme dès que la première instruction if est exécutée. J'ai fait un peu de recherche sur moi-même et le code semble être correct. Le programme s'est fermé si vite que je ne pouvais pas lire une raison pour laquelle. J'ai donc couru toutes les sorties dans un fichier txt. Il semble que le programme présente une erreur de syntaxe. Je n'ai malheureusement pas le fichier avec moi et je n'ai pas l'erreur exacte. Je peux poster demain quand il est devant moi.Si l'instruction dans le fichier batch ne s'exécute pas (Problème de syntaxe possible?)

::Turns off unnecessary messages from Command Prompt 
echo off 

::Copies files over from the NAS drive that are required for setup 
echo Transfering files from NAS1... 
if not exist "%userprofile%\Desktop\Install_Files" mkdir %userprofile%\Desktop\Install_Files 
xcopy /Y \\nas1\Volume_1\"Tech Department"\"General Windows POS Preperation"\* "%userprofile%\Desktop\Install_Files" 
echo File Transfer Complete 

::Start installation of Foxit Reader 
echo Installing Foxit Reader... 
start /w %userprofile%\Desktop\Install_Files\"FoxitReader831_current version".exe 
echo Installations Complete 

::Changes background by changing the file pathway in the registry value 
echo Setting Background... 
REG ADD "HKCU\Control Panel\Desktop" /v Wallpaper /t REG_SZ /d %userprofile%\Desktop\Install_Files\NewTMS1024x768.jpg /f 

::Changes the Workgroup and Computer Name 
echo Setting Computer Name... 
SET /P PCNAME=Please enter computer name: 
wmic computersystem where "Name='%computername%'" rename "%PCNAME%" 

echo Setting Workgroup... 
SET /P WGNAME=Please enter workgroup name: 
Wmic computersystem where name="%computername%" call joindomainorworkgroup name="%WGNAME%" 

::Selecting which POS Software to install 
SET /P POSNAME=Please enter POS Software to install (a:Aldelo m:MAPOS t:TRPOS): 

if /i %POSNAME% == "m" 
(
    ::Transfers required files from NAS drive to Install Folder 
    echo Transferring install files... 
    xcopy /Y \\nas1\Volume_1\"Tech Department"\"POS Software"\MAPOS\* "%userprofile%\Desktop\Install_Files" 

    ::Installs MAPOS and Groovv SDK for card processing 
    echo Installing GroovvSDK... 
    start /w %userprofile%\Desktop\Install_Files\GroovvSDK_Client_Setup_v3.9.6 

    echo Installing MAPOS... 
    start /w %userprofile%\Desktop\Install_Files\mapos_install 
) 

if /i %POSNAME% == "t" 
(
    ::Transfers required install file for TRPOS 
    echo Transferring install files... 
    xcopy /Y \\nas1\Volume_1\"Tech Department"\"POS Software"\TRPOS\TRPOS_install.exe "%userprofile%\Desktop\Install_Files" 

    ::Installs TRPOS 
    start /w %userprofile%\Desktop\Install_Files\TRPOS_install.exe 
) 

if /i %POSNAME% == "a" 
(
) 
else 
(
    echo No POS Software selected or improper input 
) 

::Force restarts the computer so changes will take effect 
::shutdown.exe /r /t 00 
+0

Veuillez fournir la sortie du script afin de savoir d'où provient l'erreur. –

+0

"_Le programme s'est fermé si vite que je ne pouvais pas lire une raison pourquoi_" Ensuite, ouvrez une fenêtre d'invite de commande et exécutez-le à partir de là. Cela vous permet également d'ajouter des instructions 'echo' de débogage et de supprimer/commenter temporairement la commande' echo off'. En général, vous avez des doubles citations incohérentes. Spécifiquement, le "si n'existe pas" en haut du fichier créera la mauvaise chose si votre '% userprofile%' contient des espaces. – TripeHound

Répondre

1

Il y a deux problèmes avec votre if s

La première est liée à la façon dont l'analyseur gère les commandes. La ligne

if %POSNAME% == "m" 

ne compare pas la valeur à l'intérieur de la variable par rapport à une chaîne littérale. Ce qui se passe est que l'analyseur étend la référence de la variable (%POSNAME%) en remplaçant la référence par la valeur dans la commande, puis essaie d'exécuter la commande résultante, sans aucune référence de variable, uniquement la valeur. Ainsi, pour les valeurs attendues stockées dans la variable POSNAME, la commande exécutée et le résultat sera

if %POSNAME% == "m" 

value     parsed as   result 
-------------------------------------------------------------- 
POSTNAME is empty -> if == "m"   syntax error 
POSTNAME is a  -> if a == "a"   false 
POSTNAME is m  -> if m == "m"   false 

Dans le premier cas, la commande échoue parce qu'il n'y a pas de valeur sur le côté gauche de l'opérateur ==. La variable est vide et rien ne peut être placé dans la commande à exécuter.

Le deuxième cas semble logique, mais parfois le troisième cas n'est pas si évident. Pourquoi faux? Parce que la valeur dans le côté droit du == est un littéral entre guillemets tandis que la valeur dans le côté gauche est un littéral non guillemets, donc les deux valeurs ne correspondent pas.

Vous pouvez résoudre ce problème en citant simplement les deux côtés

if "%POSNAME%"=="m" 

value     parsed as   result 
-------------------------------------------------------------- 
POSTNAME is empty -> if "" == "m"   false 
POSTNAME is a  -> if "a" == "a"   false 
POSTNAME is m  -> if "m" == "m"   true 

(Note: vous pouvez également unquote les deux côtés, mais il n'est pas recommandé, sauf si vous êtes tout à fait sûr de ce que les valeurs des deux côtés sont et que la la commande résultante ne génèrera pas de problèmes)

Le deuxième problème dans votre code est le placement des parenthèses. La syntaxe des lots, elles doivent être bien placés:

  • Si elle est présente, la parenthèse d'ouverture dans la clause if doit être dans la même ligne qui contient le if

  • S'il y a une clause else alors la fermeture if parenthèse doit être dans la ligne else.

  • S'il y a une parenthèse d'ouverture else, il doit être dans la ligne else

Ainsi, ce

if "%POSNAME%"=="m" 
(
    ..... 
) 

n'est pas une syntaxe valide. Vous pouvez voir here des exemples de la façon de placer la parenthèse.

+0

Quand je suis entré au travail ce matin, je suis allé de l'avant et j'ai fait ces changements et cela a semblé fonctionner. Alors que j'étais au courant des doubles guillemets (dans une certaine mesure). Je n'étais pas au courant de la deuxième partie de la solution que vous avez donnée. Il semble que de nombreux exemples de code en ligne que je regardais en ligne étaient incorrects. Merci pour l'aide! – TGutmann87

0

Pour les démarreurs ... il y a un problème avec les instructions IF. Vous devez citer les deux côtés de == et supprimer les espaces. Modifier ce format

if /i %POSNAME% == "m" 

à cette

if /i "%POSNAME%"=="m" 

Essayez cela et afficher les résultats.

+0

A l'origine, c'est ainsi que j'ai formaté les instructions if. J'avais parcouru les étapes de la mise en double guillemets de cette variable globale, mais les résultats n'étaient pas différents. Basé sur la documentation que j'ai trouvée à travers les fenêtres tout semble correct. Les variables globales n'auraient besoin de guillemets que si elles contenaient des espaces ou d'autres caractères – TGutmann87