Windows .cmdファイルまたはバッチファイルのパスにスペースを含むパス変数を設定する


112

私はスクリプトを書くのが初めてで、これを機能させることができません。スペースのないパスにファイルを移動した場合は可能ですが、可能な場合はスペースで作業したいと思います。

.cmdファイルを含むフォルダーにOffice更新プログラムの束を抽出したいと思います。バッチファイルを任意のコンピューターで使用できるようにするには、パス変数を設定します。パス変数を変更するだけで、別のマシンで実行できます。問題は、パスにスペースが含まれていることです。定義でパスを引用符で囲むと、cmd.exeはパスを引用符で囲んでからファイル名を追加して切り替え、バッチは「コマンドライン構文エラー」で失敗します。引用符がないと、「内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。」で失敗します。

テストのために、私はそれが機能するまで、またはそれが機能するようになるまで、ヘルプスイッチを使用しています。8.3ファイル/フォルダー名(My Documents as MyDocu〜1など)を使用して実行できますが、別の方法で実行できますか?


引用符には、ファイル名を含むパスが含まれている必要があり、コマンドラインパラメータが続く必要があります。コマンドラインがどのように作成されるかについて、もう少し詳しく教えてもらえますか?>定義でパスを引用符で囲んだ場合、cmd.exeはファイル名とスイッチを追加する前にパスを引用符で
囲み

回答:


104

このようなものを試してください:

SET MY_PATH=C:\Folder with a space

"%MY_PATH%\MyProgram.exe" /switch1 /switch2

これは、メモ帳で[置換]を使用して実行したものです。ありがとうございました。
marcerickson 2009

5
それが助けてうれしい。あなたがあなたがあなたを助けたと感じたどんな答えでも賛成票を投じて受け入れるなら、それは素晴らしいでしょう。
失神2009

74

私が使う

set "VAR_NAME=<String With Spaces>"

パスを更新するとき:

set "PATH=%UTIL_DIR%;%PATH%"

3
これは受け入れられる答えになるはずです。何らかの理由で、値にスペースがあり引用符で囲まれていない場合、ifブロックからsetを呼び出しても機能しません。
ケビン

33

ここには2つのオプションがあります。まず、パスを引用符で囲まずに保存し、後で引用するだけです。

set MyPath=C:\Program Files\Foo
"%MyPath%\foo with spaces.exe" something

使用できる別のオプションは、文字列の引用を解除することを可能にするサブルーチンです(ただし、この場合、引用符を追加して削除し、利点なしで再度追加するため、実際にはあまり良いアイデアではありません)。

set MyPath="C:\Program Files\Foo"
call :foo %MyPath%
goto :eof

:foo
"%~1\foo.exe"
goto :eof

%~1引数を囲む引用符を削除します。これは、引用符で囲まれたフォルダ名を渡すときに便利ですが、前に述べたように、この特定のケースでは、それは最善のアイデアではありません:-)


メモ帳で置換を使用して、最初の方法を使用しました。2番目のものは不必要に複雑に見えました。ありがとうございました。
marcerickson 2009

2
パラメータを取得するバッチファイルがあります。使用set LALA=%~1は私にとってうまくいったものでした。
JCH2k 2015

2番目の方法は、サブルーチン
robe007

16

これを試して;

  1. 以下のように変数を作成します

    SET "SolutionDir=C:\Test projects\Automation tests\bin\Debug"**
    
  2. 次に、パスを変数に置き換えます。開始と終了の引用符を必ず追加してください

    vstest.console.exe "%SolutionDir%\Automation.Specs.dll"
    

8

.batファイルを作成するときは、常にパスを二重引用符で囲みます。(一時停止を追加したので、画面は閉じません。)

例えば:

"C:\Program Files\PageTech\PCLReader64_131\PCLReader64.exe"
PAUSE

7

これを行う適切な方法は次のとおりです。

@ECHO off
SET MY_PATH=M:\Dir\^
With Spaces\Sub Folder^
\Dir\Folder
:: calls M:\Dir\With Spaces\Sub Folder\Dir\Folder\hello.bat
CALL "%MY_PATH%\hello.bat"
pause

5

この問題を修正する最も簡単な方法は、フォルダー名を引用符で囲むことです。

(cd\New Folder\...) --> (cd\"New Folder"\...)

これがお役に立てば幸いです。


2

永続的なパスを保存する必要がある場合(cmdを再起動してもパスは変更されません)

  1. 管理者としてコマンドプロンプトを実行します(cmd.exeを右クリックして、[管理者として実行]を選択します)

  2. cmd setx path "%path%;your new path" に入力します

  3. パスを入力してEnterキーを押し、パスが正しく設定されているかどうかを確認します


1
私は、質問を約ないと思うのPATH変数ではなく、約パス変数。OPは明らかに、特定のパスを変数に格納し、バッチスクリプト全体でその値を使用したいと考えています。
Andriy M

1

このようにダブルスラッシュを追加してみてください

set dir = "C:\\ 1。Some Folder \\ Some Other Folder \\ Just Why"

MKDIR%dir%の@echo

OMGは投稿した後、私の投稿の2番目の\を削除したので、私のコメントを開いて3つ表示されている場合は、2つとして読む必要があります......

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.