forfiles を使用して、設定した期間より古いファイルを削除できるバッチスクリプトを作成しています。今のところ、削除されるファイルを印刷することを目指しています。
私が使用しているforfilesの呼び出しは、cmd.exeシェルから問題なく動作しますが、それをバッチスクリプトに埋め込むとすぐに実行されます。これは、@文字が適切にエスケープされていないためと考えられますが、確実ではありません。
私が実行しているコマンドは次のとおりです。
forfiles /S /P "r:\" /m *.bak /d -10 /c "cmd /c echo @PATH"
そして、次のエラーが発生します。
ERROR: Invalid argument/option - '@PATH'
Type "FORFILES /?" for usage.
私はいたるところにググって、@ PATHコンポーネントをエスケープするためにいくつかの異なるスキームを試しました。 @@ PATHから\ "@ PATH \"までのすべて結果がありません。
何か助けていただければ幸いです!
また、私は here。 のforfilesに関する私の知識の多くを基礎にしていることにも注意してください。
次のように、ディレクトリパスを囲む引用符を削除するまで、同じ問題が発生しました。
forfiles /S /P r:\ /m *.bak /d -10 /c "cmd /c echo @PATH"
お役に立てば幸いです。
\
パスから末尾の/P
を削除してみてください。次に、引用符を使用して、スペースを含むパスをカプセル化できるはずです。
これは古い質問ですが、私は別の答えを持っています...誰かがそれを必要とする場合に備えて。
'forfiles'を使用する場合、パス(/ pの後に記述)を引用符で囲むことができます。ただし、スラッシュで終わってはなりません。
ドライブのルートディレクトリに対して「forfiles」を実行する場合:forfiles /p "C:" /c "cmd /c echo @file"
別のディレクトリでファイルを処理する場合...forfiles /p "C:\Program Files" /c "cmd /c echo @file"
つまり、最も安全なアプローチは次のとおりです。
forfiles /p "C:\Path\Without\Trailing\Slash"
forfiles.exe
を置くと正しく機能します。そうしないと、バッチファイルを使用するときに@variables
が渡されません。 Forfilesは、コマンドプロンプトを使用している場合は機能しますが、バッチファイルで実行すると、forfiles.exe
を指定しない限り、変数は正しく機能しません。
以下は、30日以上経過した一部のtxtファイルを削除する例ですforfiles.exe /P c:\directory\ /M *.txt /C "cmd /c del @path" /d -30
パス(/ P)パラメータを二重引用符で囲み、スペースを含むパスを処理することをお勧めします。
この問題は、置換変数が末尾のバックスラッシュを含む場合に発生します。バックスラッシュは引用符を「エスケープ」するため、FORFILESは残りのコマンドラインを誤って解釈します。
慣例により、ディレクトリへのパスには末尾の円記号は必要ありませんが、これの唯一の例外はルートディレクトリです。ドライブ文字とコロンC:
のみを指定すると、ルートは参照されません。そのドライブの「現在のディレクトリ」が参照されます。ルートを参照するには、末尾のバックスラッシュC:\
を使用する必要があります。
私の解決策は次のとおりです:
FORFILESを使用する場合、.
パラメータの終了 "の前に/P
を追加します。
FORFILES /P "%somePath%." /C "CMD /C ECHO @path"
置換後、これはC:\.
、C:\TEMP.
またはC:\TEMP\.
の形式のパスになります。これらはすべて、FORFILESおよびDIRによって正しく処理されます。
可能なすべてのFORFILES置換変数をテストしていません。@path
は.
を追加しても影響を受けないようです
FORFILESには2つのバージョンがあり、1つは1998バージョン(Emmanuel Boersmaに感謝)ともう1つは2005バージョン(変更された日付時刻で表示)です。
FORFILES v 1.1 - by Emmanuel Boersma - 4/98
Syntax : FORFILES [-pPath] [-mSearch Mask] [-ccommand] [-dDDMMYY] [-s]
-pPath Path where to start searching
-mSearch Mask Search files according to <Search Mask>
-cCommand Command to execute on each file(s)
-d[+|-][DDMMYY|DD] Select files with date >= or <=DDMMYY (UTC)
or files having date >= or <= (current date - DD days)
-s Recurse directories
-v Verbose mode
The following variables can be used in Command :
@FILE, @PATH, @RELPATH, @ISDIR, @FSIZE, @FDATE, @FTIME
Default : <Directory : .> <Search Mask : *.*> <Command : "CMD /C Echo @FILE">
Examples :
FORFILES -pc:\ -s -m*.BAT -c"CMD /C Echo @FILE is a batch file"
FORFILES -pc:\ -s -m*.* -c"CMD /C if @ISDIR==TRUE echo @FILE is a directory"
FORFILES -pc:\ -s -m*.* -d-100 -c"CMD /C Echo @FILE : date >= 100 days"
FORFILES -pc:\ -s -m*.* -d-010193 -c"CMD /C Echo @FILE is quite old!"
各バージョンには独自の構文があります。
FORFILES [/P pathname] [/M searchmask] [/S]
[/C command] [/D [+ | -] {MM/dd/yyyy | dd}]
Description:
Selects a file (or set of files) and executes a
command on that file. This is helpful for batch jobs.
Parameter List:
/P pathname Indicates the path to start searching.
The default folder is the current working
directory (.).
/M searchmask Searches files according to a searchmask.
The default searchmask is '*' .
/S Instructs forfiles to recurse into
subdirectories. Like "DIR /S".
/C command Indicates the command to execute for each file.
Command strings should be wrapped in double
quotes.
The default command is "cmd /c echo @file".
The following variables can be used in the
command string:
@file - returns the name of the file.
@fname - returns the file name without
extension.
@ext - returns only the extension of the
file.
@path - returns the full path of the file.
@relpath - returns the relative path of the
file.
@isdir - returns "TRUE" if a file type is
a directory, and "FALSE" for files.
@fsize - returns the size of the file in
bytes.
@fdate - returns the last modified date of the
file.
@ftime - returns the last modified time of the
file.
To include special characters in the command
line, use the hexadecimal code for the character
in 0xHH format (ex. 0x09 for tab). Internal
CMD.exe commands should be preceded with
"cmd /c".
/D date Selects files with a last modified date greater
than or equal to (+), or less than or equal to
(-), the specified date using the
"MM/dd/yyyy" format; or selects files with a
last modified date greater than or equal to (+)
the current date plus "dd" days, or less than or
equal to (-) the current date minus "dd" days. A
valid "dd" number of days can be any number in
the range of 0 - 32768.
"+" is taken as default sign if not specified.
/? Displays this help message.
Examples:
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 01/01/2001
/C "cmd /c echo @fname is new since Jan 1st 2001"
FORFILES /D +3/19/2012 /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"
「バッチファイル」をより洗練されたものにしてください。 :)
DID NOT WORK
FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @PATH"
DID WORK
FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @path"
小文字の@pathは機能します。
どこでも検索した後、私は自分のテストで答えを見つけました。サーバー2012 R2の最新バージョンを使用して、@ PATHを小文字に変更してみました。これで解決しました。
幸運を!
dir *.* > C:\path\dummy%date:~4,2%%date:~7,2%%date:~10,4%.DAT
dir *.* > C:\path\dummy%date:~4,2%%date:~7,2%%date:~10,4%.csv
forfiles -p C:\path\ -m *.DAT /d -50 /c "cmd /c del /Q @path"
forfiles -p C:\path\ -m *.csv /d -50 /c "cmd /c del /Q @path"
削除する.datファイルと.csvファイルを置き換えます。
-50より古いものを削除してから50日
これはWindowsのバッチファイルです