2016-05-02 6 views
2

ich Batchdatei schreiben, und ich habe ein Problem:Batch-Datei einiger Zeilen aus einer Textdatei in einer anderen Textdatei kopieren

Ich mag, dass alle Zeilen aus dem aktuellen Datum bis zum Ende der Datei

schreiben

Beispiel für Textdatei:

not copy this line. 
not copy this line. 
not this line. 
5/02/2016 10 20 30 45 05 56 70 (from here) 
5/03/2016 10 20 30 45 05 56 70 
5/04/2016 10 20 30 45 05 56 70 
5/05/2016 10 20 30 45 05 56 70 

Mein Code:

@ECHO OFF 
set filename=abc.txt 
set filename2=outFile.txt 
set find=find.txt 
set sourceFolder=c:\1\ 
IF EXIST "%find%" DEL "%find%" 
IF EXIST "%filename2%" DEL "%filename2%" 
IF EXIST "SAMPLE_text01.txt" DEL "SAMPLE_text01.txt" 
set currentdate=%date% 
set newdate=%currentdate:~5,11% 
echo %newdate% >> %sourceFolder%%find% 

findstr /g:%sourceFolder%%find% %sourceFolder%%filename% > %sourceFolder%%filename2% 

set count=0 

for /f "tokens=*" %%i in ('findstr /g:%sourceFolder%%find% 
"%sourceFolder%%filename%"') do (

    rem echo count is %count% 
    set /a count+=1 
    echo.%* >> temp.txt 
) 

pause 
+0

Was ist das Problem des Codes? Zeigt es alle deine Linien an? Keiner? – purplepsycho

+1

Also, dein Ziel ist es, die ersten drei Zeilen in der Quelltextdatei zu überspringen und den Rest in eine andere Datei zu kopieren ??? – Hackoo

+2

Es scheint mir, dass sein Ziel ist, die ersten * n * Zeilen zu überspringen, wo das Datum rojo

Antwort

1

das Datumsformat in Ihrer Textdatei Gesetzt ist der gleiche wie der Einbau-Umgebungsvariable %DATE% zurückgegeben, das folgende Skript - lassen Sie uns es lines-from-today-on.bat nennen - für Sie arbeiten sollten:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem Define constants here: 
set "INFILE=%~1" 
if not defined INFILE set "INFILE=%~dpn0.txt" 
set "OUTFILE=%~2" 
if not defined OUTFILE set "OUTFILE=con" 

> "%OUTFILE%" (
    set "FLAG=" 
    for /F "delims=" %%L in (' 
     findstr /N /R "^" "%INFILE%" 
    ') do (
     set "LINE=%%L" 
     setlocal EnableDelayedExpansion 
     for /F "tokens=1 eol= " %%F in ("!LINE:*:=!") do (
      endlocal 
      if "%%F"=="%DATE%" (
       set "FLAG=#" 
      ) 
      setlocal EnableDelayedExpansion 
     ) 
     if defined FLAG echo(!LINE:*:=! 
     endlocal 
    ) 
) 

endlocal 
exit /B 

Um es zu nutzen, nennen sie es, indem sie die Eingabedatei als Befehlszeilenargument Providing (Textdatei sample.txt im aktuellen Verzeichnis in diesem Beispiel):

lines-from-today-on.bat sample.txt 

Dies zeigt die extrahierten Linien auf der Konsole. Um die Ausgabe in einer anderen Textdatei (return.txt hier), bietet ein weiteres Argument:

lines-from-today-on.bat sample.txt return.txt 
+0

Ich denke, dass Sie die Frage besser verstanden haben als ich. +1 – rojo

+0

Danke, @rojo! Ich nahm an, dass die Eingabedatei so etwas wie eine Protokolldatei ist, also werden die Daten aufsteigend sortiert (auch gemäß den Beispieldaten des OP); das erlaubt mir einen einfachen Stringvergleich ('=='), so dass keine echten (nicht unterstützten) Datumsvergleiche nötig sind ('> =') ... – aschipfl

0

Da das Batch-Sprachobjekt kein Datum hat, finde ich es bequemer, einen Helfer Sprache zu verwenden, den Fall ist. Mit JScript können Sie zum Beispiel die Less-Than/Grösser-als-Vergleiche für Datumsobjekte verwenden, und die Formatierung von Daten ist etwas fehlerverzeihender. (Werden die Textdateien immer einen Null-gefüllten Tag und einen nicht-zero-gepolsterten Monat haben? JScript new Date() Konstruktor wird das gleiche funktionieren.)

Speichern Sie dies mit einer Erweiterung .bat und sehen Sie, was Sie denken.

@if (@CodeSection == @Batch) @then 
@echo off & setlocal 

set "in=abc.txt" 
set "out=outfile.txt" 
set "found=" 

rem // redirect output to outfile 
> "%out%" (
    rem // for each line of the text file... 
    for /f "usebackq delims=" %%I in ("%in%") do (
      rem // use JScript to check whether line contains a date of today or future 
      if not defined found call :isCurrent "%%~I" && set "found=1" 
      if defined found echo(%%I 
     ) 
    ) 
) 

goto :EOF 

:isCurrent <date> 
cscript /nologo /e:JScript "%~f0" "%~1" 
exit /b %ERRORLEVEL% 

@end // end batch/begin JScript hybrid code 

try { 
    var today = new Date(new Date().toDateString()), // truncate to midnight 
     otherDate = new Date(WSH.Arguments(0).match(/\b\d+\/\d+\/\d+\b/)[0]); 
} 
catch(e) { WSH.Quit(1); } // exits non-zero if argument contains no dates 

// exits non-zero if otherDate is earlier than today 
WSH.Quit(!(today <= otherDate)); 
+0

hallo ich versuche es, aber es funktioniert nicht abc.txt --dfsdgfs 8/2/2016 3 5 8 9 FDS dfds 5/2/2016 1 23 4 5 6/2/2016 3 5 8 9 – user3132036

+0

@ user3132036 OK, I das Skript so modifiziert, Es wird die gesamte Zeile nach einer Zeichenfolge durchsucht, die mit Ihrem MM/TT/JJJJ-Datum übereinstimmt. und wenn heute, öffne die Schleusentore und wiederhole das + jede weitere Zeile in outfile.txt. Hast du das versucht? – rojo

+0

hallo danke allot es funktioniert gut. Kannst du herausfinden, warum der Code, den ich geschrieben habe, nicht funktioniert? – user3132036

Verwandte Themen