代替案#1: FOR /Rの方が私にとっては#2よりも直感的です。
代替案#2: FOR /FはBrianAdkins氏の提案にある「名前にスペースが入る」という問題を修正した。
代替案#3: FORFILESはパスが二重引用符で囲まれていることを除けば、私の選択です。
Brianや他の達人はもっとエレガントな解決策を持っているかもしれませんし、他にもたくさんの解決策を提案してくれるかもしれませんが、この3つはうまくいきます。FOR TOKENSを使ってみましたが、ヘッダーとフッターを削除しなければならなかったので、#1に戻しました。また、小さな .bat ファイルを作成してそれを呼び出すことも考えましたが、それは別のファイルを追加することになります (関数と同様に、より柔軟性を提供しますが)。
ディレクトリとスペースを埋め込んだファイル名、200文字以上のファイル名、拡張子のないファイル名、小さなドライブのルート上ですべての代替案をテストしました(時間の都合上、Brianが提案したように少し時間がかかりますが、Windowsエクスプローラで検索するのもそうです。
代替案1: FOR /R
ベスト(?) Brianの解決策がうまくいかない理由を探っているうちに、HELP FORを見て、/Rの方法を試してみることにしました。(ファイルの作成は、選択肢2と同じです。 )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Example - Works (再帰を示すために上記とは異なるディレクトリ)
@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 Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternative #2: FOR /F
BrianAdkinsの提案。@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
A 修正された答えは次の通りです:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
A ディレクトリを抑制してファイルに出力(追記)した、より完全な答えは次の通りです。
@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=*” は、ファイル名に許可されていない文字を指定しています。
Note: 2番目のコマンドは、/a:-d経由のディレクトリも抑制する。
Note: 誰かが異なる変数名を選択した場合に、変数と変数パラメータの区別を明確にするため、FOR変数名を大文字にした。
Note: OPがファイルへの出力を求めていたので、ただのお笑いのためにファイルに追加しました。
本当にECHOの状態を確認してリセットした方がいいのかな。
Issue - Spaces in Names
ブライアンの提案するソリューションは、スペースを含むファイル名やフォルダ名を処理しません(少なくとも私のVistaの設定では)。
Example - Wrong(デリムなし。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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Example - Correct(Note output to screen, not appended to file)
@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 Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternative #3: FORFILES (Quote Issue)
この解決策は、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の些細な拡張である。
Caution . マスク /m *.*
を使用しても、拡張子のないファイル(例の最後のファイルのようなもの)は返されません!
Aside .
Aside : 各ディレクトリのファイルを、そのディレクトリだけの内容で書き出します。
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
OPが望んでいたものではありませんが、便利な場合もあります。
Example - Works (ただしフルパスを引用符で囲む)
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 Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.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
この例では、非常に長いファイル名と拡張子のないファイル名を持つ追加のディレクトリが含まれています。
**_Issue.
そこで、OPの例のように不要な(?)引用符を削除して、代替案#3: FORFILESを保存する簡単な方法はありますか? (修辞的な質問: 引用符は機能なのか、それとも欠陥なのか?)