1

Based on some other answers I found, I can loop through available drive labels. However, I can't seem to change to that drive:

for /f "skip=1 delims=" %%x in ('wmic logicaldisk get caption') do (
%%x
dir
)

Which gives me:

PS C:\> .\something.bat

C:\>for /F "skip=1 delims=" %x in ('wmic logicaldisk get caption') do (
%x
 dir
)

C:\>(
 :
 dir
)
The filename, directory name, or volume label syntax is incorrect.
 Volume in drive C has no label.
 Volume Serial Number is 9CE0-91A0

 Directory of C:\

07/14/2018  09:54 AM             1,586 compact-all.bat
06/25/2018  01:03 PM    <JUNCTION>     Documents and Settings [C:\Users]
07/14/2018  08:03 AM    <DIR>          Fraps
06/25/2018  01:07 PM    <DIR>          Intel
06/25/2018  02:18 PM    <DIR>          NVIDIA
04/11/2018  05:38 PM    <DIR>          PerfLogs
07/13/2018  08:32 AM    <DIR>          Program Files
07/13/2018  04:56 PM    <DIR>          Program Files (x86)
06/25/2018  02:12 PM    <DIR>          Python27
07/14/2018  12:26 PM             7,404 result.txt
07/14/2018  12:26 PM                83 something.bat
06/25/2018  01:08 PM    <DIR>          Users
06/30/2018  02:19 PM    <DIR>          Windows
               3 File(s)          9,073 bytes
              10 Dir(s)  84,364,111,872 bytes free

C:\>(
 :
 dir
)
The filename, directory name, or volume label syntax is incorrect.
 Volume in drive C has no label.
 Volume Serial Number is 9CE0-91A0

 Directory of C:\

07/14/2018  09:54 AM             1,586 compact-all.bat
06/25/2018  01:03 PM    <JUNCTION>     Documents and Settings [C:\Users]
07/14/2018  08:03 AM    <DIR>          Fraps
06/25/2018  01:07 PM    <DIR>          Intel
06/25/2018  02:18 PM    <DIR>          NVIDIA
04/11/2018  05:38 PM    <DIR>          PerfLogs
07/13/2018  08:32 AM    <DIR>          Program Files
07/13/2018  04:56 PM    <DIR>          Program Files (x86)
06/25/2018  02:12 PM    <DIR>          Python27
07/14/2018  12:26 PM             7,404 result.txt
07/14/2018  12:26 PM                83 something.bat
06/25/2018  01:08 PM    <DIR>          Users
06/30/2018  02:19 PM    <DIR>          Windows
               3 File(s)          9,073 bytes
              10 Dir(s)  84,364,111,872 bytes free

C:\>(
 :
 dir
)
The device is not ready.
 Volume in drive C has no label.
 Volume Serial Number is 9CE0-91A0

 Directory of C:\

07/14/2018  09:54 AM             1,586 compact-all.bat
06/25/2018  01:03 PM    <JUNCTION>     Documents and Settings [C:\Users]
07/14/2018  08:03 AM    <DIR>          Fraps
06/25/2018  01:07 PM    <DIR>          Intel
06/25/2018  02:18 PM    <DIR>          NVIDIA
04/11/2018  05:38 PM    <DIR>          PerfLogs
07/13/2018  08:32 AM    <DIR>          Program Files
07/13/2018  04:56 PM    <DIR>          Program Files (x86)
06/25/2018  02:12 PM    <DIR>          Python27
07/14/2018  12:26 PM             7,404 result.txt
07/14/2018  12:26 PM                83 something.bat
06/25/2018  01:08 PM    <DIR>          Users
06/30/2018  02:19 PM    <DIR>          Windows
               3 File(s)          9,073 bytes
              10 Dir(s)  84,364,111,872 bytes free

C:\>(

 dir
)
 Volume in drive C has no label.
 Volume Serial Number is 9CE0-91A0

 Directory of C:\

