10
votes

Si existe c: \ répertoire \ goto a d'autre goto b Problèmes de fichiers de lots Windows XP

Chaque fois que j'exécute le code ci-dessous, cela me survient que j'ai commis une erreur en utilisant les lignes Si Existe, comme si le répertoire existe ou non, il agit comme si la ligne n'était jamais là ... soit cela, soit cela ne lisant pas la ligne d'essence.


xxx

4 commentaires

Autorisations vérifiées sur les répertoires?


Les autorisations vont bien, car les répertoires n'existent pas actuellement. Je ne suis pas encore inquiet pour la copie du réseau à ce jour.


Dans le deuxième groupe, vous manquez la directive goto . Goto Oldexistes d'autre OldexistsContinuer


Merci, remarqua que moi-même quand je les ai mis sur toutes les lignes suivantes.


6 Réponses :


7
votes

Si vous souhaitez exclure tout problème avec la pièce el / code>, essayez de supprimer le el / code> et placez la commande sur une nouvelle ligne. Comme ceci: xxx


0 commentaires

2
votes

Il y a un autre dans la langue de lots DOS? De retour dans l'époque où j'ai fait plus de ce genre de chose, il n'y avait pas.

Si ma théorie est correcte et que votre autre est ignoré, vous pouvez être mieux en train de faire P>

IF NOT EXIST C:\dir\NUL GOTO ...


5 commentaires

Je travaille dans le script de lots Windows XP, pas sûr de DOS, mais cela fonctionne, mais cela fonctionne, a découvert mon erreur à cause de votre message, robvanderwoude.com/ntitif.php résume-le. Merci également pour la pointe nul pratique, il n'ya pas de fichier je peux vérifier de manière fiable.


Merci également à n'exister aucune ligne de sauvegarde, mais j'aime la façon dont je l'ai eu, comme je peux imaginer les étiquettes comme "pseudo bretelles"


Carl: La grande majorité des questions par lots sur ce site n'ont rien à voir avec DOS. Bien que de nombreuses personnes prétendent à tort, elles posent une question sur les fichiers DOS par lots, ils fonctionnent généralement tous sur Windows et signifient le processeur de commande Windows cmd.exe . La syntaxe est superficiellement similaire mais grandement étendue par rapport à ce que Command.com était capable de. Simplement regrouper les deux ensemble dans une classe est tout simplement faux.


Command.com a été réécrit et appelé cmd.exe; Et divers solutions de contournement à des problèmes courants ont été boulonnés à un sous-ensemble des commandes. C'est bien sûr une question d'opinion, mais je nie que le changement de DOS d'Ancien est aussi dramatique que vous le faites. Cas d'affaire: ma connaissance antiquitée de la syntaxe DOS a aidé l'OP résoudre son problème.


Je reconnais cependant que la mention de DOS avait tort dans le contexte donné et déroutant inutilement à l'astucieux.



21
votes

Utilisez des parenthèses pour regrouper les branches individuelles: xxx

dans votre cas, l'analyseur ne verra jamais le sinon appartenant au si parce que goto acceptera avec heurement tout jusqu'à la fin de la commande. Vous pouvez voir un problème similaire lors de l'utilisation de echo au lieu de goto .

Aussi à l'aide de parenthèses vous permettra d'utiliser les déclarations directement sans avoir à sauter directement sans avoir à sauter autour de (Bien que je n'ai pas pu réécrire votre code pour utiliser réellement des techniques de programmation structurées; peut-être qu'il est trop tôt ou qu'il ne se prête pas bien de bloquer les structures car le code est en ce moment).


3 commentaires

Ce test ne distingue pas les fichiers et les répertoires.


@ Jaroslavzáruba: Cela fait, notez la barre oblique inverse.


C'est vrai, mon mauvais, j'ai testé les deux backslashes-and-dot conseillés dans d'autres réponses, mes excuses ... Imma retourner la uppote à vous ailleurs :)



6
votes

de l'aide ( si /? ): xxx


3 commentaires

Cela ne raconte pas toute l'histoire, cependant. Il n'est pas immédiatement évident que goto consomme la ligne complète au lieu d'un seul jeton. Il est documenté ici pour del qui a du sens mais intuitivement je dirais que ce n'est pas évident pour goto .


Si le del doit être résilié par une nouvelle ligne, existe-t-il une raison pour que tout autre commandement n'aurait pas également besoin d'être résilié par une nouvelle ligne?


La confusion déposée probablement «la clause d'autre doit se produire sur la même ligne que la commande après le si» je l'ai fait, et cela n'a pas fonctionné. Je n'ai pas compris au moment où l'utilisation des parens rendant la même ligne que si elle. Parce que d'une perspective non-programmation, ce sont des lignes différentes. Il y a des revers!



1
votes
@echo off

:START
rmdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause

echo.
echo.
echo Note the directory is not found
echo.
echo Press any key to make a temporary directory, cls, and test again
pause

Mkdir temporary
cls
IF EXIST "temporary\." (echo The temporary directory exists) else echo The temporary directory doesn't exist
echo.
dir temporary /A:D
pause
echo.
echo press any key to goto START and remove temporary directory 
pause 

goto START

0 commentaires

0
votes

Pour vérifier les répertoires, vous ne devez pas utiliser quelque chose comme:

if exist c:\windows\\.


3 commentaires

Doit utiliser deux barres lorsque vous souhaitez vérifier si un répertoire existe, auquel cas il peut y avoir un fichier appelé "Windows" à la racine de la partition C:


Sur Windows 7 au moins, existe c: \ file \. et et c: \ file \\. sont tous deux true si le fichier est présent, donc cette pointe t Travailler pour moi. :-(


C'est tout simplement faux. Cette syntaxe ne se distingue pas entre un dossier ou un fichier. Si Existe C: \ Windows` fonctionne fréquemment, mais peut échouer s'il s'agit d'un point de jonction ou d'une liaison symbolique. Le code le plus simple qui semble toujours fonctionner est s'il existe C: \ Windows * `.