4

FOR /Fこんにちは、バッチ ファイルでコマンドを使用しようとしていますが、問題が発生しています。

私はそれを実行します....

rem finding model number
for /F "delims= skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a

そしてそれはうまくいきます、私は望む結果を得る

result: 637263G

ここで、c:\windows\ の下に「637263G」というフォルダーを作成するとします。

eg:c:\windows\637263G\test

パスに移動するバッチを作成します...

for /F "skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a

cd windows\%model%\test

................................................

%model% が返さ "c:\windows\637263G \test"れていないため、これは爆発します"c:\windows\637263G\test"

モデル名の後にスペースを空けています。

後ろのスペースを削除する方法を知っている人はいますか?

4

4 に答える 4

3

置換を使用すると、%% aのすべてのスペースを抑制することができます:

set a=%a: =%
于 2013-02-14T13:28:48.753 に答える
3

一部のコンピューターでは値の途中にスペースがあるため、一部の回答が示唆するように、すべてのスペースを削除しないでください。WMIC CSProduct Get Name の結果のリストを参照してください。

末尾に複数のスペースがあるだけでなく<CR>、WMIC の Unicode 出力を ASCII に自動変換する際に発生するキャリッジ リターン ( ) も末尾に付いています。

<CR>値を別の FOR /F ループに渡すことで、末尾を削除できます。これにより、幻の「空白」行 (実際には<CR>) も削除されるため、IF ステートメントは不要になります。

~nxその後、修飾子を使用して末尾のスペースを削除できます。これは、ファイル名がスペースまたはドットで終わることができず、OS によって自動的に削除されるためです。修飾子は、末尾のドットとスペースを削除して「ファイル名」を正規化します。\値に、/*、またはが含まれている場合?、または文字の後に が続く場合、これは正しく機能しません:

for /F "skip=1 delims=" %%A in (
  'wmic csproduct get name'
) do for /f "delims=" %%B in ("%%A") do set "model=%%~nxB"

もう 1 つのオプションは、wmz の CSV 形式の提案を使用することですが、末尾の<CR>.

for /F "skip=2 tokens=2 delims=," %%A in (
  'wmic csproduct get name /format:csv'
) do for /f "delims=" %%B in ("%%A") do set "model=%%B"


編集 - 削除せずに wmz ソリューションが機能しているように見える理由<CR>

設定後の変数へのアクセス方法によっては、<CR>問題が明らかでない場合があります。model通常の展開ではすべてが削除されます<CR>が、遅延展開では保持されます。

@echo off
setlocal enableDelayedExpansion
for /f "skip=2 tokens=2 delims=," %%A in (
  'wmic csproduct get name /format:csv'
) do set "model=%%A"
echo    Normal expansion strips ^<CR^>:     [%model%]
echo    Delayed expansion preserves ^<CR^>: [!model!]

--- 出力 ---

   Normal expansion strips <CR>:     [LX4710-01]
]  Delayed expansion preserves <CR>: [LX4710-01


<CR>編集 -問題を回避する別の方法

CSV 形式を使用して、必要な値の後に表示される追加の属性を要求できます。目的の<CR>トークンを解析するときに、余分な値とともに破棄されます。

for /f "skip=2 tokens=2 delims=," %%A in (
  'wmic csproduct get name^,vendor /format:csv'
) do set "model=%%A"
于 2013-02-15T01:23:54.757 に答える
2

戻り文字列のトリミングとは別に(すでに提案されているように)、 wmic 出力を再フォーマットして、パディング(スペース)を返さないようにすることもできます。次に例を示します。

for /f "skip=2 tokens=2 delims=," %%a in ('wmic csproduct get name /format:csv')

複数の列を返したい場合に特に便利です。
(データをそのまま返すので、末尾のスペースが含まれていた場合は保持されます。無条件にスペースを切り詰めたい場合は、変数置換を使用してください)

于 2013-02-14T19:24:14.540 に答える
1

Kayasax が提案したように、変数置換を使用できます。
ただし、これは通常の変数でのみ機能し、%1 や for ループ パラメーターでは機能しません。

set "model=%model: =%"

または、wmic が常に 1 つのスペースを追加することが確実な場合は、次も使用できます。

set "model=%model:~0,-1%"

これにより、最後の文字のみが削除されます

于 2013-02-14T13:40:39.487 に答える