2008-12-06 14 views
34

में 32 बिट "प्रोग्राम फ़ाइलें" निर्देशिका का उपयोग करें विंडोज़ के 64 बिट संस्करणों में, 32 बिट सॉफ़्टवेयर "c: \ प्रोग्राम फ़ाइलों (x86)" में स्थापित है। इसका मतलब है कि आप पथ (32 बिट) सॉफ़्टवेयर प्राप्त करने के लिए $ (प्रोग्रामफाइल) का उपयोग नहीं कर सकते हैं। तो मुझे अपने एमएसबिल्ड परियोजना में इसे दूर करने के लिए $ (ProgramFiles32) की आवश्यकता है। मैं ओएस के आधार पर प्रोजेक्ट को बदलना नहीं चाहता हूं।msbuild

मेरे पास एक समाधान है जिसे मैं पोस्ट करूंगा, लेकिन शायद एक आसान/बेहतर तरीका है।

+0

बहुत से उत्तरों को थोड़ा सा नाइटपीकी मिल रही है कि क्या दिया गया उत्तर .NET 2.0 और 4.0 पर काम करेगा - लेकिन मैं इसे प्रश्न में नहीं देख रहा हूं - शायद आप हमें बता सकते हैं कि किस संस्करण (ओं) .NET आप लक्षित करने की योजना बना रहे हैं? – BrainSlugs83

+0

@ BrainSlugs83 इस प्रश्न को 2008 में पूछा गया था जब .NET 4.0 अभी तक मौजूद नहीं था। लेकिन आम तौर पर, मैं हमेशा एक समाधान पसंद करता हूं जो संस्करण को स्विच करते समय परिवर्तन करने से बचने के लिए किसी भी संस्करण में काम करता है। स्वीकृत उत्तर बताता है कि नए एमएसबिल्ड संस्करणों में क्या उपयोग करना है, बल्कि पुराने संस्करणों के लिए एक समाधान भी प्रदान करता है जो नए संस्करण में भी काम करता है। इसलिए मुझे अपने प्रश्न को एक विशिष्ट संस्करण में सीमित करने का बिंदु नहीं दिख रहा है। – wimh

उत्तर

38

MSBuild 4.0+ में, वहाँ इसके लिए a $(MSBuildProgramFiles32) property है, जो आप आत्मविश्वास से सीधे उपयोग कर सकते हैं (खासकर यदि आप फ़ाइल के शीर्ष पर एक ToolsVersion="4.0" डाल करने के लिए गारंटी करने के लिए यह उपलब्ध है और Fail Fast होने वाला है अगर यह नहीं है तैयार हैं) ।

आप नहीं कर रहे हैं और कुछ है कि सही काम करते हैं कर सकते हैं यहां तक ​​कि जब एक MSBuild 2.0 या बाद के वातावरण में निष्पादित की जरूरत है (यानी, वापस 2005 वातावरण के लिए), पूर्ण समाधान है:

<PropertyGroup> 
    <!--MSBuild 4.0 property--> 
    <ProgramFiles32>$(MSBuildProgramFiles32)</ProgramFiles32> 
    <!--Use OS env var as a fallback:- 32 bit MSBuild 2.0/3.5 on x64 will use this--> 
    <ProgramFiles32 Condition=" '' == '$(ProgramFiles32)'">$(ProgramFiles%28x86%29)</ProgramFiles32> 

    <!-- Handle MSBuild 2.0/3.5 running in 64 bit mode - neither of the above env vars are available. http://stackoverflow.com/questions/336633 
     NB this trick (Adding a literal " (x86)" to the 64 bit Program Files path) may or may not work on all versions/locales of Windows --> 
    <ProgramFiles32 Condition ="'$(ProgramFiles32)'=='' AND 'AMD64' == '$(PROCESSOR_ARCHITECTURE)'">$(ProgramFiles) (x86)</ProgramFiles32> 

    <!--Catch-all - handles .NET 2.0/3.5 non-AMD64 and .NET 2.0 on x86 --> 
    <ProgramFiles32 Condition=" '' == '$(ProgramFiles32)' ">$(ProgramFiles)</ProgramFiles32> 
</PropertyGroup> 

