6

私がやろうとしていることを正確に説明する方法はわかりませんが、理解できないことを示すバッチファイルの例を次に示します。

バッチファイルがあります。そのバッチファイル内に、ディレクトリを作成しようとしています:

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 を記述して整理する必要がありますか?

4

2 に答える 2

6

次のように式を引用符で囲みます。

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces"
C:\>echo %TargetDir%
C:\Program Files\My Directory Name has spaces

注: 引用符内の変数が展開されます。スペースも含まれている場合は、引用符で囲む必要があります。

これで、それを引用して操作を実行できます。

md "%TargetDir%\NewSubFolder"
于 2009-11-07T21:28:28.433 に答える
3

ここでの問題は、他の人が示唆したようなスペースではなく、むしろ環境変数の閉じ括弧です。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 では、これは起こらなかったので、=これが必要であることがわかっている場合を除き、前後にスペースを使用しないでください :-)

于 2009-11-13T08:35:23.627 に答える