こんにちは、千本木です。
弊社ではITサポートサービスを展開している中で、企業様向けにネットワークカメラの導入・保守・運用支援を行っております。
ご要望に応じて様々なメーカーのネットワークカメラを取り扱っていますが、日本メーカーで法人向けモデルを幅広く提供しているPanasonicさんの製品を取り扱うことが多いです。
本日はそのPanasonic製ネットワークカメラにまつわるお話です。
便利なネットワークカメラ録画ソフト
Panasonic製ネットワークカメラは、Windows機に録画ソフトをインストールすることでカメラの映像を録画することが可能になります。
この録画ソフトは、録画したデータが一定容量まで達すると、古いデータを自動的に削除してくれる機能があります。
非常に便利な機能で重宝していましたが、何故か正常に動作せず録画容量がひっ迫してしまうことがありました。
容量ひっ迫の原因はカメラの台数?
自動削除を設定しているにも関わらず録画容量がひっ迫してしまうという状況は何故発生したのでしょうか。
明確な原因は定かではないのですが、恐らくカメラの台数が増えたことと関係があるように感じました。
数台のカメラの録画では問題なく、カメラの台数が12~13台を超えたあたりからこの現象が発生しました。
カメラの台数が増えるとともに同時に削除するデータも増えたため、I/Oやプログラム自体に負荷がかかり削除が追い付かない状況になったのではないでしょうか。
録画データの保存先
きちんと古いデータを削除できる状態にしないと録画ができない状態に陥ってしまいますので手動でデータを削除してみます。
録画データはカメラ個別の保存先に「ncr_20190924」のように日付ごとにフォルダが作成され、データが蓄積されています。

試しに古い録画データをフォルダごと削除すると、それになりに時間がかかりますが削除ができました。時間がかかるとはいえ録画ソフトから削除するよりも格段に速いです。
動作的にも問題ないのでこの作業の自動化を検討したいと思います。
今回の場合、録画データは30日分あれば問題ないので、30日を経過したデータを削除するという方針で進めます。
forfilesを使ってフォルダごと削除する
Linuxであればfindとxargsを組み合わせて30日前のデータを削除するということが簡単にできますが、Windowsではどうでしょうか。
色々探しているとforfilesというコマンドがあることが分かりました。これを使ってバッチを作り、タスクスケジューラに登録すれば実現できそうです。
C:\Users\nedia>forfiles /?
FORFILES [/P パス名] [/M 検索マスク] [/S]
         [/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}]
説明:
    ファイル (または、ファイルのセット) を選んで、そのファイル上の
    コマンドを実行します。これはバッチ ジョブの使用に便利です。
パラメーター一覧:
    /P    パス名        検索を開始するパスを示します。
                        既定のフォルダーは現在実行中の
                        ディレクトリ (.) です。
    /M    検索マスク    検索マスクによってファイルを検索します。
                        既定の検索マスクは '*' です。
    /S                  サブディレクトリに対しても処理を行うように forfiles に
                        指示します (例: "DIR /S")。
    /C    コマンド      各ファイルの実行するコマンドを示します。
                        コマンドの文字列は二重引用符で囲んでくだ
                        さい。
                        既定のコマンドは "cmd /c echo @file" です。
                        次の変数をコマンドの文字列に使用することができ
                        ます:
                        @file    - フィルの名前を返します。
                        @fname   - 拡張子なしのファイル名を
                                   返します。
                        @ext     - ファイルの拡張子だけを返し
                                   ます。
                        @path    - ファイルの完全なパスを返します。
                        @relpath - ファイルの相対パスを返し
                                   ます。
                        @isdir   - ファイルの種類がディレクトリの場合
                                   は "TRUE"を、ファイルの場合は
                                   "FALSE" を返します。
                        @fsize   - ファイルのサイズをバイトで返し
                                   ます。
                        @fdate   - ファイルの最終更新日を返し
                                   ます。
                        @ftime   - ファイルの最終更新時刻を返し
                                   ます。
                        コマンド ラインに特殊文字を使用する場合は、
                        文字を 16 進数コードで 0xHH 形式で (例:
                        タブは 0x09) 指定してください。CMD.EXE の
                        内部コマンドの前には "cmd /c" が必要
                        です。
    /D    日付          最終更新日が指定された日かもしくはそれ
                        以降 (+)、または指定された日またはそれ
                        以前 (-) であるファイルを "yyyy/MM/dd" 形式を使っ
                        て選択します。または、最終更新日が現在
                        の日にちより "dd" 日あと、もしくは "dd" 日
                        前であるファイルを選択します。有効な "dd"
                        値は 0 から 32768 の間です。
                        指定がない場合は、"+" が既定で使用さ
                        れます。
    /?                  ヘルプまたは使用法を表示します。
