21

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 \"まですべて、結果はありません。

どんな助けでもいただければ幸いです!

また、ここからforfilesに関する多くの知識に基づいていることにも注意してください。

4

8 に答える 8

47

次のように、ディレクトリパスの前後の引用符を削除するまで、同じ問題が発生しました。

forfiles /S /P r:\ /m *.bak /d -10 /c "cmd /c echo @PATH"

お役に立てば幸いです。

于 2009-06-24T15:59:00.307 に答える
26

パス\から末尾をトリミングしてみてください。/P次に、引用符を使用して、スペースを含むパスをカプセル化できるはずです。

于 2011-12-06T13:10:33.900 に答える
4

これは古い質問ですが、別の答えがあります...誰かがそれを必要とする場合に備えて。

'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"

于 2012-11-30T10:06:16.900 に答える
2

ベストプラクティスは、パス(/ P)パラメーターの前後に二重引用符を使用して、スペースを含むパスを処理することです。

この問題は、置換変数に末尾の円記号が含まれている場合に発生します。バックスラッシュは引用符を「エスケープ」し、FORFILESがコマンドラインの残りの部分を誤って解釈する原因になります。

慣例により、ディレクトリへのパスには末尾の円記号は必要ありません。これに対する1つの例外は、ルートディレクトリです。ドライブ文字とコロンのみを指定するC:と、ルートは参照されません。むしろ、そのドライブの「現在のディレクトリ」が参照されます。ルートを参照するには、末尾の円記号を使用する必要がありますC:\

私の解決策は次のとおりです。

FORFILESを使用する場合は、パラメータ.の「閉じる前に」を追加します。/P

FORFILES /P "%somePath%." /C "CMD /C ECHO @path"

C:\.置換後、これは、C:\TEMP.またはの形式のパスにつながりますC:\TEMP\.。これらはすべて、FORFILESおよびDIRによって正しく処理されます。

可能なすべてのFORFILES置換変数をテストしていませ@pathんが、.

于 2015-02-19T00:50:16.027 に答える
0

正しく機能させるために配置します。そうしないと、バッチファイルを使用するときにforfiles.exe通過しません。@variablesForfilesは、コマンドプロンプトが表示されている場合は機能しますが、バッチファイルで実行すると、次のように入力しない限り、変数は正しく機能しません forfiles.exe

これは、30日より古いいくつかのtxtファイルを削除する例です。 forfiles.exe /P c:\directory\ /M *.txt /C "cmd /c del @path" /d -30

于 2011-08-16T18:59:47.140 に答える
0

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"

「バッチファイル」をより洗練されたものにするために楽しい時間を過ごしてください。:)

于 2012-03-19T10:18:15.840 に答える
0
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"
  1. 削除する.datファイルと.csvファイルを置き換えます。

  2. -50日より古いものを削除する-50

  3. これはWindowsのバッチファイルです

于 2013-02-22T10:19:51.883 に答える
0

動作しませんでした

FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @PATH"

仕事をしました

FORFILES /P %deletepath% /M *.%extension% /D -%days% /C "cmd /c del @path"

小文字の@pathは機能します。

どこでも検索した後、私は自分のテストで答えに出くわしました。サーバー2012R2で最新バージョンを使用して、@PATHを小文字に変更してみました。これで修正されました。

幸運を!

于 2014-09-26T05:46:03.100 に答える