Alternatief #1: FOR /R is voor mij intuïtiever dan #2.
Alternatief #2: FOR /F lost het probleem met “spaties in namen” in BrianAdkins’ suggestie op.
Alternatief #3: FORFILES zou mijn keuze zijn, behalve dat het pad tussen dubbele aanhalingstekens staat.
Brian of andere goeroes hebben misschien een elegantere oplossing of kunnen nog een dozijn andere oplossingen voorstellen, maar deze drie werken. Ik heb geprobeerd om FOR TOKENS te gebruiken maar dan moest ik kop- en voetteksten strippen dus ben ik teruggegaan naar #1. Ik heb ook overwogen om een klein .bat bestand te maken en dat aan te roepen, maar dat voegt weer een nieuw bestand toe (hoewel het wel meer flexibiliteit biedt, net als een functie).
Ik heb alle alternatieven getest met map- en bestandsnamen met spaties, een bestandsnaam van meer dan 200 tekens, een bestandsnaam zonder extensie, en op de root van een kleine schijf (gewoon voor de tijd; een beetje traag – net zoals Brian suggereerde – maar dat is zoeken in Windows Verkenner ook; daarom heb ik Alles zoeken app geïnstalleerd).
Alternatief #1: FOR /R
Beste(?) Terwijl ik probeerde uit te vinden waarom Brian’s oplossing niet werkte voor mij, keek ik naar HELP FOR en besloot de /R aanpak te proberen. (Het maken van een bestand zou hetzelfde zijn als in Alternatief #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Example - Works (andere directory dan hierboven om recursie aan te tonen)
@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
Alternatief #2: FOR /F
BrianAdkins’ suggereerde:
Een gecorrigeerd antwoord is:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Een vollediger antwoord met directories onderdrukt en uitvoer (bijgevoegd) naar een bestand is:
@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
Opmerking: “delims=*” specificeert een karakter dat niet is toegestaan in bestandsnamen.
Opmerking: het 2e commando onderdrukt ook directories via /a:-d.
Opmerking: Maakte de FOR-variabelenaam hoofdletter om het onderscheid tussen variabele en variabele parameters te verduidelijken als iemand andere variabelenamen kiest.
Opmerking: Voor de grap toegevoegd aan bestand, omdat de OP vroeg om uitvoer naar een bestand.
Ik veronderstel dat ik echt de status van ECHO moet controleren en ook resetten.
Issue - Spaces in Names
Brian’s voorgestelde oplossing kan niet overweg met bestands- en mapnamen die spaties bevatten (althans niet op mijn Vista configuratie).
Exemplaar - Fout(Zonder delims; Inclusief het onderdrukken van de directory per OP maar met de grootte zowel voor als na de bestandsnaam voor de nadruk)
Afgeknotte naam en grootte (4 van 6 bestanden fout):
@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
Voorbeeld - Correct(Opmerking uitvoer naar scherm, niet toegevoegd aan bestand)
@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
Alternatief #3: FORFILES (Quote Issue)
Deze oplossing komt rechtstreeks uit de laatste twee voorbeelden in de FORFILES documentatie (@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Combineren van deze voorbeelden en schrijven naar een bestand levert (bijna) het antwoord op:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Merk op dat het pad tussen aanhalingstekens staat in de uitvoer.
Maakt niet uit of forfiles /?
of echo on
is omgedraaid.
Het toevoegen van een lege regel tussen elke directory zou een triviale uitbreiding van de IF zijn.
Caution : Het gebruik van het masker echo off
zal geen bestanden zonder extensie teruggeven (zoals het laatste bestand in het voorbeeld)!
Aside : Dit schrijft een bestand in elke directory met inhoud van alleen die directory:
/m *.*
Niet wat de OP wilde, maar soms handig.
Exemplaar - Werkt (maar met fullpath tussen aanhalingstekens)
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
Dit voorbeeld bevat een extra directory met een superlange bestandsnaam en een bestandsnaam zonder extensie.
Issue: Path in Quotes
Dus, is er een makkelijke manier om de ongewenste(?) aanhalingstekens te verwijderen volgens het OP voorbeeld en op te slaan Alternatief #3: FORFILES. (Retorische vraag: Zijn de aanhalingstekens een kenmerk of een fout?)