2017-08-11 3 views
0
rapide

LA QUESTION EST EXACTEMENT QUE JE ET QUE FAIT NON TRAVAILLÉESde Windows Batch: comportement incorrect lors de double clic - Fonctionne bien sur

Ce script fonctionne bien si je vais à l'invite et appelle le fichier.bat, obtenir tous les fichiers * .gsc et nettoyer les lignes sans cette chaîne. Mais quand j'ai double-cliqué ne fonctionne pas comme prévu, et même le premier fichier est supprimé chaque fois que je cours, et aucun des fichiers restants ont été nettoyés. : \

@echo off 
set "string_to_find=level.waypoints\[" 
for /f "tokens=*" %%a in ('dir /B *.gsc') do (
      set "tempfile=%temp%\%%a" 
      if exist "%tempfile%" del "%tempfile%" >NUL 
      findstr /C:"%string_to_find%" "%~dp0\%%a" >> "%tempfile%" 
      if not errorlevel 1 (
         del "%%a" >NUL 
         move /Y "%tempfile%" "%~dp0\%%a" >NUL 
         if exist "%tempfile%" del "%tempfile%" >NUL 
         echo File "%~dp0\%%a" processed successfully 
      ) else (
      echo Problem processing file "%~dp0\%%a" 
      ) 
) 

Je l'ai déjà tryed à utiliser

setlocal enableDelayedExpansion 

Et aussi remplacer les vars pour "!" au lieu de "%", mais je fais quelque chose de mal ... pourriez-vous m'aider à pointer ce que j'ai besoin de changer pour que cela fonctionne également en double-cliquant?

merci!

+4

double possible de [lot si la déclaration ne fonctionne pas dans la boucle for] (https://stackoverflow.com/questions/45638465/batch-if-statement-not- travailler-dans-pour-boucle) – JosefZ

+0

Mes questions étaient exactement dire que j'ai essayé cela et n'a pas fonctionné, il y a quelque chose de mal ... pas de doublon. Le problème persiste. – Hajas

+0

Il s'agit d'un doublon, car le fichier de commandes ne fonctionne pas vraiment à partir d'une fenêtre d'invite de commande. Lors de la première exécution du fichier batch, toutes les occurrences de '% tempfile%' ne sont remplacées par rien avant l'exécution de la commande __FOR__. Lors de la deuxième exécution du fichier batch dans la même fenêtre d'invite de commande,% tempfile% est remplacé par la dernière valeur de la dernière exécution de l'exécution précédente du fichier batch avant l'exécution de la commande __FOR__ lors de l'exécution du deuxième batch existe toujours à partir de l'exécution du fichier batch précédent. – Mofi

Répondre

0

Eh bien, après de nombreuses heures d'essais, je l'ai enfin réussi en double-cliquant maintenant. Voici le code final:

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
set "string_to_find=level.waypoints\[" 
for /f "tokens=*" %%a in ('dir /B *.gsc') do (
      set "tempfile=!temp!\%%a" 
      if exist "!tempfile!" del "!tempfile!" >NUL 
      findstr /C:"!string_to_find!" "%~dp0\%%a" >> "!tempfile!" 
      if not errorlevel 1 (
         del "%%a" >NUL 
         move /Y "!tempfile!" "%~dp0\%%a" >NUL 
         if exist "!tempfile!" del "!tempfile!" >NUL 
         echo File "%~dp0\%%a" processed successfully 
      ) else (
      echo Problem processing file "%~dp0\%%a" 
      ) 
) 

acclamations

+0

Echoue avec les fichiers GSC contenant des points d'exclamation dans leur nom. – treintje

+3

Le point avec 'delayedexpansion' est que'! Var! 'Est * requis * où la valeur de' var' est changée dans un bloc (typiquement le corps d'une boucle 'for') et la * nouvelle * valeur de' var 'est requis. '% var%' sera toujours remplacé par la valeur de 'var' * au moment où *' for' * est atteint *. Par conséquent, puisque seul 'tempfile' est modifié dans votre boucle' for', seul '% tempfile%' doit être changé en '! Tempfile!'. Comme 'temp' et' string_to_find' ne sont pas modifiés dans la boucle, ils pourraient rester sous la forme '% var%'. – Magoo

+1

Et '% ~ dp0 \ %% a' est mieux écrit'% ~ dp0 %% a' car '% ~ dp0' se développe toujours pour conduire et le chemin de l'argument 0 (chemin du fichier batch) se terminant par une barre oblique inverse. Les fonctions du noyau Windows pour les accès aux répertoires et fichiers n'ont pas de problème avec '' \\ '' dans un répertoire/chemin de fichier, mais l'utilisation de deux séparateurs de répertoires successifs dans un chemin doit être évitée si cela est possible. – Mofi