दुर्भाग्यवश Progressive enhancement/polyfill नाम MSBuildProgramFiles32 का ओवरराइडिंग <PropertyGroup> या <CreateProperty> के माध्यम से MSBuild 4.0+ द्वारा अस्वीकार कर दिया गया है, इसलिए इसे साफ नहीं किया जा सकता है और अभी भी .NET 2.0 का समर्थन नहीं किया जा सकता है।

+1

प्रगतिशील वृद्धि मुझे एमएसबिल्ड 4 पर त्रुटि देता है: त्रुटि एमएसबी 4004: "एमएसबील्डप्रोग्रामफाइल 32" संपत्ति आरक्षित है, और संशोधित नहीं किया जा सकता है। – Wernight

+0

@ वॉर्नटाइट कैच के लिए धन्यवाद - प्रगतिशील वृद्धि सामग्री को हटा दिया। अगर आपकी टिप्पणी गायब हो जाती है, तो मैं अंततः इसे हटाने के लिए मिल जाऊंगा! –

16

मेरा समाधान यह देखना है कि "c: \ प्रोग्राम फ़ाइलें (x86)" मौजूद है, यदि यह मौजूद है, तो यह 64 बिट ओएस है। अन्यथा सामान्य प्रोग्राम फ़ाइलों निर्देशिका का उपयोग:

<PropertyGroup> 
    <ProgramFiles32 Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)</ProgramFiles32> 
    <ProgramFiles32 Condition="$(ProgramFiles32) == ''">$(PROGRAMFILES)</ProgramFiles32> 
</PropertyGroup> 

मैं इसे इस

<Exec WorkingDirectory="src\app1" Command='"$(ProgramFiles32)\doxygen\bin\doxygen" Doxyfile' /> 
+5

यह विंडोज के गैर-अंग्रेजी संस्करणों पर बहुत ही टूट जाएगा, क्योंकि प्रोग्राम फ़ाइलों को हमेशा प्रोग्राम फाइल नहीं कहा जाता है। – jalf

+1

मुझे लगता है कि किसी भी भाषा में प्रोग्राम फाइल निर्देशिका में पर्यावरण परिवर्तनीय% प्रोग्रामफाइल% अंक। और कम से कम जर्मन में 32 बिट संस्करण केवल "(x86)" जोड़ता है: http://www.tipps-fuer-windows-vista.de/img/Navigation/Navi1.gif हालांकि जापानी के बारे में पता नहीं है। – wimh

+3

आपको% ProgramFiles (x86)% नामक एक पर्यावरण चर की जांच करने की आवश्यकता है। यदि यह मौजूद है, तो आप 64-बिट ओएस पर हैं, और यही वह मार्ग है जिसे आप चाहते हैं। यदि यह अस्तित्व में नहीं है, तो% ProgramFiles% द्वारा निर्दिष्ट पथ का उपयोग करें। – RobH

4

मुझे लगता है कि एक slighly अधिक विश्वसनीय तरीका पर्यावरण चर "ProgramFiles (x86)" हड़पने के लिए है की तरह उपयोग कर सकते हैं। विंडोज़ पर 64 बिट प्रक्रिया में यह 32 बिट प्रोग्राम फाइल निर्देशिका को इंगित करेगा। यह विंडोज़ के 32 बिट संस्करण पर खाली होगा और मैं मानता हूं एक वाह 64 प्रक्रिया

मैं कुछ पावरशेल स्क्रिप्ट के साथ हाल ही में एक ही समस्या में भाग गया। मैंने एक ब्लॉग एंट्री लिखा है कि कार्यक्रम फाइल निर्देशिका समस्या के आसपास कैसे काम किया। स्पष्ट रूप से अलग भाषा लेकिन यह आपकी मदद कर सकती है।

http://blogs.msdn.com/jaredpar/archive/2008/10/21/program-files-i-just-want-the-32-bit-version.aspx

+0

ने कोशिश की, लेकिन यह काम नहीं करता है। "$ (प्रोग्राम (x86))" मूल्यांकन करता है ")"। तो ऐसा लगता है कि एमएसबिल्ड में पर्यावरण चर का उपयोग करने में संभव नहीं है जिसमें ')' वर्ण शामिल है। मैंने पर्यावरण में कुछ और नहीं देखा जिसे इसके बजाए इस्तेमाल किया जा सकता है। – wimh

+0