07/14/2018  09:54 AM             1,586 compact-all.bat
06/25/2018  01:03 PM    <JUNCTION>     Documents and Settings [C:\Users]
07/14/2018  08:03 AM    <DIR>          Fraps
06/25/2018  01:07 PM    <DIR>          Intel
06/25/2018  02:18 PM    <DIR>          NVIDIA
04/11/2018  05:38 PM    <DIR>          PerfLogs
07/13/2018  08:32 AM    <DIR>          Program Files
07/13/2018  04:56 PM    <DIR>          Program Files (x86)
06/25/2018  02:12 PM    <DIR>          Python27
07/14/2018  12:26 PM             7,404 result.txt
07/14/2018  12:26 PM                83 something.bat
06/25/2018  01:08 PM    <DIR>          Users
06/30/2018  02:19 PM    <DIR>          Windows
               3 File(s)          9,073 bytes
              10 Dir(s)  84,364,111,872 bytes free
PS C:\>

But what I want is it to go to drive c:, d:, etc. and run a command.

I know normally I could do something like

dir %%x

but I'm making a script to compress (compact) the contents of every drive, but it doesn't seem to take the parameter correctly as it doesn't go through all the files when I do:

compact d:

which only affect the root of d:

versus

d:
compact

which affects every file and directory on d:

2
  • First wmic output to console has a flaw supplying line endings cr/cr/lf instead of the usual cr/lf. This can be accounted for. 2nd compact without arguments shows the compression ratio of the current dir and it's files - and does nothing else. See compact /? or view ss64.com/nt/compact.html
    – LotPings
    Jul 14, 2018 at 19:23
  • All the "compact" statements (especially the 2nd one) are shortened for brevity. I do have a set of parameters to append to them.
    – user924131
    Dec 10, 2018 at 18:16

2 Answers 2

2

Change to Drive Letter

To change to a specific drive letter while the command prompt directory is using a different drive letter than the one you need to change to, simply use the /D parameter with the CD command (e.g. CD /D <DriveLetter>:) to change to a different drive letter before running proceeding commands.


Delims

You should omit using the delims=" in the FOR loop as that tells it that space is not a delimiter which is not what you want to prevent that cr/cr/lf issue as per the LotPings comment.

  • FOR /?
        delims=xxx      - specifies a delimiter set.  This replaces the
                          default delimiter set of space and tab.
    

Since it states the default delimiter set of space and tab when you put delims=" just like that with the ending double quote after the equal sign =", that tells it there are no delimiters now.


Compact

Since Compact runs against files in the directory without specifying the path in an argument, if applicable, you can first CD /D <Letter>: and then run Compact /C to compact all files in a directory, or Compact /C /S to compact all files and folders recursively in the directory.


Batch Script

for /f "skip=1" %%x in ('wmic logicaldisk get caption') do (
    CD /D %%x
    Compact /C /S
    <Next or other command>
    )

Note: The drive letter is listed in a <letter>: format e.g. H:. So CD /D H: works just fine. You will obviously add the \ to the end of the iterated %%x i.e. %%x\ if you need to append a path to use a full path (%%x\folder\path) as a command argument e.g. dir %%x\folder\path.

enter image description here


Further Resources

  • CD

     Key
       /D : change the current DRIVE in addition to changing folder.
    
  • Compact

    Key    
       /C        Compress the specified files.  Directories will be marked
                 so that files added afterward will be compressed.
    
       /S        Perform the specified operation on files in the given
                 directory and all subdirectories.  
                 Default "dir" is the current directory.
    
  • I need a .bat for compact.exe and ignoring file types?

0

However, I can't seem to change to that drive

Use the following batch file (test.cmd):

@echo off
setlocal enabledelayedexpansion
rem skip=1 to remove the header
rem findstr to remove blank lines
for /f "skip=1" %%d in ('wmic logicaldisk get caption ^| findstr /r /v "^$"') do (
  cd /d %%d\
  dir
  )
endlocal

Notes:

  • Replace dir with the command you want to run on the root of each drive.

Further Reading

You must log in to answer this question.