2016-08-02 7 views
0

これまでバッチファイルを実行していません。私は数十の.txtファイルをフォルダ(例えばC:\ files)に置いています。複数の.txtファイルから最後の6行を削除

ファイルはすべて削除する必要がある6行のテキストで終わります。サンプルは、(最初​​の行にメモスペース)のようになります。ファイル名やディレクトリは変更されないように

var... 
'ascending';... 
'LIT-xxx,LIT-xxx... 
setfunction... 
0.33... 
getdate... 

また、私は、現在のファイルを上書きする「新しい」ファイルをしたいと思います。

abs 10.txt 
him 4.txt 
lab 18.txt 

答えて

0

次のコードスニペットは、テキストファイルからの最後の6行を削除、あなたが望むものを正確に行います。

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FILES=C:\files\*.txt" & rem // (specify file location and pattern) 
set /A "LINES=-6"   & rem /* (specify number of lines to delete; 
          rem  positive number: delete from begin, 
          rem  negative number: delete from end) */ 

rem // Standard `for` loop to resolve file pattern: 
for %%F in ("%FILES%") do (
    rem // Get the count of lines for the current file: 
    for /F %%N in ('^< "%%~F" find /C /V ""') do set "COUNT=%%N" 
    rem // Initialise a line index: 
    set /A "INDEX=-LINES" 
    rem /* Enumerate all lines of the current file, preserving empty ones 
    rem by preceding each with a line number, so no line appears empty 
    rem to the `for /F` loop; the line number is split off later on; 
    rem in addition, the current file is emptied after being read: */ 
    for /F "delims=" %%L in (' 
     findstr /N /R "^" "%%~F" ^& ^> "%%~F" break 
    ') do (
     rem // Increment index, get text of currently iterated line: 
     set /A "INDEX+=1" & set "LINE=%%L" 
     rem // Toggle delayed expansion to preserve exclamation marks: 
     setlocal EnableDelayedExpansion 
     rem // Check index value and write to current file conditionally: 
     if !INDEX! GTR 0 if !INDEX! LEQ !COUNT! (
      rem // Split off line number from line text: 
      >> "%%~F" echo(!LINE:*:=! 
     ) 
     endlocal 
    ) 
) 

endlocal 
exit /B 

このアプローチは、任意の名前の衝突を避けるために一時ファイルを使用していません。しかし、単一のファイルごとに複数のファイル書き込み操作があるため、すべてのデータを一度に一時ファイルに書き込んで元のファイルに戻す場合よりも全体のパフォーマンスが少し悪くなります。

+0

理由を教えてくれずにdownvotingしてくれてありがとう!! – aschipfl

+0

なぜあなたがダウンしたのかわからない。まず、あなたのコードの説明を参考にしていただければ幸いです。さらに、スクリプトを実行するのに1分ほどかかりましたが(パフォーマンスが悪化すると指摘していました)、完全に機能しました。それはすべてのファイルから下の6行を削除し、元のファイルを一時ファイルなしのフォルダに保存しました。各テキストファイルの名前を指定する必要がなかったので非常に簡単でした。ありがとう!! – mslhrt

0

異なるバックアップフォルダにバックアップ元のファイルを、このスクリプトを実行します。

@echo off 
setlocal enabledelayedexpansion 
pushd "%temp%\Test" 
for %%G in ("*.txt") do (set "break=" 
    (for /f "delims=|" %%H in (%%~G) do (
     if not defined break (
      echo %%H | findstr /r /b /c:"[ ]*var.*" >nul && set break=TRUE || echo %%H) 
    )) >> %%~nG_mod.txt 
    del %%~G & ren %%~nG_mod.txt %%G) 
popd 
exit /b 

それは仮定:テキストの

  • あなたの6行はいつものように、[any number of spaces]var[any text]列目からスタートこのような種類の文字列がファイル内に1つだけ存在する質問に投稿されました
  • 他の5つの行はすべてのファイルで一致する必要はありません
  • フィルタリングするファイルを%temp%\Testに保存します。そのディレクトリには他の無関係なファイルはありません。
+0

私はスクリプトを実行しようとしました。これはエラーを出さなかったが、フォルダ内に別のファイル(abs 10_modなど)が作成された。元のファイルでは、何も削除されませんでした。 – mslhrt

+0

スペースが含まれているため、1st varのスペルは間違っている可能性があります。各ファイルで6行が同じであれば、明確にはなりませんでした。 – sambul35

+0

どういう意味ですか?私はあなたのコードを変更しました: "%% H" == "var"(エコー%%など。これはファイルのテキストの後に3つのドットがない代わりにランダムなテキストがたくさんあるためです。 – mslhrt

関連する問題