Windowsのスペースと括弧PATH変数がバッチファイルを台無しにする


14

だから、私のパス変数(システム-> Adv設定->環境変数->システム->パス)は次のように設定されています:

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.

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

具体的には:

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

何が起きてる?どうすれば修正できますか?私はおそらく、ツールを回避策として機能させるためにジャンクションポイントに頼りますが、これについての洞察があれば、お知らせください:)


手元の問題の私の理解に基づいて、上記の答えは正しいものであり、SETがコマンドであり、PATHが引数の一部であり、残りが新しいPATH文字列であることを考慮することに依存しています。それで、IMO、それはまばらに文書化されているのではなく、それはより曖昧なエッジケースのようなものです。私はこの問題に数時間を費やしました。
デビッドA.グレイ

回答:


13

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

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



13

()が存在すべきであるのいずれかではない MS-、WindowsのPATH環境変数に任意の引用符のこと(PATHコマンド)以下の式全体を囲む引用符がなければならないか、(b)は(SETコマンド)。残念ながら、これはMSによってあまりよく文書化されていませんが、引用符が使用されている場合、変数の値に含まれると述べています(Windows XPコマンドラインリファレンス)

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

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

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

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コマンドで問題が発生します。



1
MS-Windowsを意味するときに実際にMS-DOSを作成し、コマンドはMS-Windows用でした。OPはMS-Windowsについて尋ねました。だから、なぜあなたはそれをMS-DOSと呼んでいるのか分かりません。あなたのリンクでさえNTと言いました(それは-Windowsです。以前は9XとNTでしたが、現在はNTです)。WindowsとMS-DOSは2つの異なるオペレーティングシステムです。Windowsコマンドプロンプトが誤ってDOSと呼ばれるのを見たことがありますが、それでもあなたがそれを呼んだほど間違っていません。
barlop

@barlop、もちろんあなたは正しいです。編集していただきありがとうございます。Windows-95まで、WindowsはDOS上に構築されたアプリケーションでした。winDOSでコマンドを入力してWindowsを起動できます。実際、Windows-3.1より前のバージョンでは、ZorkやWordStarなどはすべてDOSアプリケーションでした。その後、Windows-98以降、DOSはありませんでした。しかし、私のような古いタイマーでは、CMDシェルを誤ってDOSシェルと呼んでいます。混乱して申し訳ありません。また、私の回答の意図を明確にしていただきありがとうございます。
マークミコフスキー14年

@MarkMikofski実際、Windows 9X(95/98 / ME)はおそらくDOS上でも構築されています。たとえば、いくつかのファイル(msdos.sysなど)を編集し、bootGUI = 0などのオプションを選択して、tokyopc.org / newsletter / 1996/08 / msdosed.htmlのウィンドウの読み込みを停止 することができます。わからない また、Win9XブートディスクはDOSと見なされます。あなたがしているように彼らが何について話しているかを知っている古いタイマーは、通常、WindowsコマンドプロンプトDOSを呼び出す間違いをする最後の人々です。そして、それがDOSではないことを最も強く主張する最初の人々です。
barlop 14年

1
アドバイスしてました(SET PATH=%PATH%;C:\Program Files (x86)\path with special characters)か?それは完全に間違っています!
-JosefZ

2

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

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

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

を使用するのSET PATH=ではなく、ifブロックにパスを設定するには、おそらく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"

1

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

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

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

set PATH=some_path;%PATH%

set PATH="some_path;%PATH%"

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


2
いや。使用する必要がありますset "PATH=some_path;%PATH%"
JosefZ

1

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

基本的に、System-> Adv Settings-> Env Vars-> System-> PATHでPath変数を変更する代わりに、

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

1

Windows 8では、これらの方法のいずれでもほとんど成功していません。括弧は機能せず、引用符は機能しますが、この方法で変更する「パス」は、代わ​​りに実行可能ファイルの検索に使用されるパスではありませんcmd、ウィンドウを開いたときに継承したシステムパスを使用しているようです。

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

echo %path%起動時のシステムPATHを表示しますcmd

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

もう1つ気づいたのは、にインタラクティブに入力した場合は同じコマンドが機能するがcmd、バッチファイルで入力した場合は機能しないことです。それは恐ろしいです。さらに別の奇妙な点は、環境変数の値の最後の文字が断続的に失われることです!もう1つの矛盾は、サードパーティのプログラムに%var%あります。パラメータとして処理できるものとできないものがあります。


1

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