Изменить каталог в Windows Batch Script

Основываясь на некоторых других ответах, которые я нашел, я могу просмотреть доступные метки дисков. Тем не менее, я не могу перейти на этот диск:

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

Что дает мне:

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:\>

Но я хочу пойти на диск c:, d: и т. Д. И запустить команду.

Я обычно знаю, что могу сделать что-то вроде

dir %%x

но я делаю скрипт для сжатия (сжатия) содержимого каждого диска, но он, кажется, не принимает параметр правильно, так как он не просматривает все файлы, когда я это делаю:

compact d:

которые влияют только на корень d:

против

d:
compact

который влияет на каждый файл и каталог на d:

2 ответа

Изменить на букву диска

Чтобы изменить конкретную букву диска, пока каталог командной строки использует букву диска, отличную от той, на которую нужно изменить, просто используйте /D параметр с помощью команды CD (например, CD /D <DriveLetter>:) изменить другую букву диска перед выполнением последующих команд.


Delims

Вы должны опустить использование delims=" в цикле FOR, поскольку это говорит о том, что пробел не является разделителем, который не является тем, что вы хотите предотвратить cr/cr/lf выпускать согласно комментарию LotPings.

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

Так как он устанавливает по умолчанию набор разделителя пробела и табуляции, когда вы кладете delims=" просто так с окончанием двойной кавычки после знака равенства =", что говорит о том, что сейчас нет разделителей.


компактный

Поскольку Compact работает с файлами в каталоге без указания пути в аргументе, если это применимо, вы можете сначала CD /D <Letter>: а потом беги Compact /C сжать все файлы в каталоге, или Compact /C /S сжать все файлы и папки рекурсивно в каталоге.


Пакетный скрипт

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

Примечание. Буква диска указана в <letter>: формат например H:, Так CD /D H: работает просто отлично. Вы, очевидно, добавите \ до конца повторного %%x т.е. %%x\ если вам нужно добавить путь, чтобы использовать полный путь (%%x\folder\path) в качестве аргумента команды, например dir %%x\folder\path,


Дополнительные ресурсы

Тем не менее, я не могу перейти на этот диск

Используйте следующий пакетный файл (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

Заметки:

  • замещать dir с помощью команды, которую вы хотите запустить в корне каждого диска.

Дальнейшее чтение

Другие вопросы по тегам