ローカルNW不問のボーダーレスなコマンド実行
最近、バッチファイルを作る機会がありました。
採用したのは、ローカルとネットワークフォルダを考慮しないで済む方法です。
ユーザーフォーラムでも近い質問がコンスタントに投稿されてて、解決策もいくつか挙がってます。
バリエーションの1つとして、お裾分けです。
こちらへのオマージュです。未読のかたはお先にどうぞ。
https://winactor.com/questions/?q=社内ネットワーク上のファイルをコマンド実行で削除したい
サマリー
- これで、ローカルと同じコマンドが使える
pushd \\ファイルサーバー\フォルダ
目的のコマンド
popd
4つのバッチファイルのメインコマンド
- move %DATE-1d%*.csv 一時フォルダ
- for /F "tokens=1* delims=" %%a in ('dir /b /O:D *.csv') do set fname=%%a copy "%fname%" ..\保存期間内
- del *.csv
- 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
popdpushd %WORKFOLDER%
CALL 02_処理B.bat
popdpushd %WORKFOLDER%
CALL 03_処理C.bat
popdpushd %WORKFOLDER%
CALL 04_処理D.bat
popd
各処理の動き
- 昨日のファイルを一時フォルダに移動
- 一時フォルダの最新ファイルを保存期間中フォルダに移動
- 一時フォルダのファイルを削除
- 保存期間中フォルダのn日経過済みファイルを削除
所感
- .batを分割することで、各.bat内でpushdのカレントフォルダを使い分けられた
- 常にローカルのカレントフォルダで処理している感覚
- 変数を積極的に活用した結果、すっきり表記になり、可読性が上がった
- 一時フォルダを経ないでも、同じゴールに辿り着けたかもしれない