アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして
4月から部署移動となり社内で利用しているPCを管理するようになりました。
この度セキュリティの観点からネットワーク内に500台程あるPCから業務で使用しているソフトのLogファイルを日付毎に保存し管理する必要性がでてきました。

各PCに保存されているLogファイルが同じファイル名(yyyymmdd.logとなっている)の為、保存の際に自動でリネーム(連番)して保存させる事はできないか?(001_yyyymmdd.log等)と考えております。

各PCからは「for」を使いリストに記載されているPCに対してコピーを実行を考えています。
保存先に同名のファイルがある為コピー時に番号を順番につけて保存したい。
yyyymmdd.log
001_yyyymmdd.log
002_yyyymmdd.log
003_yyyymmdd.log・・・

現在は
for /f "delims=" %%A in (%userprofile%\Desktop\PCLIST.txt) do call
:sub %%A
:sub
for /f %%A in ('dir \\%1\C$\Users /s /b ^| find "yyyymmdd.log"') do copy %%A %userprofile%\Desktop\保存先

このあとにリネームのループコマンドを組み込めたら希望の事ができないか?と試行錯誤しております。
ITもコマンドも初心者ではありますがどうか皆様のお知恵をお貸し下さいよろしくお願いします。

質問者からの補足コメント

  • Logの中に端末情報は記録されている為、ファイルを一箇所に集めて連番がふれれば問題ないです。
    各PCへはPCLIST.txtに記載されたコンピューター名の順番で巡回を考えています。

    PCLIST.txtに
    A_PC
    B_PC
    C_PC
    ~500台程
    を記載し実行

    Batを実行したPCの「保存先フォルダ」に
    A_PCのLogファイルyyyymmdd.logが最初に保存
    次に
    B_PCのLogファイルがコピーされるとA_PCのLogファイルが存在(yyyymmdd.log)する為、001_yyyymmdd.logとして保存
    次に
    C_PCのLogファイルがコピーされるとA_PCとB_PCのLogファイルが存在(yyyymmdd.log、001_yyyymmdd.log)する為、002_yyyymmdd.logとして保存・・・・これを500台程
    このように保存ができたらと考えています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/05/04 14:13
  • PCLIST.txtに記載されている順番にLogを取るので連番が望ましい程度です。
    どこのPCのファイルかリネームでわからなくなってもLogの中にPC情報があるので問題ありません。
    自分の中で連番とした方が理解して貰えると思った次第です。
    同名のファイルを順番に500程コピーしてくるので自動でリネーム保存を行いたいです。

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/05/04 23:47

A 回答 (3件)

アイディアとしてですが、以下のような仕組みではどうでしょうか。



「notepad.exe」を3個コピーするサンプルです。

――――――――――――――――――――――

@echo off

rem ------------------------

rem ■ 設定
set "保存先=%userprofile%\Desktop\保存先"

rem ------------------------

rem ■ 保存先フォルダの作成
if not exist "%保存先%" md "%保存先%"

rem ■ 遅延環境変数を有効にする
SETLOCAL enabledelayedexpansion

rem ■ ループ処理
for %%A in (C:\Windows\notepad.exe C:\Windows\notepad.exe C:\Windows\notepad.exe) do (

rem ■ 「コピー先ファイル」をセット
call :「コピー先ファイル」をセット "%%A" "%保存先%"

rem ■ コピー
copy "%%A" "!コピー先ファイル!"

)

rem ■ 遅延環境変数を無効にする
ENDLOCAL

rem ------------------------

rem ■ 変数「コピー先ファイル」をセットする処理

rem ■ 通常はジャンプ
goto :END_「コピー先ファイル」をセット

:「コピー先ファイル」をセット

rem ■ 「連番無しのファイル名」が存在しなかった場合はそれをセットして終了
if not exist "%~2\%~nx1" set "コピー先ファイル=%~2\%~nx1"
if not exist "%~2\%~nx1" exit /b

rem ■ 「連番」の初期設定
if "%連番%"=="" set "連番=1000"

:連番付け

rem ■ 連番を増やす
set /a "連番=%連番%+1"

rem ■ 連番が上限に達した場合は終了する
if "%連番%"=="2000" (
echo.連番が上限に達しました
pause
exit
)

rem ■ 「連番ありのパス」をセット
set "コピー先ファイル=%~2\%連番:~-3,3%_%~nx1"

rem ■ 上記でセットしたファイルが既に存在すれば、戻って連番を付け直す
if exist "%コピー先ファイル%" goto 連番付け

rem ■ 連番を付けれたらこの処理を終了
exit /b

:END_「コピー先ファイル」をセット

rem ------------------------

rem ■ 終了
echo.完了しました
pause

rem ------------------------

――――――――――――――――――――――

動作確認はしていますが、ざっと確認しただけなので、うまく動かなかったり、スマートではない記述があったらすみません。まずい所があったら直してください。

要点を解説しますと、『call :「コピー先ファイル」をセット』の後に、引数として「コピー元ファイル名(又はフルパス)」、「コピー先フォルダ」の順に記述しますと、重複するファイル名が無いかをチェックし、存在しないパスを「コピー先ファイル」にセットする仕様になっています。

ただ、引数1の「コピー元ファイル名」に、ネットワーク上のファイルパスを指定した場合は、正しく動作しないかも知れません。ファイル名だけを記述した方が無難かも知れません。

又、通常、変数は「%」で囲みますが、今回の場合は仕様上「!」で囲みます。つまり「!コピー先ファイル!」と記述します。

「%~2」は、「2番目の引数」を表します。

「%~nx1」は、「1番目の引数の、名前(n)と、拡張子(x)」を表します。

「%連番:~-3,3%」は、「変数『連番』の、最後から3文字目から、3文字」を表します。

「遅延環境変数」については、うまく説明出来ないです。すみません。「目的」で言うと、本来、変数を使えない場所で変数を使えるようするものです。WEB検索すると詳しい解説ページが見付かるかと思います。
    • good
    • 0
この回答へのお礼

思い通りのbatが作成できました。
「遅延環境変数」も自分なりに調べます。
本当にありがとうございました。

お礼日時:2018/05/08 10:31

連番である必要性が問われているので、そこを答えられた方が良いです。

この回答への補足あり
    • good
    • 0

番号でいいのでしょうか?



どういう手順で各PCを巡回するのか知りませんが

PCの電源が入っている入っていないで
001がこっちのPCになったり、あっちのPCになったりしないのでしょうか?

PC名(ホスト名)_yyyymmdd.logのような形式でないと
ログを収集しても
これどのPC?とはなりませんか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています