web-dev-qa-db-ja.com

Forfilesバッチスクリプト(エスケープ文字@)

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に関する私の知識の多くを基礎にしていることにも注意してください。

17
Paradox

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

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

お役に立てば幸いです。

39
user61470

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

19
lolquotes

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

'forfiles'を使用する場合、パス(/ pの後に記述)を引用符で囲むことができます。ただし、スラッシュで終わってはなりません。

ドライブのルートディレクトリに対して「forfiles」を実行する場合:
forfiles /p "C:" /c "cmd /c echo @file"

別のディレクトリでファイルを処理する場合...
forfiles /p "C:\Program Files" /c "cmd /c echo @file"

つまり、最も安全なアプローチは次のとおりです。

  • 常に引用符を使用します( 'Program Files'のように、スペースを含むフォルダは引き続き機能するため)。
  • 常に最後のスラッシュを省略します

forfiles /p "C:\Path\Without\Trailing\Slash"

3
hbCyber

forfiles.exeを置くと正しく機能します。そうしないと、バッチファイルを使用するときに@variablesが渡されません。 Forfilesは、コマンドプロンプトを使用している場合は機能しますが、バッチファイルで実行すると、forfiles.exeを指定しない限り、変数は正しく機能しません。

以下は、30日以上経過した一部のtxtファイルを削除する例ですforfiles.exe /P c:\directory\ /M *.txt /C "cmd /c del @path" /d -30

0
Ron Veillon

パス(/ P)パラメータを二重引用符で囲み、スペースを含むパスを処理することをお勧めします。

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

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

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

FORFILESを使用する場合、.パラメータの終了 "の前に/Pを追加します。

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

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

可能なすべてのFORFILES置換変数をテストしていません。@path.を追加しても影響を受けないようです

0
andyb

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"

「バッチファイル」をより洗練されたものにしてください。 :)

0
Rhak Kahr

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を小文字に変更してみました。これで解決しました。

幸運を!

0
Vj Prasad
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のバッチファイルです

0
Raju Mella