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 cada unidade, 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:

CmdrShepardsPie
fonte
A primeira saída wmic para o console tem uma falha fornecendo terminações de linha cr / cr / lf em vez do usual cr / lf. Isso pode ser explicado. 2º compacto sem argumentos shows a taxa de compressão do diretório atual e seus arquivos - e não faz mais nada. Vejo compact /? ou ver ss64.com/nt/compact.html
LotPings
Todas as declarações "compactas" (especialmente a segunda) são encurtadas por brevidade. Eu tenho um conjunto de parâmetros para anexar a eles.
CmdrShepardsPie

Respostas:

2

Alterar para letra de unidade

Para alterar 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, simplesmente use o comando /D parâmetro com o CD comando (por ex. CD /D <DriveLetter>: ) para alterar para uma letra de unidade diferente antes de executar comandos contínuos.


Delims

Você deve omitir o uso do delims=" no PARA loop que diz que o espaço não é um delimitador que não é o que você deseja impedir que cr/cr/lf questão de acordo com o LotPings Comente.

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

Desde que afirma o conjunto de delimitador padrão de espaço e tabulação quando você coloca delims=" apenas assim com o final de aspas duplas após o sinal de igual =", que diz que não há delimitadores agora.


Compactar

Desde a Compactar é executado contra arquivos no diretório sem especificar o caminho em um argumento, se aplicável, você pode primeiro CD /D <Letter>: e depois correr Compact /C compactar todos os arquivos em um diretório ou Compact /C /S para compactar todos os arquivos e pastas de forma recursiva 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>
    )

Nota: A letra da unidade é listada em um <letter>: formato por exemplo. H:. assim CD /D H: funciona muito bem. Você obviamente adicionará o \ até o final da iterada %%x isto é %%x\ se você precisar acrescentar um caminho para usar um caminho completo ( %%x\folder\path ) como um argumento de comando por exemplo. dir %%x\folder\path.

enter image description here


Mais recursos

Pimp Juice IT
fonte
0

No entanto, não consigo mudar para essa unidade

Use o seguinte arquivo em lotes (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:

  • Substituir dir com o comando que você deseja executar na raiz de cada unidade.

Leitura Adicional

DavidPostill
fonte