खिड़कियों में रिक्त स्थान और कोष्ठक बैच फ़ाइलों को पैठ चर शिकंजा


14

इसलिए, मेरा पथ चर (सिस्टम-> सामान्य सेटिंग्स-> एनवी वर्षा-> सिस्टम-> पथ) के लिए सेट है:

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;

हालांकि, जाहिर है, newlines के बिना।

उन पंक्तियों पर ध्यान दें जिनमें PathWithSpaces- पहले के पास कोई स्थान नहीं है, दूसरे के पास एक स्थान है, और तीसरे में एक कोष्ठक के बाद का स्थान है।

अब, इस बैच फ़ाइल के आउटपुट पर ध्यान दें:

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 है

यहाँ क्या चल रहा है? मैं इसे कैसे ठीक करूं? मैं शायद अपने उपकरणों को वर्कअराउंड के रूप में काम करने देने के लिए एक जंक्शन बिंदु का सहारा लूंगा, लेकिन अगर आपके पास इस पर कोई जानकारी है, तो कृपया मुझे धन्यवाद दें ...


हाथ में मुद्दों की मेरी समझ के आधार पर, उपरोक्त उत्तर सही है, और यह इस बात पर ध्यान देने पर निर्भर करता है कि SET कमांड है, और PATH इसके तर्क का हिस्सा है, जिसका संतुलन नया PATH स्ट्रिंग है। तो, IMO, ऐसा नहीं है कि यह काफी हद तक प्रलेखित है, लेकिन यह एक अस्पष्ट किनारे के मामले की तरह है। मैंने अभी इस मुद्दे पर कुछ घंटे बिताए हैं।
डेविड ए। ग्रे

जवाबों:


14

यह तब हो सकता है जब एक "ब्लॉक" (जो परिसीमन के लिए कोष्ठक का उपयोग भी करता है) के अंदर एक पंक्ति में बिना बचे हुए कोष्ठक हैं।

आप आमतौर पर विलंबित विस्तार को चालू करके इसे ठीक कर सकते हैं और !var!इसके बजाय चर का उपयोग कर सकते हैं %var%। कोड को देखे बिना मैं और अधिक सलाह नहीं दे सकता।


19

64-बिट सिस्टम पर विंडोज उपयोगकर्ताओं के लिए ध्यान दें

प्रोग्रा ~ 1 = 'प्रोग्राम फाइल्स' प्रोग्रा ~ 2 = 'प्रोग्राम फाइल्स (x86)'

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


1
विंडोज पर MSYS का उपयोग करते समय $ PATH पर्यावरण चर में रिक्त स्थान से छुटकारा पाने के लिए बहुत उपयोगी है। जब तक मैंने यह बदलाव नहीं किया तब तक ऑटोकॉनफ अच्छा नहीं खेल रहा था।
माइक

13

वहाँ या तो (क) चाहिए नहीं MS-विंडोज पथ पर्यावरण चर में किसी भी उद्धरण हो (पथ आदेश) या (ख) वहाँ निम्नलिखित पूरे अभिव्यक्ति आसपास उद्धरण होना चाहिए (सेट कमांड) । दुर्भाग्य से, यह एमएस द्वारा बहुत अच्छी तरह से प्रलेखित नहीं है, हालांकि वे कहते हैं कि यदि उद्धरणों का उपयोग किया जाता है, तो वे चर (विंडोज एक्सपी कमांड लाइन संदर्भ) के मूल्य में शामिल होंगे ।

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

यह ऐसी समस्याएं पैदा कर सकता है जो असंगत हैं और इसलिए निदान करना मुश्किल है। उदाहरण के लिए यदि आपके पथ में "C: \ Python27" शामिल है, तो आपकी मशीन कहेगी "" अजगर "को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी गई है।" जब आप अजगर को अंजाम देने की कोशिश करते हैं। हालाँकि कुछ पुस्तकालय अभी भी उपलब्ध हो सकते हैं

