2010-05-05 10 views
5

Mam problem z skryptem wsadowym systemu Windows, w którym walnę głową (nie gra słów przeznaczonych). Problematyczny skrypt wygląda tak:Jak ustawić zmienną PATH na inną wartość zmiennej ze spacjami w pliku wsadowym Windows

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

Kiedy go uruchomić i _OLD_VIRTUAL_PATH jest ustawiony uzyskać:

\Microsoft was unexpected at this time. 

_OLD_VIRTUAL_PATH jest zmienną, która została pierwotnie powołana z PATH i zawiera spacje - Jestem dość pewny, że to jest problem. Ale jakie jest rozwiązanie? Działa poprawnie, jeśli umieściłem go w cudzysłowach, ale nie sądzę, aby cała wartość zmiennej PATH była cytowana.

Odpowiedz

7

Twój problem tutaj to nie spacje, ale raczej nawias zamykający. Prawdopodobnie używasz 64-bitowego systemu, w którym katalog Program Files dla aplikacji 32-bitowych to Program Files (x86). W nawiasowanym bloku w pliku wsadowym nawias zamykający kończy blok, więc reszta linii powoduje błąd składni.

Istnieją dwa sposoby, aby to naprawić:

1) Umieść kompletny set argument w cudzysłowach. To powoduje, że paren zamykające nie może zostać uznane za koniec bloku:

if defined _OLD_VIRTUAL_PATH (
    set "PATH=%_OLD_VIRTUAL_PATH%" 
) 

2) Nie wolno używać blokady:

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% 
+0

Wow - Dziś nauczyłem się 2 rzeczy ... Byłem pewien, że ta składnia wysadzi się w powietrze, ale na pewno działa. Jednak nie jestem pewien, dlaczego byłaby potrzebna dla Evgeny - ustawienie zmiennej PATH ze spacjami nigdy nie było dla mnie problemem bez używania cytatów. Może "_OLD_VIRTUAL_PATH" Evgeny'ego ma jakąś inną specjalną postać (inną niż przestrzeń), która potrzebuje cytowania? –

+2

@Michael: To nie są przestrzenie, które są problemem. Przepisałem post (mam nadzieję, że Chris nie ma nic przeciwko, może on wycofać, jeśli to konieczne) i wyjaśnił, co jest nie tak i dlaczego. – Joey

+0

Dzięki Johannesowi, zapomniałem o przyczynie, ale to zdecydowanie ma sens. –

0

cóż - nigdy nie wiedział o operacji w skryptach cmd defined aż dopiero teraz ...

Twój scenariusz wydaje się działać dobrze dla mnie - która linia dokładnie produkuje ten błąd?

Można też spróbować:

if not "%_OLD_VIRTUAL_PATH%" == "" (
    set PATH=%_OLD_VIRTUAL_PATH% 
) 

I uwierz mi, jeśli idziesz do systemu Windows cmd skryptów spodziewałem się, że coś takiego jak to, co masz w bash, twoja głowa będzie bardzo dużo bólu, wkrótce. Możesz zajrzeć do innego języka skryptowego (PowerShell, Python, PERL - cokolwiek), jeśli skryptowanie cmd nie jest bezwzględnym wymogiem. Największą rzeczą (być może jedyną rzeczą), którą obsługuje skryptowanie cmd, jest to, że jest już zainstalowany na każdym polu Windows.

+0

istnieje „zdefiniowane” operator rozszerzenia poleceń - to działa linia OK. To linia 'set', która się nie powiedzie. – EMP

+0

Polecenie set działa dobrze dla mnie, nawet ze spacjami w '_OLD_VIRTUAL_PATH'. Czym dokładnie jest "_OLD_VIRTUAL_PATH"? Czy twój skrypt jest sformatowany dokładnie tak, jak masz go w pytaniu (cmd.exe może być bardzo wrażliwy na składnię, a nie zawsze w intuicyjny sposób). –

Powiązane problemy