web-dev-qa-db-ja.com

WindowsのPATH変数のスペースと括弧がバッチファイルをねじ込む

したがって、私のパス変数(System-> Adv Settings-> Env Vars-> System-> PATH)は次のように設定されています。

C:\Python26\Lib\site-packages\PyQt4\bin;
%SystemRoot%\system32;
%SystemRoot%;
%SystemRoot%\System32\Wbem;
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;
C:\Python26\;
C:\Python26\Scripts\;
C:\cygwin\bin;
"C:\PathWithSpaces\What_is_this_bullshit";
"C:\PathWithSpaces 1.5\What_is_this_bullshit_1.5";
"C:\PathWithSpaces (2.0)\What_is_this_bullshit_2.0";
"C:\Program Files (x86)\IronPython 2.6";
"C:\Program Files (x86)\Subversion\bin";
"C:\Program Files (x86)\Git\cmd";
"C:\Program Files (x86)\PuTTY";
"C:\Program Files (x86)\Mercurial";
Z:\droid\Android-sdk-windows\tools;

ただし、明らかに、改行はありません。

PathWithSpacesを含む行に注目してください。最初の行にはスペースがなく、2番目の行にはスペースがあり、3番目の行にはスペースとその後に括弧が付いています。

ここで、このバッチファイルの出力に注目してください。

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\>vcvars32.bat
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>"C:\Program Files (x86
)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
Setting environment for using Microsoft Visual Studio 2008 x86 tools.
\What_is_this_bullshit_2.0";"C:\Program was unexpected at this time.
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>      set "PATH=C:\Pro
gram Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Python26\Lib\site-packages\PyQt4\
bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\
WindowsPowerShell\v1.0\;C:\Python26\;C:\Python26\Scripts\;C:\cygwin\bin;"C:\Path
WithSpaces\What_is_this_bullshit";"C:\PathWithSpaces 1.5\What_is_this_bullshit_1
.5";"C:\PathWithSpaces (2.0)\What_is_this_bullshit_2.0";"C:\Program Files (x86)\
IronPython 2.6";"C:\Program Files (x86)\Subversion\bin";"C:\Program Files (x86)\
Git\cmd";"C:\Program Files (x86)\PuTTY";"C:\Program Files (x86)\Mercurial";Z:\dr
oid\Android-sdk-windows\tools;"

または具体的には次の行:

\What_is_this_bullshit_2.0";"C:\Program was unexpected at this time.

それで、このでたらめは何ですか?

具体的には:

  • 引用符で適切にエスケープされているがスペースのないパス内のディレクトリ=細かい
  • パス内のディレクトリで、引用符で適切にエスケープされ、スペースはあるが括弧はない=細かい
  • 引用符で適切にエスケープされ、スペースがあり、括弧が付いているパス内のディレクトリ= ERROR

何が起きてる?どうすれば修正できますか?私はおそらくツールを回避策として機能させるために接合点に頼るでしょうが、これについて何か洞察があれば、私に知らせてください:)

14
user30404

これは、「ブロック」内の行にエスケープされていない括弧がある場合に発生する可能性があります(区切り文字にも括弧を使用しています)。

通常、遅延展開をオンにして修正し、!var!ではなく%var%で変数を使用することができます。コードを見ずに私ができるアドバイスはこれ以上ありません。

14
Joey

64ビットシステムのWindowsユーザーへの注意

Progra〜1 = 'Program Files' Progra〜2 = 'Program Files(x86)'

https://confluence.atlassian.com/display/DOC/Setting+the+Java_HOME+Variable+in+Windows

19
Robb

(a)MS-Windows PATH環境変数に引用符を付けないでください(PATH command) または(b)引用符を囲む必要があります (SETコマンド) に続く式全体。残念ながら、これはMSによって十分に文書化されていませんが、引用符が使用されている場合、変数の値に含まれると述べています (Windows XP Command Line Reference )

$ SET BLAH="blah blah(1)"
$ ECHO %BLAH%
"blah blah(1)"
$ SET BLAH=blah blah(1)
$ ECHO %BLAH%
blah blah(1)

これにより、一貫性がなく、診断が困難な問題が発生する可能性があります。たとえば、パスに「C:\ Python27」が含まれている場合、マシンには「 'python'は内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されません。」と表示されます。あなたがPythonを実行しようとしたとき。ただし、一部のライブラリは引き続き使用できます

スペースや括弧を「エスケープ」する必要はありません。特殊文字をエスケープする必要がある場合は、式全体を引用符で囲みますinclude変数名。

SET "PATH=%PATH%;C:\Program Files (x86)\path with special characters"

または括弧も使用できます。