आपको रिक्त स्थान या कोष्ठक से "भागने" की आवश्यकता नहीं है। यदि आपको विशेष वर्णों से बचने की आवश्यकता है, तो चर नाम सहित संपूर्ण अभिव्यक्ति के आसपास उद्धरण डालें।

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-DOS तब लिखा था जब आपका मतलब MS-Windows था, और आपके आदेश MS-Windows के लिए थे। ओपी ने एमएस-विंडोज के बारे में पूछा। तो आप इसे MS-DOS क्यों कह रहे हैं मैं नहीं जानता। यहां तक ​​कि आपके लिंक ने कहा कि NT (वह है - विंडोज। यह 9X और NT हुआ करता था, अब यह केवल NT है)। विंडोज और एमएस-डॉस दो अलग-अलग ऑपरेटिंग सिस्टम हैं। मैंने देखा है कि विंडोज़ कमांड प्रॉम्प्ट को पहले गलती से डॉस कहा जाता है, लेकिन यह भी उतना गलत नहीं है जितना आपने इसे कहा था।
बार्लोप

@barlop, बेशक आप सही हैं। संपादन के लिए धन्यवाद। विंडोज -95 तक, विंडोज डॉस के शीर्ष पर बनाया गया एक एप्लिकेशन था। आप winडॉस में कमांड टाइप करके विंडोज शुरू कर सकते हैं । विंडोज-3.1 से पहले वास्तव में, ज़ोर्क और वर्डस्टार जैसे सब कुछ डॉस एप्लिकेशन थे। तब विंडोज -98 के साथ शुरू करना, कोई डॉस नहीं था। लेकिन मुझे लगता है कि मेरे जैसे कुछ पुराने टाइमर अभी भी सीएमडी शेल को गलती से डॉस शेल के रूप में संदर्भित करते हैं। भ्रम के लिए खेद है, और मेरे उत्तर के इरादे को स्पष्ट करने के लिए फिर से धन्यवाद।
मार्क मिकोफ्की

@MarkMikofski असल में विंडोज 9X (95/98 / ME) यकीनन DOS पर भी बनाया गया था। आप उदाहरण के लिए कुछ फ़ाइल (शायद msdos.sys) को बूटगीयू = 0 जैसे कुछ विकल्प (ओं) को संपादित कर सकते हैं और tokyopc.org/newsletter/1996/08/msdosed.html लोड हो रही विंडोज़ को रोक सकते हैं। क्या आप तब वहाँ से विंडोज़ लोड कर सकते हैं जो मैं नहीं करता ' पता नहीं और एक Win9X बूट डिस्क को डॉस माना जाता है। पुराने टाइमर जो जानते हैं कि वे आपके बारे में क्या बात कर रहे हैं, आमतौर पर विंडोज़ कमांड प्रॉम्प्ट डॉस को कॉल करने की गलती करने वाले अंतिम लोग हैं। और सबसे पहले लोग सबसे ज्यादा अडिग हैं कि यह डॉस नहीं है।
बार्लोप

1
क्या आपने सलाह देने की कोशिश की(SET PATH=%PATH%;C:\Program Files (x86)\path with special characters) ? यह पूरी तरह से गलत है!
जोसेफज

2

Microsoft समस्या को " कमांड रन स्क्रिप्ट्स को चलाने में त्रुटि को शामिल करता है जिसमें कोष्ठक शामिल हैं "।

उनके द्वारा सुझाया गया समाधान विलंबित विस्तार का उपयोग करना है।

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

उपयोग करने के बजाए, यदि एक ब्लॉक में पथ सेट करने के लिए 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"

1

जॉय अपने जवाब में कहते हैं

यह तब हो सकता है जब एक "ब्लॉक" (जो परिसीमन के लिए कोष्ठक का उपयोग भी करता है) के अंदर एक पंक्ति में बिना बचे हुए कोष्ठक हैं।

