質問: とあるストレージ内のファイル一覧をファイル名[yyyymmdd.log]ログとして毎日取得し、 本日と昨日のログを比べて、昨日ログにあって本日ログにない差分を抽出するプログラムを作りたいです! ここで追加しようとして技術的に困っているのが 昨日のログがなかったら、さらにその一日前のログをさかのぼって比べるを繰り返すプログラムです。 昨日と言うよりも、dirコマンドで新しい順に並べてその2番目とくらべてなかったら3番目とくらべる というようなプログラムでも良いと思います。 batファイル実行元としてパワーシェルかvbsを使ったとしても再現できるやり方ありましたらご教授いただけますとさいわいです。 --- **追記** 本日作られたログを除いた最新のログと比べたいです。 最新(本日)のログと昨日のログ(本日のログを除いた最新のログ)を比べたいのですが、条件として * 稼働初日で本日のログしかなかったらその場で、通常終了。 * 事情があってサーバが停止などの理由で昨日のログがない場合、さらに前日のログを探しに行く。 のような条件をつけたいです。 現在のコードは ``` set YYYYMMDD=%DATE:/=% ``` で当日日時取得 ``` for /F "tokens=1* delims=" %%a in ('dir /b /O:D C:\Users\user\Desktop\batdevelopment\logs*.log') do set zenjitu=%%a ``` でファイル内の最新ログ取得 ``` dir .txt /b > C:\Users\user\Desktop\batdevelopment\logs\%YYYYMMDD%.log ``` で本日ログ掃き出し ``` powershell -c "compare (cat ./%zenjitu%.txt) (cat ./%YYYYMMDD%.log) | ? {$_.SideIndicator -eq '<='} | ft -Property InputObject -hide" ``` で差分出力。 この時、下記のコードにオプションを追加して、フォルダ内の最新のファイル名を除外した、その次の最新ファイルを取得したいです。 ``` for /F "tokens=1 delims=" %%a in ('dir /b /O:D C:\Users\user\Desktop\batdevelopment\logs*.log') do set zenjitu=%%a ```
回答: > > 技術的に困っているのが 昨日のログがなかったら、さらにその一日前のログをさかのぼって比べるを繰り返すプログラムです。 > > > 苦労して シェルで作るより C# で作るとサクッと作れたので検討ください。 `dotnet Core 3.0` をインストールして gitdirname.bat ``` @echo off pushd rem getname.bat ログディレクトリ名 cd /d %~dp0 dotnet run %1 popd ``` `dotnet new console` して Program.cs の内容 ``` using System; namespace getLog { class Program { static void Main(string[] args) { String todayDir = DateTime.Today.ToString("yyyyMMdd"); if (args.Length == 0) { Console.WriteLine(todayDir); return; } string dir = args[0]; // 前日のログファイル見つかるまで ログを探す(最大1年とする) for(DateTime tm = DateTime.Today.AddDays(-1); tm > DateTime.Today.AddYears(-1); tm = tm.AddDays(-1)) { String todayLogFileName = tm.ToString("yyyyMMdd") + ".log"; if (System.IO.File.Exists(System.IO.Path.Combine(dir , todayLogFileName))) { Console.WriteLine(todayLogFileName); return; } } // 見つからなければ 今日のファイル名を利用する Console.WriteLine(todayDir); return; } } } ``` 最後に 実行結果を環境変数に入れる部分 ``` for /F "tokens=1 delims=" %a in ('cmd /c アプリのディレクトリ名\gitname.bat') do set PREV_YYYYMMDD=%a ```