Windows'ta boşluklar ve Parantez PATH değişken toplu dosyaları sıkıştırır


14

Böylece, yol değişkenim (Sistem-> Gelişmiş Ayarlar-> Env Vars-> Sistem-> PATH) şu şekilde ayarlanır:

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;

Rağmen, açıkçası, yeni satırlar olmadan.

Aşağıdaki satırlara dikkat edin PathWithSpaces- birincisinde boşluk yok, ikincisinde boşluk var ve üçüncüsünde boşluk ve ardından parantez var.

Şimdi, bu toplu iş dosyasının çıktısına dikkat edin:

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;"

veya özellikle satır:

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

Peki, bu saçmalık nedir?

özellikle:

  • Yoldaki tırnak işaretleri ile düzgün bir şekilde kaçan ancak boşluk içermeyen dizin = iyi
  • Yoldaki tırnak işaretleri ile düzgün bir şekilde kaçan ve boşlukları olan ancak parantez içermeyen dizin = iyi
  • Yoldaki tırnak işaretleri ile düzgün bir şekilde kaçan ve boşluklar içeren ve bir parantez içeren dizin = HATA

Burada neler oluyor? Bunu nasıl düzeltebilirim? Muhtemelen araçlarımın hala geçici çözüm olarak çalışmasını sağlamak için bir kavşak noktasına başvuracağım, ancak bu konuda herhangi bir fikriniz varsa lütfen bana bildirin :)


Eldeki sorunları anlamama dayanarak, yukarıdaki cevap doğru olanıdır ve SET'in komut olduğunu ve PATH'ın dengesinin yeni PATH dizesi olan argümanının bir parçası olduğunu dikkate alır. Yani, IMO, bu nadiren belgelenmiş değil, daha ziyade belirsiz bir uç davaya benziyor. Bu konuda birkaç saat geçirdim.
David A. Gray

Yanıtlar:


14

Bu, bir "blok" içindeki bir satırda (sınırlama için parantez de kullanır) kaçan parantez varsa oluşabilir.

Genellikle gecikmeli genişletmeyi açarak ve !var!yerine değişkenler kullanarak düzeltebilirsiniz %var%. Kodu görmeden verebileceğim daha fazla tavsiye yok.



13

Ya (a) Orada gerektiğini değil , MS-Windows yolu çevre değişkeni herhangi tırnak olmak (PATH komutu) veya (b) Aşağıdaki tüm deyimin çevreleyen tırnak olmalıdır (SET komutu) . Ne yazık ki, bu MS tarafından çok iyi belgelenmemiştir, ancak tırnak işaretleri kullanılırsa değişkenin değerine dahil edileceklerini belirtmektedirler (Windows XP Komut Satırı Başvurusu) .

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

Bu, tutarsız ve bu nedenle teşhis edilmesi zor sorunlara neden olabilir. Örneğin, yolunuz "C: \ Python27" içeriyorsa, makineniz "" python "dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmadı demektir. python yürütmeye çalıştığınızda. Ancak, bazı kütüphaneler hala mevcut olabilir .

Sen do not "kaçış" boşluk veya parantez gerekir. Özel karakterlerden kaçmanız gerekiyorsa , değişken adı da dahil olmak üzere ifadenin tamamına tırnak işareti koyun .

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

veya parantezleri de kullanabilirsiniz.

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

Dikkat, çift tırnak çift olarak gelmelidir.

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

Ancak, büyük olasılıkla SET komutuyla soruna neden olacak geçerli yol adları olan karakterler yoktur.



1
MS-Windows demek istediğinizde aslında MS-DOS yazdınız ve komutlarınız MS-Windows içindi. OP, MS-Windows hakkında sorular sordu. Neden MS-DOS diyorsun bilmiyorum. Bağlantılarınız bile NT dedi (Yani - Windows. Eskiden 9X ve NT idi, şimdi sadece NT). Windows ve MS-DOS iki farklı işletim sistemidir. Daha önce yanlışlıkla DOS olarak adlandırılan windows komut istemini gördüm, ancak bu bile aradığınız kadar yanlış değil.
barlop

@barlop, elbette haklısın. Düzenlemeler için teşekkürler. Windows-95'e kadar Windows, DOS üzerine kurulmuş bir uygulamadır. winKomutu DOS'a yazarak Windows'u başlatabilirsiniz . Aslında Windows-3.1'den önce, Zork ve WordStar gibi her şey DOS uygulamalarıydı. Sonra Windows-98 ile başlayarak, DOS yoktu. Ama benim gibi bazı eski zamanlayıcıların hala CMD kabuğuna yanlışlıkla DOS kabuğu olarak başvurduğunu düşünüyorum. Karışıklık için özür dilerim ve cevabımın amacını açıkladığınız için tekrar teşekkürler.
Mark Mikofski