और यह सच है। अगर वहाँ एक कोष्ठक हैं, अच्छी तरह से बच जाना चाहिए। वही मैंने किया; मैंने प्रतिस्थापित कर दिया

set PATH=some_path;%PATH%

साथ में

set PATH="some_path;%PATH%"

और इससे समस्या हल हो गई।


2
नहीं। आप का उपयोग करना चाहिएset "PATH=some_path;%PATH%"
जोसेफज

1

मैंने कुछ ऐसा ही अनुभव किया है। Microsoft यहां समस्या की व्याख्या करता है: http://support.microsoft.com/kb/329308

मूल रूप से, सिस्टम के माध्यम से पथ चर को बदलने के बजाय-> सामान्य सेटिंग्स-> Env Vars-> सिस्टम-> पेटीएम, कोशिश करें

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

1

विंडोज 8 में मैंने इनमें से किसी भी विधि के साथ बहुत कम सफलता पाई है। कोष्ठक काम नहीं करते हैं, उद्धरण काम करते हैं, लेकिन "पथ" आप इस तरीके को संशोधित करते हैं वह पथ नहीं है जो निष्पादन योग्य लोगों को खोजने के लिए उपयोग किया जाता है, इसके बजाय cmdअभी भी सिस्टम पथ का उपयोग करना प्रतीत होता है जब आप विंडो खोलते हैं।

उदाहरण: प्रोसेसर आर्किटेक्चर का निर्धारण करने के बाद, मैं पाथ पर्यावरण चर में कुछ मार्गों को जोड़ना चाहता हूं। वास्तव में, यहां तक ​​कि सिर्फ उन्हें जोड़ना अस्थायी रूप से काम करेगा क्योंकि मुझे केवल उनकी ज़रूरत है जबकि एक बैच फ़ाइल चल रही है। लेकिन वह भी काम नहीं करता है।

echo %path%cmdलॉन्च होने के समय सिस्टम PATH प्रदर्शित करता है ।

set path="%path%;%programfiles(x86)%\company\program\subdir"काम करता है, लेकिन अब %path%सब कुछ उद्धरण से घिरा हुआ है, और अगर मैं सबडिअर में कहीं और से एक कार्यक्रम चलाने की कोशिश करता हूं, तो यह विफल हो जाता है। कोट्स की बजाय पूरी चीज़ के आसपास कोष्ठक का उपयोग करने से काम नहीं चलता है

एक और बात जिस पर मैंने गौर किया है वह यह है कि एक ही कमांड काम करेगा यदि अंतःक्रियात्मक रूप से प्रवेश किया जाए cmd, लेकिन यदि बैच फ़ाइल में सामना नहीं हुआ है। यह भयावह है। फिर भी एक और विषमता एक पर्यावरण चर के मूल्य के अंतिम चरित्र का आंतरायिक नुकसान है! एक अन्य विसंगति तीसरे पक्ष के कार्यक्रमों के साथ है: कुछ %var%एक पैरामीटर के रूप में संभाल सकते हैं , अन्य नहीं।


1

Win8 में निम्नलिखित कार्य करने में मुझे बहुत परेशानी हुई जब तक कि मैंने डबल-कोट्स को जोड़ नहीं दिया, जो कि मैं वैरिएबल वैरिएबल पर सेट कर रहा था। उस के साथ, जब fromFile में कोष्ठक के साथ एक फ़ाइल नाम होता है, तो अगली पंक्ति जो कि toFile वैरिएबल उत्पन्न करने के लिए स्ट्रिंग प्रतिस्थापन करने की कोशिश कर रही थी, विफल रही थी। ध्यान दें कि मैं पार्सिंग समय (संबंधित कॉल उदाहरण) के बजाय निष्पादन समय पर चर का मूल्यांकन करने के लिए विलंबित विस्तार का उपयोग करता हूं

::-- 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.