1

最近、バッチファイルを作る機会がありました。
採用したのは、ローカルとネットワークフォルダを考慮しないで済む方法です。
ユーザーフォーラムでも近い質問がコンスタントに投稿されてて、解決策もいくつか挙がってます。
バリエーションの1つとして、お裾分けです。

こちらへのオマージュです。未読のかたはお先にどうぞ。

https://winactor.com/questions/?q=社内ネットワーク上のファイルをコマンド実行で削除したい

 

サマリー

  • これで、ローカルと同じコマンドが使える

pushd \\ファイルサーバー\フォルダ
目的のコマンド
popd

 

4つのバッチファイルのメインコマンド

  1. move %DATE-1d%*.csv 一時フォルダ
  2. for /F "tokens=1* delims=" %%a in ('dir /b /O:D *.csv') do set fname=%%a copy "%fname%" ..\保存期間内
  3. del *.csv
  4. forfiles /P %cd% /D -15 /M "*.csv" /c "cmd /C if @isdir==false del /Q @file"
  • ※ 各処理の動きは下に掲載

 

昨日のYYYYMMDDを取得

for /F %%i in ('powershell (Get-Date^).Adddays(-1^).ToString('yyyyMMdd'^)') do (set DATE-1d=%%i)

 

昨日の後ろのスペースを削除

CALL :Trim %DATE-1d%

:Trim
SET DATE-1d=%*

 

WinActorのパーツ構成

コマンドプロンプトを開く
コマンドを実行する(PowerShell,コマンドプロンプト)

コマンド:値⇒pushd \\ファイルサーバー\フォルダ & dir > abcde.csv & popd

フルパスにさえすれば、コマンドプロンプトの書式のまま使えることを特定したスレッド
https://winactor.com/questions/question/コマンド実行結果の共有運動を広めたい(隊)/answer/25065/

  • pushd / popd のコンビが正常に使えることの確認まで
  • 複数行のコマンドを&で繋いで1行化した
  • 実務では、コマンドに00_デイリーバッチ.batのフルパスを指定した

 

00_デイリーバッチ.batの中身

@echo off

SET WORKFOLDER=\\ファイルサーバー\フォルダ

pushd %WORKFOLDER%
CALL 01_処理A.bat
popd

pushd %WORKFOLDER%
CALL 02_処理B.bat
popd

pushd %WORKFOLDER%
CALL 03_処理C.bat
popd

pushd %WORKFOLDER%
CALL 04_処理D.bat
popd

 

各処理の動き

  1. 昨日のファイルを一時フォルダに移動
  2. 一時フォルダの最新ファイルを保存期間中フォルダに移動
  3. 一時フォルダのファイルを削除
  4. 保存期間中フォルダのn日経過済みファイルを削除

 

所感

  • .batを分割することで、各.bat内でpushdのカレントフォルダを使い分けられた
  • 常にローカルのカレントフォルダで処理している感覚
  • 変数を積極的に活用した結果、すっきり表記になり、可読性が上がった
  • 一時フォルダを経ないでも、同じゴールに辿り着けたかもしれない
anothersolution 質問の投稿
回答とコメントは、会員登録(無料)で閲覧できるようになります。