例:
    FORFILES /?
    FORFILES
    FORFILES /P C:\WINDOWS /S /M DNS*.*
    FORFILES /S /M *.txt /C "cmd /c type @file | more"
    FORFILES /P C:\ /S /M *.bat
    FORFILES /D -30 /M *.exe
             /C "cmd /c echo @path 0x09 was changed 30 days ago"
    FORFILES /D 2001/01/01
             /C "cmd /c echo @fname is new since Jan 1st 2001"
    FORFILES /D +2019/9/25 /C "cmd /c echo @fname is new today"
    FORFILES /M *.exe /D +1
    FORFILES /S /M *.doc /C "cmd /c echo @fsize"
    FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
具体的に使ったコマンド
以下のようなコマンドで削除を行ってみたところ、うまく削除ができました。
forfiles /P E:\data\camera01 /D -30 /C "cmd /c IF @isdir==TRUE rmdir /S /Q @file"
※E:\data\camera01内の30日以前のデータに対して、「もしフォルダなら確認せずにフォルダ以下の全てのディレクトリとファイルを削除」というコマンドを実施
forfilesで削除できないケース
ところが、上記のコマンドで削除できないケースが発生しました。
forfilesコマンドは「更新日時」を対象として動作するためです。
Windowsアップデートが原因なのか、録画ソフトの問題なのか分かりませんが、何故か日付ごとのフォルダの更新日時が変わってしまっていました。このため、forfilesの検索対象にならなかったのです。

forfilesが「更新日時」ではなく「作成日時」で判断してくれれば問題ないんですけどね。
削除対象を検索マスクで絞り込む
このままでは不十分なので、対策を考えます。
録画データファイルは「.ncr」という拡張子で分単位で保存されています。

このファイル自体は先述のフォルダのように更新日付が変わることがないようなので、forfilesで検索マスクをつけて「*.ncr」の拡張子を持つファイルを削除させます。
forfiles /P E:\data\camera01 /D -30 /S /M *.ncr /C "cmd /c del @file"
※E:\data\camera01内のサブディレクトリも含めた30日以前の*.ncrという拡張子のファイルに対して、削除コマンドを実施
これでファイル自体は削除できました。
フォルダ削除のコマンドでうまく削除できなかった場合に、このファイル削除のコマンドを実行すれば不要なデータが残ることはなさそうです。
ただし先ほどの更新日時が変わってしまう現象が発生すると、空のフォルダが残る可能性がありますが、気が付いたときに削除すれば問題ないため良しとしました。
まとめ
Linuxでは簡単にできることがWindowsだと少しややこしいですね。
もしPanasonic製ネットワークカメラの録画で容量ひっ迫するようなことがあれば、forfilesをお試しください。
今回試せなかったのですが、もしかしたら録画ソフト自体のアップデートで解決するかもしれません。
また弊社では上記のような問題を早期に発見するためにネットワークカメラの導入支援や保守を実施しています。
企業のネットワークカメラ設置でお困りの際は是非弊社までお声がけください!


					
					
					
					
					
					
					
			



![群馬の法人ITサポートサービス Wide Net[ワイドネット]  群馬の法人ITサポートサービス Wide Net[ワイドネット]](https://www.nedia.ne.jp/wp-content/themes/nedia/images/bnr_bt_widenet03.png)



