Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @echo off
- cd /d %~dp0
- setlocal ENABLEDELAYEDEXPANSION
- REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
- REM 【.cmd】 バッチファイルスクリプト %12 【.bat】
- REM http://mevius.5ch.net/test/read.cgi/tech/1489207631/404
- REM
- REM 404デフォルトの名無しさん2018/03/16(金) 22:05:15.90ID:HEHaQcsS
- REM バッチファイルで空行を除く最終行にhogeって文字がなかったら追加して改行
- REM -- hogeとかになってたら削除してhoge追記して改行
- REM って事をやりたいんですけどどうやったらできるかおせーてください
- REM
- REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
- REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
- REM 引数: 処理したいテキストファイル
- REM
- REM ToDO
- REM ・行の内容や指定文字列に & % ^ " ' ( ) といった特殊文字が入ってると
- REM 容赦なくコケたりするという地獄仕様をどげんかせんといかん。
- REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
- IF "%~1"=="" (
- @echo ファイルが指定されていません
- goto eof
- )
- IF NOT "%~x1"==".txt" (
- @echo 指定できるのは.txtファイルだけです
- goto eof
- )
- REM 行番号を付与した一時ファイルを保存するディレクトリ
- set tempdir=.\temp
- IF NOT EXIST %tempdir% (
- mkdir %tempdir%
- )
- REM 出力する結果ファイル
- set resultFile=".\処理結果.txt"
- REM ファイルの中に絶対に含まれていない文字列
- set nonExtString=ZettainiHukumaretenaiMojiretsuDesse
- REM ---------------------------------------------------------
- REM まずは行番号を付与した一時ファイルを生成しておく
- REM ---------------------------------------------------------
- set nlog=%tempdir%\%~n1_N.txt
- findstr /V /N /C:"%nonExtString%" "%~1" > "%nlog%"
- REM ---------------------------------------------------------
- REM ターゲットファイルの行数を得る
- REM (まあこれは特にやらなくてもいい)
- REM ---------------------------------------------------------
- set targetFileLineNum=0
- FOR /F "delims=[]: " %%a IN ('findstr /B /R /C:"[0-9]*:" "%nlog%"') DO (
- set targetFileLineNum=%%a
- )
- @echo ファイルの行数は %targetFileLineNum% 行です。
- REM ---------------------------------------------------------
- REM ターゲット文字列が含まれている最後の行の番号とその行の内容を得る
- REM (まあこれは特にやらなくてもいい)
- REM ---------------------------------------------------------
- set targetString=hoge
- set targetStrLineNum=0
- set targetLineString=Torenakattayo
- FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /C:"%targetString%" "%nlog%"') DO (
- set targetStrLineNum=%%a
- set targetLineString=%%b
- )
- @echo 【%targetString%】 が最後に含まれているのは %targetStrLineNum% 行目で、内容は【%targetLineString%】です。
- REM ---------------------------------------------------------
- REM 空行を除く有意な最終行の行番号と内容を得る
- REM ---------------------------------------------------------
- set lastLineNum=0
- set lastLineString=Torenakattayo
- FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
- IF NOT "%%b"=="" (
- set lastLineNum=%%a
- set lastLineString=%%b
- )
- )
- @echo 有意な最終行は %lastLineNum% 行目で、内容は【%lastLineString%】です。
- REM ---------------------------------------------------------
- REM 有意な最終行の内容が "-- hoge" の場合は
- REM その行を削除して hoge を追記した結果ファイルを出力する。
- REM ---------------------------------------------------------
- set targetString=-- hoge
- set AddString=hoge
- set /a lastLineNum2 = %lastLineNum% - 1
- IF "%lastLineString%"=="%targetString%" (
- @echo 有意な最終行の内容が 【%targetString%】 なので、
- @echo その行を削除して、【%AddString%】 を追記した結果ファイルを出力します。
- type nul > %resultFile%
- FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
- IF %%a LEQ %lastLineNum2% (
- IF "%%b"=="" (
- (@echo.) >> %resultFile%
- ) ELSE (
- (@echo %%b) >> %resultFile%
- )
- ) ELSE (
- goto exitLoop2
- )
- )
- :exitLoop2
- REM なんか()の中にラベルを置くとおかしな挙動になるらしいが
- REM ラベル直下にコメントを入れると回避できるらしいのでいれとく。
- REM https://qiita.com/yz2cm/items/8058d503a1b84688af09
- (@echo %AddString%) >> %resultFile%
- goto eof
- )
- REM ---------------------------------------------------------
- REM 有意な最終行の内容が "hoge" でない場合は
- REM 【有意な最終行までの内容+hoge】として結果ファイルを出力する。
- REM ---------------------------------------------------------
- set targetString=hoge
- set AddString=hoge
- IF NOT "%lastLineString%"=="%targetString%" (
- @echo 有意な最終行の内容が 【%targetString%】 ではないので、
- @echo 有意な最終行までの内容に 【%AddString%】 を追記した結果ファイルを出力します。
- type nul > %resultFile%
- FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
- IF %%a LEQ %lastLineNum% (
- IF "%%b"=="" (
- (@echo.) >> %resultFile%
- ) ELSE (
- (@echo %%b) >> %resultFile%
- )
- ) ELSE (
- goto exitLoop1
- )
- )
- :exitLoop1
- REM なんか()の中にラベルを置くとおかしな挙動になるらしいが
- REM ラベル直下にコメントを入れると回避できるらしいのでいれとく。
- REM https://qiita.com/yz2cm/items/8058d503a1b84688af09
- (@echo %AddString%) >> %resultFile%
- goto eof
- )
- @echo 処理条件に引っかからなかったので結果ファイルを空っぽにします。
- type nul > %resultFile%
- :eof
- pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement