web-dev-qa-db-ja.com

WMICを使用してドライブラベルのみを取得することは可能ですか?

WMICを使用して、ドライブ文字に基づいてのみドライブラベルを取得したいと思います。

for /f "skip=1" %a in ('wmic volume where "Driveletter like '%C%'" get label') do echo %a

これで、Windowsコマンドラインを理解している人は、私がエコーを「実行」しているため、これが期待どおりに機能しない理由を理解できます。したがって、上記を使用すると、出力は次のようになります(これは私が望んでいるものではありません)。

C:\>for /f "skip=1" %a in ('wmic volume where "Driveletter like '%C%'" get label') do echo %a

C:\>echo System
System

C:\>echo
ECHO is on.

WMICコマンドの生の出力は次のようになります。

Label
System

目標は、最初の行をスキップして(for /f "skip=1"...を使用しようとした理由)、2行目だけを取得することです。ただし、エコーせずに単に表示する方法がわかりません。

2
Beems

2つの問題があります。 Techie007は最初のものを識別しました-コマンドが画面にエコーされないようにする場合は、DOコマンドの前に@を付ける必要があります。 ECHOがOFFの場合、これは必要ありません。

もう1つの問題は、FOR/FがWMICのUnicode出力とどのように相互作用するかという非常に厄介なアーティファクトです。どういうわけか、各行が\ r\r\nで終わるように、Unicodeが不適切にANSIに変換されています。 FOR/Fは\ nごとに中断し、単一の端子\ rのみを取り除き、余分な不要な\ rを残します。 (\ rはキャリッジリターン文字を表し、\ n改行文字を表すことに注意してください)

WMIC出力には、最後に余分な空の行が含まれています。余分な不要な\ rは、FOR/Fがその行を無視するのを防ぎます(空とは見なされません)。値をエコーすると、ECHO is on.が得られます

これを処理する方法は複数ありますが、私のお気に入りは、出力を追加のFOR/Fに渡して、不要な\ rを削除することです。

for /f "skip=1 delims=" %a in ('wmic volume where "Driveletter like '%C%'" get label') do @for /f "delims=" %b in ("%a") do @echo %b
2
dbenham

プレフィックスEchoの前に@コマンドを表示しないようにする記号。

つまり(簡潔にするために省略):

for ... do @echo %a
1