web-dev-qa-db-ja.com

Windowsバッチスクリプトでのディレクトリの変更

私が見つけた他のいくつかの回答に基づいて、利用可能なドライブラベルをループできます。ただし、そのドライブに変更できないようです。

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のルートにのみ影響します。

versus

d:
compact

これは、d上のすべてのファイルとディレクトリに影響します。

1
user924131

ドライブレターに変更

コマンドプロンプトディレクトリが変更先のドライブ文字とは異なるドライブ文字を使用しているときに特定のドライブ文字に変更するには、_ [〜#〜] cd [〜を指定して/Dパラメーターを使用するだけです。 #〜] コマンド(例CD /D <DriveLetter>:)は、続行するコマンドを実行する前に別のドライブ文字に変更します。


Delims

[〜#〜] for [〜#〜]ループでdelims="を使用することは省略してください。これは、スペースが区切り文字ではないことを示しているため、スペースを使用したくないためです。 cr/cr/lfLotPings コメントに従って問題。

  • 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

enter image description here


その他のリソース

2
Pimp Juice IT

しかし、私はそのドライブに変更するようには思えません

次のバッチファイル(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を、各ドライブのルートで実行するコマンドに置き換えます。

参考文献

0
DavidPostill