-1

わかりました、私はスクリプトを作成するのが初めてで、.ecl の拡張子を持つファイルが 5 分以上フォルダーにあるときに電子メールを送信するバッチ スクリプト ファイルを編集しようとしています。しかし、フラグが付けられ、.ecl ファイルの代わりに電子メールを送信する .ecl.part 拡張子を持つ他のファイルがあります。フォルダーに .ecl ファイルが 5 分以上存在する場合にメールを送信し、.ecl.part ファイルを無視するように追加できるものがあるかどうか知りたいです。[!(.extension to exclude)].extension を使用した Linux を使用している人のために 1 つを読みました。それが機能する場合は、そのように追加しますか、それともこのように追加しますか .extension not to exclude[!(.extension to exclude)]

問題のスクリプトの部分は次のとおりです。

     for /f "tokens=1-5 delims=:, " %%a in ('forfiles /p z: /d +0 /s /m *.ecl /c "cmd /c if @isdir==FALSE echo @file,@ftime"') do (
     set  fnam=%%a
     set   fhr=%%b
     set  fmin=%%c
     set  fsec=%%d
     set fampm=%%e

     if "!fampm!" == "PM" if "!fhr!" neq "12" (set /a "fhr=!fhr!+12")

もっとスクリプトがありますが、私はこれを設定しませんでした。設定した人はあまり役に立たなかったので、ここに来ました。

4

2 に答える 2

0

私のテストではそうではないことがわかりましたがforfiles、コンピューターで 8.3 の短いファイル名に対してワイルドカードを評価しているようです。.doc ファイルと .docx ファイルの両方を含むディレクトリにいて、 を実行するdir *.docと、.docx ファイルも一覧表示されます。同じ種類のこと。

したがって、 *.ecl は .ecl.part ファイルと一致します。これは、8.3 表記では .ecl 拡張子があるためです。ステートメント内にループ%fnam:~-4%==.eclの根幹のほとんどを囲んで、確認することもできます。または、またはを使用して、ループによってキャプチャされたの出力をフィルタリングできます。このようなもの:foriffindfindstrforfilesfor

for /f "tokens=1-5 delims=:, " %%a in (
    'forfiles /p z: /d +0 /s /m *.ecl /c "cmd /c if @isdir==FALSE echo @file,@ftime" ^| find /v /i ".part"'
) do (
    set  fnam=%%a
    set   fhr=%%b
    set  fmin=%%c
    set  fsec=%%d
    set fampm=%%e

    if "!fampm!" == "PM" if "!fhr!" neq "12" (set /a "fhr=!fhr!+12")
    rem etc.

検索に一致しないfind /v行を出力するため、.ecl.part ファイルを効果的に除外する必要があります。 Linuxのように動作します。find /vgrep -v


私のテストケースは、あなたが説明している症状と一致していないようif @isdir==FALSEですif @ext==\"ecl\". しかし、私の好奇心を満足させるために実験する気がないのなら、私は完全に理解しています.

于 2013-03-19T12:14:43.027 に答える
0
@ECHO OFF
SETLOCAL
SET savearea=c:\destdir
SET emldir=c:\sourcedir
ECHO.>"%savearea%\emlfiles.new"
DIR /b /a-d /on "%emldir%\*.eml" >>"%savearea%\emlfiles.new"
IF NOT EXIST "%savearea%\emlfiles.old" GOTO noold
FOR /f "usebackqdelims=" %%i IN ("%savearea%\emlfiles.new") DO (
FINDSTR /b /e "%%i" "%savearea%\emlfiles.old" >NUL
IF NOT ERRORLEVEL 1 (ECHO %%i is MORE than 5 minutes old)
)
:noold
MOVE /y "%savearea%\emlfiles.new" "%savearea%\emlfiles.old" >nul
GOTO :eof

このスクリプトは、%savearea% に、%emldir% 内の *.eml ファイルのソートされた基本的なファイル リストを保存し、新しいリストを以前のバージョンと比較します。両方に同じファイル名がある場合、メッセージが生成されます%%i is MORE than 5 minutes old

つまりemldir、.eml ファイルが存在する場所のsavearea安全なディレクトリをポイントし、メッセージ ECHOing を好みのメール送信コマンドに置き換えて、タスク スケジューラを使用して 5 分ごとに実行するようにスケジュールするだけです。

于 2013-03-19T00:11:02.737 に答える