環境変数をバッチファイルのスペースを持つ値に設定するにはどうすればよいですか?
-
18-09-2019 - |
質問
私がやろうとしていることを正確に説明する方法がわかりませんが、ここに私が理解できないことを示す例のバッチファイルがあります。
バッチファイルがあります。そのバッチファイルの中には、ディレクトリを作成しようとしています。
Set CopyFrom = %~dp0
if Exist "%ProgramFiles(x86)" (
Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces
)
md %TargetDir%\NewSubFolder
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder
私のバッチファイルは4行目で失敗しています Set TargetDir =...
と:
\My was unexpected at this time
私はこれが私のパス名にスペースがあるからだと思います。私は自分の変数を引用符で包むことができると思った:
Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces"
しかし、その後、ディレクトリを作成する行に到達すると、失敗します。 %TargetDir%
これで引用符に包まれています。 md "%TargetDir%"\NewSubFolder
これを修正できますか、それともvbscriptを書くだけで物事を整理する必要がありますか?
解決
あなたの表現をこのような引用に置くだけです:
C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces"
C:\>echo %TargetDir%
C:\Program Files\My Directory Name has spaces
注:見積もり内の変数を拡張し、スペースもある場合は、引用する必要があります。
これで、操作を実行するために引用できます。
md "%TargetDir%\NewSubFolder"
他のヒント
ここで問題の問題はあります いいえ 他の人が提案したようにスペースがありますが、むしろ環境変数の最後の括弧内 ProgramFiles(x86)
これにより、パーサーはブロックが早期に終了すると考えるようになります(恥知らずな自己宣伝).
引用 行う この場合、パーサーが引用された部分全体にジャンプさせ、次の括弧が実際の閉じたものであると正しく想定しているためです。しかし、修正はそれよりもはるかに簡単かもしれません:
if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces
あなたがそれをするすべてが正確に1つのコマンドを入れたのに、なぜ括弧付きのブロックを使用するのですか?
set
それ自体は引用符を必要としません、 を除外する その引数にの特殊文字が含まれている場合 <
, >
, |
, &
シェル自体が処理します。それは万能薬ではありませんが、ユーザーの入力またはファイルの内容を正しく痛みにします。
また、決してスペースを置いてはいけません =
で set
指図。これにより、環境変数はそのに伴って作成されます 名前 スペースとその内容で終わるスペースから始まります。これは、Windows 7では、端にスペースがある変数と以下の両方を静かに作成することにより、部分的に修正されました。
> set foo = bar
> set foo
foo=bar
foo = bar
しかし、以前のバージョンのWindowsではこれは起こらなかったので、周囲のスペースを使用しないでください =
あなたがこれがあなたが望むものであることを知らない限り:-)