यह जाँचने का सबसे अच्छा तरीका है कि पॉवरशेल ऑब्जेक्ट मौजूद है या नहीं?


90

मैं एक कॉम वस्तु मौजूद है या नहीं यह जांचने का सबसे अच्छा तरीका ढूंढ रहा हूं।

यहाँ कोड है जो मेरे पास है; मैं अंतिम पंक्ति में सुधार करना चाहता हूं:

$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("http://www.stackoverflow.com")
$ie.Visible = $true

$ie -ne $null #Are there better options?

जवाबों:


114

मैं $nullकिसी भी मान ''(खाली स्ट्रिंग) के अलावा चेक से चिपक जाता 0, $falseऔर $nullचेक पास कर देता if ($ie) {...}:।


1
यदि ($ वैल) {...} का उपयोग करना बूलियंस के लिए बेहतर है तो अन्य सभी जांचें होनी चाहिए यदि ($ वैल-एन $ null) {..} खुद का परीक्षण किया। टीआई @ कीथ हिल
इल्या गुरेंको

65

आप भी कर सकते हैं

if ($ie) {
    # Do Something if $ie is not null
}

4
मुझे यह विकल्प और इसकी उपेक्षा पसंद हैif (-not $ie) { # Do something if $ie doesn't exist/is falsey }
क्रिस मैग्नसन

16

अपने विशेष उदाहरण में, शायद आपको किसी भी जाँच को करने की आवश्यकता नहीं है । क्या यह संभव है कि New-Objectवापसी अशक्त हो? मैंने ऐसा कभी नहीं देखा। किसी समस्या के मामले में कमांड को विफल होना चाहिए और उदाहरण के बाकी कोड को निष्पादित नहीं किया जाएगा। तो हम ऐसा क्यों करें?

केवल नीचे दिए गए कोड की तरह हमें भी कुछ चेक चाहिए ($ null के साथ स्पष्ट तुलना सबसे अच्छी है):

# we just try to get a new object
$ie = $null
try {
    $ie = New-Object -ComObject InternetExplorer.Application
}
catch {
    Write-Warning $_
}

# check and continuation
if ($ie -ne $null) {
    ...
}

1
यदि COM ऑब्जेक्ट प्रकार मौजूद नहीं है, तो नया ऑब्जेक्ट एक अपवाद फेंक देगा। लेकिन मैं यह नहीं देखता कि यह अशक्त कैसे लौट सकता है। इसके अलावा, केवल अपवाद को नजरअंदाज करने के लिए अशक्तता के लिए परीक्षण खराब रूप है।
जेसनमर्चर

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

अनिवार्य रूप से, सभी कोड जो $ का उपयोग करते हैं, कोशिश के अंदर {}। अगर अपवाद है तो इस तरह से यह छोड़ दिया जाता है।
जेसनमाकर

2
तब यह एक मामला नहीं दिखाएगा जब हमें $ null के लिए जाँच करने की आवश्यकता होगी।
रोमन कुजमिन

10

इन सभी जवाबों पर प्रकाश नहीं डाला गया है, जब किसी मूल्य की $ null से तुलना करते हैं, तो आपको $ null को बाएं हाथ की ओर रखना होगा, अन्यथा संग्रह-प्रकार के मूल्य के साथ तुलना करने पर आप परेशानी में पड़ सकते हैं। देखें: https://github.com/nightroman/PowerShellTraps/blob/master/Basic/Comparison-operators-with-collections/looks-like-object-is-null_s1

$value = @(1, $null, 2, $null)
if ($value -eq $null) {
    Write-Host "$value is $null"
}

उपरोक्त ब्लॉक (दुर्भाग्य से) निष्पादित किया गया है। और भी दिलचस्प बात यह है कि पॉवर्सशेल में एक $ मूल्य $ $ शून्य और शून्य नहीं दोनों हो सकता है:

$value = @(1, $null, 2, $null)
if (($value -eq $null) -and ($value -ne $null)) {
    Write-Host "$value is both $null and not $null"
}

इसलिए संग्रह के साथ इन तुलनाओं को काम करने के लिए बाईं ओर $ null रखना महत्वपूर्ण है:

$value = @(1, $null, 2, $null)
if (($null -eq $value) -and ($null -ne $value)) {
    Write-Host "$value is both $null and not $null"
}

मुझे लगता है कि यह शो फिर से पॉवरशेल की शक्ति है!


आश्चर्य की बात है कि यह उत्तर अधिक नहीं है क्योंकि इसमें बाएं हाथ की ओर महत्वपूर्ण विवरण है$null
sonyisda1

1

किसी भी शून्य मान के लिए -is ऑपरेटर के साथ टाइप-चेक गलत हो जाता है। ज्यादातर मामलों में, यदि सभी नहीं, तो $ value -is [System.Object] किसी भी गैर-अशक्त मूल्य के लिए सही होगा। (सभी मामलों में, यह किसी भी अशक्त-मूल्य के लिए गलत होगा।)

वस्तु नहीं तो मेरा मूल्य कुछ भी नहीं है।


1
या यहां तक ​​कि $value -is [__ComObject]
डेवज जे


0

समझें कि आप मेरे जैसे हैं और आप यह बताने के लिए एक तरीका खोजने की कोशिश कर रहे हैं कि क्या आपका पॉवरशेल वैरिएबल गैर-मौजूद है:

COM ऑब्जेक्ट जिसे उसके अंतर्निहित RCW से अलग किया गया है, उसका उपयोग नहीं किया जा सकता है।

फिर यहाँ कुछ कोड है कि मेरे लिए काम किया है:

function Count-RCW([__ComObject]$ComObj){
   try{$iuk = [System.Runtime.InteropServices.Marshal]::GetIUnknownForObject($ComObj)}
   catch{return 0}
   return [System.Runtime.InteropServices.Marshal]::Release($iuk)-1
}

उदाहरण का उपयोग:

if((Count-RCW $ExcelApp) -gt 0){[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($ExcelApp)}

अन्य लोगों के बेहतर जवाब से एक साथ मैश्ड:

और कुछ और अच्छी बातें जानने के लिए:

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