2017-08-11 4 views
0

DIE FRAGE ist genau das habe ich das und war NICHTWindows-Batch: Falsches Verhalten bei einem Doppelklick angeklickt - funktioniert auf prompte

Dieses Skript läuft gut, wenn ich auf die Eingabeaufforderung gehen und die file.bat nennen, erhalten alle Dateien * .gsc und bereinigen Sie die Zeilen ohne diese Zeichenfolge.

Aber wenn ich doppelt geklickt habe funktioniert nicht wie erwartet, und sogar die erste Datei wird jedes Mal gelöscht, wenn ich laufe, und keine der verbleibenden Dateien wurden gereinigt. : \

@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" 
      ) 
) 

Ich habe versucht bereits

setlocal enableDelayedExpansion 

Und auch ersetzen die Vars für die Verwendung von "!" anstelle von "%", aber ich mache etwas falsches ... könntest du mir helfen, zu zeigen, was ich genau ändern muss, um diese Arbeit auch mit Doppelklick zu machen?

danke!

+4

Mögliche Duplikat [Batch if-Anweisung nicht für Schleife arbeitet in] (https://stackoverflow.com/questions/45638465/batch-if-statement-not- Works-in-for-Loop) – JosefZ

+0

Meine Fragen lauteten genau, dass ich das versucht habe und nicht funktioniert habe, da stimmt was nicht ... nicht duplizieren. Problem bestehen fort. – Hajas

+0

Es ist ein Duplikat, weil die Batch-Datei auch nicht wirklich funktioniert, wenn sie von einem Eingabeaufforderungsfenster aus ausgeführt wird. Bei der ersten Ausführung der Batchdatei werden alle Vorkommen von% tempfile% durch nichts ersetzt, bevor der Befehl __FOR__ überhaupt ausgeführt wird. Bei der zweiten Ausführung der Stapeldatei im selben Eingabeaufforderungsfenster wird "% tempfile%" durch den letzten Wert ersetzt, der der letzten Schleifenausführung aus der vorherigen Batchdateiausführung vor dem Ausführen des Befehls __FOR__ bei der zweiten Batchdateiausführung durch diese Umgebungsvariable zugewiesen wurde existiert noch aus der vorherigen Batch-Dateiausführung. – Mofi

Antwort

0

Nun, nach vielen Stunden von Versuchen habe ich endlich mit Doppelklick funktioniert. Hier ist der endgültige Code:

@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" 
      ) 
) 

prost

+0

Fehler bei GSC-Dateien, die Ausrufezeichen in ihrem Namen enthalten. – treintje

+3

Der Punkt mit 'delayedexpansion' ist, dass'! Var! '* Erforderlich * ist, wobei der Wert von' var' in einem Block geändert wird (normalerweise der Rumpf einer for-Schleife) und der * new * -Wert von 'var 'ist erforderlich. '% var%' wird immer durch den Wert von 'var' * ersetzt, wenn * * for * * erreicht ist. Da nur 'tempfile' in der 'for'-Schleife geändert wird, muss nur'% tempfile% 'in'! Tempfile! 'Geändert werden. Da 'temp' und' string_to_find' in der Schleife * nicht * geändert werden, könnten sie als% var% übrig bleiben. – Magoo

+1

Und '% ~ dp0 \ %% a' ist besser geschrieben'% ~ dp0 %% a', weil '% ~ dp0' immer auf Laufwerk und Pfad des Arguments 0 (Batch-Dateipfad) erweitert wird und mit einem umgekehrten Schrägstrich endet. Die Windows-Kernelfunktionen für Verzeichnis- und Dateizugriffe haben kein Problem mit '' \\ ''in einem Verzeichnis/Dateipfad, aber die Verwendung von zwei aufeinanderfolgenden Verzeichnisseparatoren innerhalb eines Pfades sollte dennoch vermieden werden, wenn dies wie hier leicht möglich ist. – Mofi

Verwandte Themen