क्या आप से बचने की कोशिश की थी (है? मैं एक भारी msbuild उपयोगकर्ता नहीं हूं इसलिए मुझे नहीं पता कि यह संभव है या नहीं – JaredPar

+0

बैकस्लैश या सिंगल कोट्स से बचने से काम नहीं किया। लेकिन मैं भी भारी नहीं हूं msbuild उपयोगकर्ता। शायद बचने के लिए एक नया प्रश्न पूछना चाहिए ... – wimh

8

"$(MSBuildExtensionsPath32)\.."

+0

डबल डॉट से पहले एक स्लैश होने का मतलब था। शायद मैं गलत टाइप किया गया या वेब पेज इसे खा लिया। –

+0

स्लैश के साथ यह ठीक काम करता है। और यह मेरे समाधान से साफ दिखता है। इस प्रकार मैंने इसका इस्तेमाल किया: $ (MSBuildExtensionsPath32) \ .. wimh

+0

-1 यह दृष्टिकोण कुछ भी नहीं जोड़ता है। यदि MSBuildExtensionsPath32 उपलब्ध है, तो MSBuildProgramFiles32 भी उपलब्ध होगा। (परीक्षण किया गया - यह निश्चित रूप से एफडब्लू 2 एमएसबिल्ड (इंक 3.5 के टूलवर्सन को निर्दिष्ट करते समय) पर समर्थित नहीं है, इसके बावजूद [इस पोस्ट] (http://www.sedodream.com/PermaLink ,guid,7e11f92e-e778-4e69-9441- 9a6be3512e71.aspx) सुझाव देता है) –

1

मैं देखना MSBuild में एक सामान्य तरीके खोजने की कोशिश कर इस सवाल भर में ठोकर खाई है अगर यह एक 32- या 64-बिट ओएस था की कोशिश करो।

<PropertyGroup> 
    <OSBits Condition="$(ProgramW6432) != ''">x64</OSBits> 
    <OSBits Condition="$(OSBits) == ''">x32</OSBits> 
</PropertyGroup> 

जाहिर %ProgramW6432% केवल 64-बिट सिस्टम पर सेट है: में किसी और मामले में किसी को भी इस मिल जाए, मैं निम्नलिखित का इस्तेमाल किया।

+1

का उपयोग कर रहे हैं तो प्रश्न पूछें [शीर्ष-स्तरीय प्रश्न के रूप में] और इसे स्वयं उत्तर दें - इसे आम तौर पर एक अच्छी बात के रूप में स्वीकार किया जाता है –

+0

कड़ा नियंत्रण –

+0

के लिए 'PROCESSOR_ARCHITECTURE' (उदाहरण के लिए,' AMD64') चर भी हो सकता है हाँ ओपी का प्रश्न केवल $ (ProgramW6432) के साथ हल किया जा सकता है। मैं अनुमान लगा रहा हूं कि ओपी ने सवाल पोस्ट करते समय इस चर का अस्तित्व नहीं था। – smead

10

एमएसबिल्ड 4.0, $(MSBuildProgramFiles32) में आपको 32-बिट प्रोग्राम फ़ाइलें निर्देशिका प्रदान की जाएगी।

+0

+1 लिखा था [मेरा जवाब] (http: // stackoverflow।कॉम/प्रश्न/346175/उपयोग -32 बिट-प्रोग्राम-फाइल-निर्देशिका-इन-एमएसबिल्ड/5650767 # 5650767) इससे पहले कि मैंने ऐसा देखा, उम्मीद है कि नकल पर कोई अपराध नहीं किया गया है (उदाहरण @ जेरेडपायर के उत्तर पर मेरी टिप्पणी को समझाने के लिए कार्य करता है) –

+0

@ रुबेन-बार्टेलिंक, मुझे आपके उत्तर में उल्लिखित फॉलबैक पसंद है। इसलिए मैंने इसे स्वीकार किए गए उत्तर के रूप में चुना। – wimh

1

आप दृश्य स्टूडियो उपकरणों के 32-बिट संस्करण चला रहे हैं $ (ProgramFiles) अंक, (विशेष रूप से VS2012 में, 3 अलग आदेश की तरह का संकेत देता है कि आप में से चुन सकते हैं) के लिए "प्रोग्राम फ़ाइलें (x86)"