ध्यान रखें कि PowerShell ऑब्जेक्ट्स को संभालता है और न केवल टेक्स्ट। सामान्य बैच फ़ाइलों में आप एक स्ट्रिंग के लिए एक चर सेट करें और फिर सकता है सिर्फ एक आदेश के रूप में उपयोग:
set Foo=dir /b
%Foo%
... इस PowerShell में काम नहीं करता।इस प्रकार $Start
का आपका कार्य पहले से ही नई प्रक्रिया बनाता है क्योंकि =
के बाद कमांड चलाया जाता है और इसका परिणाम $Start
पर दिया जाता है।
इसके अलावा आप चीजों को जटिलता से जटिल बना रहे हैं। मैं बजाय निम्नलिखित सुझाव चाहते हैं: एक वस्तु (जो $true
का मूल्यांकन)
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
Get-Process
के बाद रिटर्न या $null
(जो $false
का मूल्यांकन) आप ऊपर दिखाए गए तरह की जांच को आसान बनाने में कर सकते हैं। इसे टाइप कर्केशन कहा जाता है, क्योंकि if
कथन से बूलियन मान और $true
और $false
के रूप में माना जाएगा कि नियमों के ऊपर के मामलों में बहुत ही संगत हैं। और यह अच्छी तरह से पढ़ता है।
मैंने नई प्रक्रिया बनाने के लिए डब्लूएमआई के बजाय Start-Process
सेमीडलेट का भी उपयोग किया।
if (!$Running) { C:\utilities\prog.exe }
यदि आवेदन एक सांत्वना आवेदन नहीं है (और जब तक यह बाहर निकालता है PowerShell स्क्रिप्ट को ब्लॉक कर देगा इस प्रकार): तुम भी निम्न का उपयोग कर सकता है। पावरशेल अभी भी एक खोल है, इसलिए प्रोग्राम शुरू करना कुछ अच्छी तरह से काम करता है :-)
आप $running
वैरिएबल को भी इनलाइन कर सकते हैं, लेकिन मुझे लगता है कि आप जो भी करते हैं उसे स्पष्ट करने के लिए एक टिप्पणी होगी।
स्पष्ट व्याख्या के लिए ठीक है धन्यवाद। – Charlotte
मुझे नहीं पता कि आपका समाधान समस्या का समाधान कैसे करेगा। लाइन '$ प्रारंभ = ... 'हर बार प्रक्रिया शुरू कर देगी। मैं परीक्षण चला गया कोड और उसी प्रक्रिया के गुणक शुरू किया गया था। (एक प्रोग्राम के साथ परीक्षण करना सुनिश्चित करें जो स्वयं के कई उदाहरणों को अनुमति देता है) – LosManos
हाय @ लॉसमेनोस, क्या यह संभव है कि आप {} (scriptblock) भूल गए? –