Alterar o diretório no script de lote do Windows

1

Com base em algumas outras respostas que encontrei, posso percorrer as etiquetas de drive disponíveis. No entanto, parece que não consigo mudar para essa unidade:

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

O que me dá:

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

Mas o que eu quero é que ele vá para c :, d :, etc. e execute um comando.

Eu sei que normalmente eu poderia fazer algo como

dir %%x

mas estou fazendo um script para compactar (compactar) o conteúdo de todas as unidades, mas não parece ter o parâmetro corretamente, já que ele não passa por todos os arquivos quando eu o faço:

compact d:

que afetam somente a raiz de d:

versus

d:
compact

que afeta todos os arquivos e diretórios em d:

    
por CmdrShepardsPie 14.07.2018 / 20:30

2 respostas

2

Alterar para letra de unidade

Para mudar para uma letra de unidade específica enquanto o diretório do prompt de comando estiver usando uma letra de unidade diferente daquela para a qual você precisa mudar, basta usar o parâmetro /D com o CD comando (por exemplo, CD /D <DriveLetter>: ) para alterar para uma letra de unidade diferente antes de executar os comandos procedentes.

Delims

Você deve omitir o uso do delims=" no loop FOR para informar que o espaço não é um delimitador que não é o que você deseja impedir que cr/cr/lf emita conforme o LotPings comentário.

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

Como ele define o conjunto de delimitadores padrão de espaço e guia quando você coloca delims=" com as aspas finais após o sinal de igual =" , isso indica que não há delimitadores agora.

Compact

Como Compact é executado em arquivos no diretório sem especificar o caminho em um argumento, se aplicável, você pode primeiro CD /D <Letter>: e, em seguida, execute Compact /C para compactar todos os arquivos em um diretório ou Compact /C /S para compactar todos os arquivos e pastas recursivamente no diretório.

Script em lote

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

Mais recursos

por 15.07.2018 / 05:29
0

No entanto, parece que não consigo mudar para essa unidade

Use o seguinte arquivo de lote (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

Notas:

  • Substitua dir pelo comando que você deseja executar na raiz de cada unidade.

Leitura Adicional

por 14.07.2018 / 21:34