2016-11-13 6 views
0

でループのために長いfilenamedコマンドを引用は:リンクされたバッチファイル

Best free resource for learning advanced batch-file usage?

Dealing with quotes in Windows batch scripts

これは、これらのしゃくにさわる引用課題の一つであるように思われます。このプログラム例では、

@echo off 
set wmicpath=%windir%\System32\wbem\wmic.exe 

for /f "usebackq" %%a in (`%wmicpath% COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"`) do (
    echo %%a 
) 

プログラムは正常に動作します。 wmicpathを引用しようとしない限り。長いパス名が含まれていることを想像してみてください。それからあなたはそれを引用する必要があります。しかし、私はそれを働かせることはできません。

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"`) do (

をが、これは、この場合と同様に

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I x64`) do (

!:作品:これは失敗し

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType`) do (

をするためのコマンドで引用符をマッチングについては本当に奇妙な何かがあります。あなたは他の場所で引用を始めない限り、コマンドを引用することができます...

それは可能ですか?私は様々なポイントで脱出しようとしたが、引用符が含まれているとき、私はエスケープのルールについてはよく分からない...

編集:私はこのリンクは問題かもしれないと思う(すなわち:それはバグです):Pipe in for loop breaks double quoted variables

答えて

2
@echo off 
    setlocal enableextensions disabledelayedexpansion 
    set "wmicpath=%windir%\System32\wbem\wmic.exe" 

    for /f "usebackq delims=" %%a in (` 
     ^""%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I "x64"^" 
    `) do (
     echo %%a 
    ) 

あなたは内部コマンドの開始と終了を見れば、あなたは二つの追加^"(エスケープされた二重引用符)が表示されます。問題は、forコマンドがinnerコマンドを処理するために別のインスタンスcmdを生成しており、この別のインスタンスが最初と最後の二重引用符を削除していることです。

なぜ引用符がエスケープされますか?この追加の引用符が、他の構文解析上の問題を引き起こす可能性のあるコマンドの二重引用符と対になるのを避けるためです。

cmd /?を実行すると、ヘルプページが表示されます(申し訳ありませんが、私はスペイン語のロケールを使用していますので、ここに出力は含まれません)。引用符の削除の動作を説明する/C/Kの使い方に関するセクションが表示されます。

+0

優秀!ありがとう。私は昨夜午前1時ごろに自分自身を見つけましたが、なぜ、どこに文書化されたのかが分かりませんでしたが、バグだと思っていましたが、あなたが言うように、最初と最後の二重引用符に一致しています。 – carveone

0
>x64.txt ECHO x64 

for /f "usebackq" %%a in (`"%wmicpath%" COMPUTERSYSTEM GET SystemType ^| findstr /I /g:x64.txt`) do (

は、実際のアプリケーションや設定に応じて回避することができます。

+0

findstrはかなり柔軟ですが、一般的に私は外部ファイルを作成しないようにしています。 – carveone

1

まず、コマンドを変更すると、WMICではクエリ言語LIKE演算子を使用できます。この演算子は、この場合は何かをパイプする必要がなくなります。

@Echo Off 
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe" 
For /F "UseBackQ Skip=1" %%a In (
    `""%WMIC%" ComputerSystem Where "SystemType Like 'x64%%'" Get SystemType"` 
) Do For %%b In (%%a) Do Echo=%%b 
Timeout -1 

そこで私も、私は引用符をバックに使用しないようにコマンドのフォーマットを変更することがあります。

@Echo Off 
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe" 
For /F "Skip=1" %%a In (
    '""%WMIC%" ComputerSystem Where (SystemType Like "x64%%") Get SystemType"' 
) Do For %%b In (%%a) Do Echo=%%b 
Timeout -1 

これは、タイトルの質問に直接答えるわけではありませんが、特定のコマンドが正しく機能することを許可しています。あなたはその出力をエコーするループのために必要がないため

はしかし、あなたの特定のコマンドの例に必要ありませんどちらも:

@Echo Off 
Set "WMIC=%SystemRoot%\System32\Wbem\wmic.exe" 
"%WMIC%" ComputerSystem Get SystemType|Find /I "x64" 
Timeout -1 

変更するには、必要性を感じた場合はfindstrにして下さい。

+0

あなたはWMICについて正しいです。うまくいった。私は何か特別なやり方をすれば、あまり効率が悪くてもそれをやり続けます。私は彼らがその怠惰を呼んだと思う:-)あなたは私の例については正しいですが、私の実際のコードでは、出力を保存し、さらにそれを使用します。 – carveone

+1

私はあなたがおそらくそれをしていることを認めますが、私の知る限りでは、あなたの質問の選択されたコマンドに基づいて次のものが出され、基準を見つけることができます。そのため、後者の例を '&&'で使用するだけで成功時に設定することができます。 '"%WMIC% "ComputerSystem Get SystemType | Find/I" x64 ">ヌル&&(Set var = x64ベース)'。 – Compo

関連する問題