5

cmd ファイルで FORFILES を使用して、特定の日付から「今日」までのすべてのファイルを処理したいと考えています。2013 年 7 月 10 日以降のすべてに作用するようなものを使用できますforfiles /d +07/10/2013 /c "cmd /c echo @fname"が、代わりに「今日」の 90 日前から計算できるようにしたいのです。

FORFILESにフィードするために「今日のx日前」を指定できるcmdファイルで機能する日付計算の構文はありますか?

私は VBS を使用しないことを好みます (そして、VBS で動作するコード スニペットを見つけました)。代わりに、Powershell 用にスクリプトを書き直すこともできますが、理想的には cmd を使用したいと考えています。

明確にするために、「-90」は 90 日より古いすべてのファイルを検索します。「+90」は、今日から 90 日より新しいすべてのファイルを検索し (ファイルは将来の日付で書き込まれることはめったにないため、これは基本的に役に立ちません)、「+7/30/2013」は 7/30 より新しいすべてのファイルを検索します。 /2013. CMDファイルに渡された日数変数を取得できることが望ましい最後の期間が必要です。これは、「今日のx日前」、つまり「過去x日間」と言うでしょう。したがって、上記のようにハードコードされた日付を使用する代わりに、cmd ファイル内でその日付を計算できるようにしたいと考えています。

4

2 に答える 2

8

これは、2 つの入れ子になったループに基づいており、提供forfilesされた検索条件に一致する項目がない場合に:/D +ddforfilesforfilesErrorLevel

rem Define minimum and maximum age in days here (0 means today):
set /A MINAGE=0, MAXAGE=90

set "MAXAGE=%MAXAGE:*-=%" & set "MINAGE=%MINAGE:*-=%" & set /A MAXINC=MAXAGE+1
> nul forfiles /D -%MINAGE% /C "cmd /C if @isdir==FALSE 2> nul forfiles /M @file /D -%MAXINC% || > con echo @fdate  @file"

外側のforfilesループは、少なくとも variable で指定されたものと同じくらい古いアイテムを反復処理しますMINAGE。内側のforfilesループは、反復されたファイル@fileを外側のループから受け取ると最大 1 回反復し、少なくともMAXINC(equals MAXAGEplus 1);と同じくらい古い場合は同じファイルを返します。そうでない場合は、 を にforfiles設定しますErrorLevel。これは、次のコマンドを実行するオペレータ1によって取得されます。||つまり、がゼロ以外の値に設定されているecho場合のみです。ErrorLevel

との両方MINAGEMAXAGE負の数にすることはできません (コマンドset "MAXAGE=%MAXAGE:*-=%"set "MINAGE=%MINAGE:*-=%"の場合はマイナス記号を削除してください)。中間変数MAXINCは、それ自体で指定された年齢MAXAGEを返される結果に含めるために導入されました。

リダイレクト> nulにより、外側のforfiles行が空の行を返し、内側の行が検索基準を満たすアイテムを返さなくなります (そうでないものに関心があるため)。検索基準に違反した場合に2> nul、内側のループがエラー メッセージを返さないようにします。コマンドが実際に必要なアイテムを返すようにオーバーライドします。forfiles> con> nulecho

ファイルのみが処理されるように、このif @isdir==FALSE部分はディレクトリを除外します。ディレクトリのみを処理する場合は に変更FALSETRUEます。両方を処理する場合は、完全に削除してください。

于 2016-04-12T22:54:02.283 に答える
2

PowerShell では、次のようなことができます。

$refdate = (Get-Date).AddDays(-90)
Get-ChildItem | Where-Object {
    $_.LastWriteTime -ge $refdate
} | Select-Object -Expand Name
于 2013-10-10T15:18:27.643 に答える