@MarkMikofski Aslında Windows 9X (95/98 / ME) tartışmasız DOS üzerine de kurulmuş. Örneğin, bootGUI = 0 gibi bazı dosyaları düzenleyebilir (belki msdos.sys) ve tokyopc.org/newsletter/1996/08/msdosed.html pencereleri yüklemeyi durdurabilir ve oradan pencereleri yükleyip yükleyemeyeceğinizi bilmiyorum. Ve Win9X önyükleme diski DOS olarak kabul edilir. Sizin gibi ne konuştuklarını bilen eski zamanlayıcılar genellikle windows komut istemi DOS çağırma hatasını yapan son kişilerdir. DOS olmadığı konusunda en kararlı olan ilk insanlar.
barlop

1
Eğer mı denemek tavsiye (SET PATH=%PATH%;C:\Program Files (x86)\path with special characters)? Bu tamamen yanlış!
JosefZ

2

Microsoft " Parantez içeren komut kabuğu komut dosyalarını çalıştırma hatası " sorununu belgeliyor .

Önerdikleri çözüm, gecikmeli genişleme kullanmaktır.

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

İf bloğunda bir yol ayarlamak yerine, kullanmak yerine komutu SET PATH=kullanmalısınız PATH.

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

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

Diğer değişkenler için başka bir çözüm, tırnak işareti kullanmak olabilir, ancak her şeyin etrafında:

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

1

Joey cevabında diyor

Bu, bir "blok" içindeki bir satırda (sınırlama için parantez de kullanır) kaçan parantez varsa oluşabilir.

ve bu doğru. Eğer kaçamayan parantez varsa, onlardan kaçmalısınız. Ben de öyle yaptım; Ben değiştirdim

set PATH=some_path;%PATH%

ile

set PATH="some_path;%PATH%"

ve bu sorunu çözdü.


2
Hayır! Kullanmalısınızset "PATH=some_path;%PATH%"
JosefZ

1

Benzer bir şey yaşadım. Microsoft sorunu burada açıklıyor: http://support.microsoft.com/kb/329308

Temel olarak, Path değişkenini System-> Adv Settings-> Env Vars-> System-> PATH ile değiştirmek yerine,

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

1

Windows 8'de bu yöntemlerden herhangi birinde çok az başarı buldum. Parantezler çalışmaz, tırnak işaretleri çalışır, ancak bu şekilde değiştirdiğiniz "yol", yürütülebilir dosyaların yerini bulmak için kullanılan yol değildir.cmd pencereyi açtığınızda devralınan sistem yolunu kullanıyor gibi görünüyor.

örnek: işlemci mimarisini belirledikten sonra, PATH ortam değişkenine birkaç yol eklemek istiyorum. Aslında, sadece bir toplu iş dosyası çalışırken onlara ihtiyacım olduğu için onları geçici olarak eklemek bile işe yarayacaktır. Ama bu işe yaramıyor bile.

echo %path%cmdbaşlatıldığı sırada sistem PATH değerini görüntüler .

set path="%path%;%programfiles(x86)%\company\program\subdir"çalışır, ancak şimdi %path%tırnaklarla çevrili her şeyi içerir ve alt bir program başka bir yerden çalıştırmak için çalışırsanız, başarısız olur. Tırnaklar yerine her şeyin etrafında parantez kullanmak işe yaramıyor .

Fark ettiğim başka bir şey, aynı komutun etkileşimli olarak girilmesi durumunda çalışacağı cmd, ancak bir toplu iş dosyasında karşılaşılması durumunda çalışmayacağıdır . Bu korkutucu. Yine başka bir tuhaflık, bir ortam değişkeninin değerinin son karakterinin aralıklı olarak kaybedilmesidir! Başka bir tutarsızlık üçüncü taraf programlarındadır: bazıları %var%a parametresini işleyebilir , diğerleri yapamaz.


1

WinFile değişkeni için ayarladığım değerin etrafında çift tırnak ekleyene kadar Win8'de aşağıdaki işi yaparken büyük bir sorun yaşadım. Bununla birlikte, fromFile parantez içeren bir dosya adı içerdiğinde, toFile değişkenini oluşturmak için dize değiştirme yapmaya çalışan bir sonraki satır başarısız oldu. Değişkeni ayrıştırma zamanında (ilgili CALL örneğinin) yerine yürütme zamanında değerlendirmek için gecikmeli genişletme kullandığımı unutmayın

::-- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.