Advertisement
Guest User

有意な最終行の内容にあわせて結果ファイルを出力するバッチ

a guest
Mar 17th, 2018
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.08 KB | None | 0 0
  1. @echo off
  2. cd /d %~dp0
  3. setlocal ENABLEDELAYEDEXPANSION
  4.  
  5. REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  6. REM 【.cmd】 バッチファイルスクリプト %12 【.bat】
  7. REM http://mevius.5ch.net/test/read.cgi/tech/1489207631/404
  8. REM
  9. REM 404デフォルトの名無しさん2018/03/16(金) 22:05:15.90ID:HEHaQcsS
  10. REM  バッチファイルで空行を除く最終行にhogeって文字がなかったら追加して改行
  11. REM  -- hogeとかになってたら削除してhoge追記して改行
  12. REM  って事をやりたいんですけどどうやったらできるかおせーてください
  13. REM
  14. REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  15.  
  16. REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  17. REM 引数: 処理したいテキストファイル
  18. REM
  19. REM ToDO
  20. REM ・行の内容や指定文字列に & % ^ " ' ( ) といった特殊文字が入ってると
  21. REM  容赦なくコケたりするという地獄仕様をどげんかせんといかん。
  22. REM ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  23.  
  24. IF "%~1"=="" (
  25. @echo ファイルが指定されていません
  26. goto eof
  27. )
  28.  
  29. IF NOT "%~x1"==".txt" (
  30. @echo 指定できるのは.txtファイルだけです
  31. goto eof
  32. )
  33.  
  34. REM 行番号を付与した一時ファイルを保存するディレクトリ
  35. set tempdir=.\temp
  36. IF NOT EXIST %tempdir% (
  37. mkdir %tempdir%
  38. )
  39.  
  40. REM 出力する結果ファイル
  41. set resultFile=".\処理結果.txt"
  42.  
  43. REM ファイルの中に絶対に含まれていない文字列
  44. set nonExtString=ZettainiHukumaretenaiMojiretsuDesse
  45.  
  46. REM ---------------------------------------------------------
  47. REM まずは行番号を付与した一時ファイルを生成しておく
  48. REM ---------------------------------------------------------
  49. set nlog=%tempdir%\%~n1_N.txt
  50. findstr /V /N /C:"%nonExtString%" "%~1" > "%nlog%"
  51.  
  52. REM ---------------------------------------------------------
  53. REM ターゲットファイルの行数を得る
  54. REM (まあこれは特にやらなくてもいい)
  55. REM ---------------------------------------------------------
  56. set targetFileLineNum=0
  57. FOR /F "delims=[]: " %%a IN ('findstr /B /R /C:"[0-9]*:" "%nlog%"') DO (
  58. set targetFileLineNum=%%a
  59. )
  60. @echo ファイルの行数は %targetFileLineNum% 行です。
  61.  
  62. REM ---------------------------------------------------------
  63. REM ターゲット文字列が含まれている最後の行の番号とその行の内容を得る
  64. REM (まあこれは特にやらなくてもいい)
  65. REM ---------------------------------------------------------
  66. set targetString=hoge
  67. set targetStrLineNum=0
  68. set targetLineString=Torenakattayo
  69. FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /C:"%targetString%" "%nlog%"') DO (
  70. set targetStrLineNum=%%a
  71. set targetLineString=%%b
  72. )
  73. @echo 【%targetString%】 が最後に含まれているのは %targetStrLineNum% 行目で、内容は【%targetLineString%】です。
  74.  
  75. REM ---------------------------------------------------------
  76. REM 空行を除く有意な最終行の行番号と内容を得る
  77. REM ---------------------------------------------------------
  78. set lastLineNum=0
  79. set lastLineString=Torenakattayo
  80. FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
  81. IF NOT "%%b"=="" (
  82. set lastLineNum=%%a
  83. set lastLineString=%%b
  84. )
  85. )
  86. @echo 有意な最終行は %lastLineNum% 行目で、内容は【%lastLineString%】です。
  87.  
  88. REM ---------------------------------------------------------
  89. REM 有意な最終行の内容が "-- hoge" の場合は
  90. REM その行を削除して hoge を追記した結果ファイルを出力する。
  91. REM ---------------------------------------------------------
  92. set targetString=-- hoge
  93. set AddString=hoge
  94. set /a lastLineNum2 = %lastLineNum% - 1
  95. IF "%lastLineString%"=="%targetString%" (
  96.  
  97. @echo 有意な最終行の内容が 【%targetString%】 なので、
  98. @echo その行を削除して、【%AddString%】 を追記した結果ファイルを出力します。
  99.  
  100. type nul > %resultFile%
  101.  
  102. FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
  103. IF %%a LEQ %lastLineNum2% (
  104. IF "%%b"=="" (
  105. (@echo.) >> %resultFile%
  106. ) ELSE (
  107. (@echo %%b) >> %resultFile%
  108. )
  109. ) ELSE (
  110. goto exitLoop2
  111. )
  112. )
  113.  
  114. :exitLoop2
  115. REM なんか()の中にラベルを置くとおかしな挙動になるらしいが
  116. REM ラベル直下にコメントを入れると回避できるらしいのでいれとく。
  117. REM https://qiita.com/yz2cm/items/8058d503a1b84688af09
  118.  
  119. (@echo %AddString%) >> %resultFile%
  120. goto eof
  121. )
  122.  
  123. REM ---------------------------------------------------------
  124. REM 有意な最終行の内容が "hoge" でない場合は
  125. REM 【有意な最終行までの内容+hoge】として結果ファイルを出力する。
  126. REM ---------------------------------------------------------
  127. set targetString=hoge
  128. set AddString=hoge
  129. IF NOT "%lastLineString%"=="%targetString%" (
  130.  
  131. @echo 有意な最終行の内容が 【%targetString%】 ではないので、
  132. @echo 有意な最終行までの内容に 【%AddString%】 を追記した結果ファイルを出力します。
  133.  
  134. type nul > %resultFile%
  135.  
  136. FOR /F "tokens=1* delims=[]:" %%a IN ('findstr /V /C:"%nonExtString%" "%nlog%"') DO (
  137. IF %%a LEQ %lastLineNum% (
  138. IF "%%b"=="" (
  139. (@echo.) >> %resultFile%
  140. ) ELSE (
  141. (@echo %%b) >> %resultFile%
  142. )
  143. ) ELSE (
  144. goto exitLoop1
  145. )
  146. )
  147.  
  148. :exitLoop1
  149. REM なんか()の中にラベルを置くとおかしな挙動になるらしいが
  150. REM ラベル直下にコメントを入れると回避できるらしいのでいれとく。
  151. REM https://qiita.com/yz2cm/items/8058d503a1b84688af09
  152.  
  153. (@echo %AddString%) >> %resultFile%
  154. goto eof
  155. )
  156.  
  157. @echo 処理条件に引っかからなかったので結果ファイルを空っぽにします。
  158. type nul > %resultFile%
  159.  
  160. :eof
  161. pause
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement