70

Windowsバッチファイルで、次の操作を行う場合:

set myvar="c:\my music & videos"

変数myvarは引用符を含めて保存されます。正直なところ、私はそれが非常に愚かだと思います。引用符は、文字列の開始位置と終了位置を示すためのものであり、値自体の一部として格納されるものではありません。
どうすればこれを防ぐことができますか?

ありがとう。

4

7 に答える 7

67
set "myvar=c:\my music & videos"

引用符が myvar の前で始まることに注意してください。それは実際にはとても簡単です。補足: & はコマンド セパレーターとして読み取られるため、引用符で囲まれていない限り、後で myvar をエコーすることはできませんが、パスとしては引き続き機能します。

http://ss64.com/nt/set.html「変数名にはスペースを含めることができます」の下

于 2011-12-20T21:34:28.370 に答える
63

これは正しい方法です:

set "myvar=c:\my music & videos"

引用符は変数値に含まれません。

于 2012-10-20T12:25:37.263 に答える
35

変数をどのように使用するかによって異なります。引用符なしで変数の値を使用したいだけの場合は、遅延展開と文字列置換、または次のforコマンドを使用できます。

@echo OFF
SETLOCAL enabledelayedexpansion

set myvar="C:\my music & videos"

andynormancx が述べているように、文字列には . が含まれているため、引用符が必要です&。または、 でエスケープすることもできますが^、引用符の方が少しきれいだと思います。

文字列置換で遅延展開を使用すると、引用符なしで変数の値が取得されます。

@echo !myvar:"=!
>>> C:\my music & videos

for次のコマンドを使用することもできます。

for /f "tokens=* delims=" %%P in (%myvar%) do (
    @echo %%P
)
>>> C:\my music & videos

ただし、コマンドで変数を使用する場合は、引用符で囲まれた値を使用するか、変数の値を引用符で囲む必要があります。

  1. 文字列置換と遅延展開を使用して、引用符なしで変数の値を使用しますが、コマンドで変数を使用します。

    @echo OFF
    SETLOCAL enabledelayedexpansion
    
    set myvar="C:\my music & videos"
    md %myvar%
    @echo !myvar:"=! created.
    
  2. コマンドを使用して引用符なしで変数の値を使用しますが、forコマンドで変数を使用する場合は、変数を引用符で囲む必要があります。

    @echo OFF
    set myvar="C:\my music & videos"
    
    for /f "tokens=* delims=" %%P in (%myvar%) do (
        md "%%P"
        @echo %%P created.
    )
    

簡単に言えば&、バッチ ファイルに埋め込まれたスペースや s を含むパスまたはファイル名を使用するクリーンな方法は実際にはありません。

于 2009-02-11T13:12:18.710 に答える
7

jscriptを使用します。

何ヶ月も前(つまり、約8年のギブまたはテイク)、私は大規模なC ++ / VB6プロジェクトに取り組んでおり、ビルドの一部を実行するためのさまざまなバッチスクリプトがありました。

次に、誰かが私にJoel Testを指摘しました。私は、ポイント2に特に夢中になり、すべての小さなビルドスクリプトを1つのビルドスクリプトにまとめることに着手しました。。。

そして、それは私の心をほとんど壊し、それらすべての小さなスクリプトを、異なるマシンで、わずかに異なるセットアップで一緒に動作させました。それは本当にもろく、ほんの少しでもそれを壊し、再び始めるために30分の微調整を必要としました。

最終的に-私は頑固になる可能性があります-私はすべてをチャックし、約1日ですべてをJavaScriptで書き直し、CScriptを使用してコマンドプロンプトから実行しました。

私は振り返っていません。最近はMSBuildとCruiseControlですが、バッチスクリプトに少しでも関係することが必要な場合は、jscriptを使用します。

于 2009-02-11T09:28:21.540 に答える
1

エスケープ文字「^」を使用してみてください。

set myvar=c:\my music ^& videos

シェルは & をリテラルとして扱わない可能性があるため、myvar を展開するときは注意が必要です。上記が機能しない場合は、文字列にもキャレットを挿入してみてください。

set myvar=c:\my music ^^^& videos
于 2009-02-11T09:11:04.187 に答える