2011-08-06 5 views
6

Dites que j'ai un fichier batch pour effectuer une compilation longue et à la fin il crée un fichier EXE. Si j'oublie de fermer l'application avant de démarrer la génération, la phase de liaison échoue lorsqu'elle ne peut pas recréer l'EXE.Détection si un fichier est ouvert dans un fichier de commandes

Je veux vérifier si le EXE est ouvert au commencer de la construction. J'ai essayé de renommer le fichier EXE à lui-même, mais bien que cela donne une erreur d'accès refusé la commande renommer (étant une commande interne) ne définit pas% ErrorLevel%.

Qu'est-ce qu'un moyen non destructif de vérifier un fichier ouvert qui définit% ErrorLevel% à une valeur non nulle?

Répondre

6

La méthode de renommage n'a pas fonctionné pour moi (testé sur Windows XP SP3). J'ai commencé une application arbitraire et j'ai essayé de la renommer. Il n'y avait aucune erreur, aucun effet.

Cependant, cette méthode ne fonctionne:

COPY /B app.exe+NUL app.exe 

Lorsque l'application est en cours d'exécution, cette commande me produit un message d'erreur. Et lorsque l'application n'était pas activée, non seulement cette commande préservait le contenu du fichier, mais elle laissait également l'horodatage de modification inchangé.

Si je vous, donc, je ne serais probablement utiliser cette commande (au début du script de traitement par lots, comme vous l'avez dit) ainsi:

COPY /B app.exe+NUL app.exe >NUL || (GOTO :EOF) 

L'opérateur || passe le contrôle à la commande/block à côté si la commande précédente a échoué (a augmenté la valeur errorlevel). Par conséquent, la commande ci-dessus terminerait le script si la copie a échoué (ce qui serait le cas si le fichier était ouvert). Le message d'erreur sera conservé (car ces messages sont généralement envoyés au périphérique d'erreur standard et ne sont pas ignorés avec la redirection >NUL, alors que d'autres, les messages non-erreur sont généralement envoyés à la sortie standard et peuvent donc être supprimé avec >NUL) et servir d'explication de la fin prématurée du script. Toutefois, si vous souhaitez afficher votre propre message à la place, vous pouvez essayer quelque chose comme ceci:

COPY /B app.exe+NUL app.exe >NUL 2>NUL || (ECHO Target file inaccessible& GOTO :EOF) 

Alors que >NUL cache tout ce qui est envoyé à la sortie standard, 2>NUL fait la même chose pour l'erreur type.

+0

Merci @Andriy. Oui, ça fonctionne. Cela peut prendre un peu de temps cependant, si les exécutables impliqués sont grands, quels sont les miens. L'autre façon dont je pensais était d'écrire un utilitaire delphi à 2 lignes qui essaie de renommer un fichier en un nom aléatoire, et le renomme en cas de succès, et renvoie un code de sortie nul si ce n'est pas le cas. – rossmcm

1
@echo off 

:start 
ren filename filename  // rename file to same name 
if errorlevel 1 goto errorline 
echo command successfull file is not in use anymore 
goto end 
:errorline 
echo Rename wasnt possible, file is in use try again in 5seconds 
timeout /T 5 
goto :start 
:end 
exit 

renomme fichier du même nom, si possible le script saute à la fin whichs quitter le code, Otherwize il produit code1 d'erreur et saute à errorline, après un délai d'attente de 5 secondes, il saute à: démarrer et script démarre Depuis le début.

+0

Une explication de ce que cela fait?Comment l'appeler ou l'utiliser? Pourriez-vous le traduire en anglais s'il vous plaît? – Abel

1

trouvé une meilleure solution:

:start 
timeout /T 5 

if exist %1 (
2>nul (
    >> %1 (call) 
) && (goto ende) || (goto start)) else (exit) 


:ende 
YourCode 

Cela vérifiera tous les après 5 secondes pour « est le fichier en cours d'utilisation » si elle son il commencera à nouveau. sinon, il se tourne vers ende où vous pouvez faire vos prochaines options

Questions connexes