(SET VAR=can't contain ampersand, parentheses, pipe, gt or lt)

二重引用符はペアにする必要があることに注意してください。

(SET VAR=illegal characters!@#$%^*_-+={}[]\:;""',./?)
echo %VAR%
illegal characters!@#$%*_-+={}[]\:;""',./?

ただし、SETコマンドで問題を引き起こす可能性のある有効なパス名である文字はおそらくないでしょう。

13
Mark Mikofski

Microsoftは、問題を「 括弧を含むコマンドシェルスクリプトの実行エラー 」で文書化しています。

彼らが提案する解決策は、遅延拡張を使用することです。

SETLOCAL ENABLEDELAYEDEXPANSION
SET VAR=string containing ( and ) ...
IF "y" == "y" (
    ECHO !VAR! %VAR%
)
ENDLOCAL

Ifブロックでパスを設定する場合は、SET PATH=を使用するのではなく、PATHコマンドを使用する必要があります。

SET AddToPath=C:\Program Files (x86)\Whatever

SETLOCAL ENABLEDELAYEDEXPANSION
IF "%X%" == "%Y%" (
    ECHO Adding !AddToPath! to path !PATH!
    PATH !AddToPath!;!PATH!
)

他の変数の場合、別の解決策は引用符を使用することかもしれませんが、全体については:

SET "MyVar=C:\Program Files (x86)\Whatever"
2
mivk

Windows 8では、これらの方法のいずれかでほとんど成功していません。括弧は機能せず、引用符は機能しますが、この方法で変更する「パス」は、実行可能ファイルの検索に使用されるパスではなく、cmdは、窓。

例:プロセッサアーキテクチャを決定した後、PATH環境変数にいくつかのパスを追加します。実際には、バッチファイルの実行中にのみ必要なので、一時的に追加するだけでも機能します。しかし、それでもうまくいきません。

_echo %path%_は、cmdが起動されたときのシステムPATHを表示します。

set path="%path%;%programfiles(x86)%\company\program\subdir"は機能しますが、_%path%_にはすべて引用符で囲まれたものが含まれています。他の場所からsubdirでプログラムを実行しようとすると失敗します。引用符の代わりに括弧全体を使用する機能しない

もう1つ気づいたのは、cmdに対話形式で入力した場合は同じコマンドが機能するが、バッチファイルで使用した場合は機能しないことです。それは恐ろしいことです。さらに別の奇妙な点は、環境変数の値の最後の文字が断続的に失われることです。別の不整合は、サードパーティのプログラムとの不一致です。一部は_%var%_をパラメーターとして処理できますが、他のプログラムは処理できません。

1
Pete

彼の答えのジョーイは言う

これは、「ブロック」内の行にエスケープされていない括弧がある場合に発生する可能性があります(区切り文字にも括弧を使用しています)。

そしてそれは本当です。エスケープされていない括弧がある場合は、エスケープしてください。それが私がしたことです。交換しました

set PATH=some_path;%PATH%

set PATH="some_path;%PATH%"

これで問題が解決しました。

1
Piotr Dobrogost

私は同様のことを経験しました。 Microsoftはここで問題を説明します: http://support.Microsoft.com/kb/329308

基本的に、システム-> Adv設定->環境変数->システム->パスでパス変数を変更する代わりに、

My Computer->Manage->Computer Management (local)-> Properties-> Advanced-> Environment variables-> Settings
1
phearce

FromFile変数に設定する値の前後に二重引用符を追加するまで、Win8で次の作業を行うのに非常に苦労しました。それがなければ、fromFileに括弧付きのファイル名が含まれていた場合、toFile変数を生成するために文字列置換を実行しようとした次の行は失敗していました。 (それぞれのCALLインスタンスの)解析時ではなく実行時に変数を評価するために、そこで遅延展開を使用していることに注意してください。

::-- BATCH file that creates an *_576_5.* file from an *_640_t.* one (copying it)
::-- Author: George Birbilis (http://zoomicon.com)
::-- Credits: String replacement based on http://www.dostips.com/DtTipsStringManipulation.php

@ECHO OFF

::-- Loop for all files recursively --::

FOR /R %%f in (*_640_t.*) DO CALL :process %%f

ECHO(
PAUSE

GOTO :EOF

::-- Per-file actions --::

:process

:: Display progress...
::ECHO Processing %*
<nul (set/p dummy=.)

SETLOCAL ENABLEDELAYEDEXPANSION
SET fromFile="%*"
SET toFile=!fromFile:_640_t=_576_t!

IF NOT EXIST %toFile% CALL :generate %fromFile% %toFile%

GOTO :EOF

::-- Generate missing file --::

:generate

ECHO(
ECHO COPY %*
COPY %*

::PAUSE

GOTO :EOF
1
George Birbilis