代替#1:FOR / Rは私にとって#2よりも直感的です。
代替#2:FOR / Fは、BrianAdkinsの提案の「名前のスペース」の問題を修正します。
代替方法3:パスが二重引用符で囲まれていることを除いて、FORFILESが私の選択です。
ブライアンや他の達人はもっと洗練された解決策を持っているかもしれませんし、他の多くの解決策を提案できるかもしれませんが、これらの3つは機能します。FOR TOKENSを使用しようとしましたが、ヘッダーとフッターを削除する必要があったため、#1に戻りました。また、小さな.batファイルを作成して呼び出すことを検討しましたが、別のファイルが追加されます(ただし、関数のように柔軟性が向上します)。
スペースを埋め込んだディレクトリとファイル名、200文字以上のファイル名、拡張子のないファイル名、小さなドライブのルートで、すべての選択肢をテストしました(ちょうど時間のために、ブライアンが示唆したように少し遅いですが) Windowsエクスプローラーで検索しているため、すべての検索アプリをインストールしました)。
代替#1:FOR / R
(?)ベストブライアンのソリューションは、私のために動作しなかった理由を把握しようと、私はのヘルプを見て/ Rのアプローチをとることに決めたものの。(ファイルの作成は、代替#2と同じです。)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
例-動作(再帰を示すために上記とは異なるディレクトリ)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
代替#2:FOR / F
BrianAdkinsの提案: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
修正答えは次のとおりです。
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
より完全なファイルへの抑制のディレクトリおよび出力(追加)との答えは次のとおりです。
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
注:「delims = *」は、ファイル名に使用できない文字を指定します。
注:2番目のコマンドも、/ a:-dを介してディレクトリを抑制します。
注:誰かが異なる変数名を選択した場合に変数と変数パラメーターの区別を明確にするために、FOR変数名を大文字にしました。
注:OPがファイルへの出力を要求したため、笑顔のためだけにファイルに追加されました。
ECHOのステータスを実際に確認し、同様にリセットする必要があると思います。
問題-名前のスペース
ブライアンの提案するソリューションは、スペースを含むファイル名とフォルダー名を処理しません(少なくとも私のVista構成では)。
例-間違っています
(区切り文字なし。OPごとにディレクトリを非表示にしますが、強調のためにファイル名の前後にサイズがあります)
切り捨てられた名前とサイズ(6つのファイルのうち4つが正しくありません):
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
例-修正
(画面への出力に注意してください、ファイルには追加されません)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
代替#3:FORFILES (引用問題)
このソリューションは、FORFILESドキュメントの最後の2つの例(forfiles /?
)から直接のものです。
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
これらの例を組み合わせてファイルに書き込むと、答えが得られます(ほぼ)。
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
出力ではパスが引用符で囲まれていることに注意してください。切り替えられる
かどうecho on
かecho off
は関係ありません。
各ディレクトリを区切る空白行を追加すると、IFの簡単な拡張になります。
注意:マスク/m *.*
を使用しても、拡張子のないファイルは返されません(例の最後のファイルなど)。
余談:これは、各ディレクトリにファイルを書き込み、そのディレクトリの内容のみを表示します
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
。OPが望んだものではなく、時には便利です。
例-動作します(ただし、引用符で囲まれたフルパスを使用)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
この例には、超長いファイル名と拡張子のないファイル名を持つ追加のディレクトリが含まれています。
問題:引用符で囲まれたパス
だから、OPの例ごとに不要な(?)引用符を削除し、代替#3:FORFILESを保存する簡単な方法はありますか?(修辞的な質問:引用は機能ですか、それとも欠陥ですか?)
"tokens=*"
次のように追加しました@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za