পাওয়ারশেল অবজেক্টের উপস্থিতি আছে কিনা তা যাচাই করার সর্বোত্তম উপায়?


92

আমি কোনও কম অবজেক্টের উপস্থিতি আছে কিনা তা যাচাই করার জন্য সর্বোত্তম উপায়টি সন্ধান করছি।

আমার কাছে কোডটি এখানে রয়েছে; আমি শেষ লাইনটি উন্নত করতে চাই:

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

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

উত্তর:


115

আমি দিয়ে বিদ্ধ হবে $nullতুলনায় অন্যান্য মান যেহেতু চেক ''(খালি স্ট্রিং), 0, $falseএবং $nullচেক পাস হবে: if ($ie) {...}


4
যদি ($ ভাল) {... boo বুলিয়ানদের জন্য আরও ভাল হয় তবে অন্যান্য che টিওয়াই @ কিথ হিল
ইলিয়া গুরেঙ্কো


16

আপনার বিশেষ উদাহরণে সম্ভবত আপনাকে কোনও চেক করতে হবে না । এটা কি সম্ভব যে New-Objectপ্রত্যাবর্তন বাতিল? আমি কখনই দেখিনি। কোনও সমস্যার ক্ষেত্রে কমান্ডটি ব্যর্থ হওয়া উচিত এবং উদাহরণের বাকী কোডটি কার্যকর করা হবে না। তাহলে আমাদের কেন এই চেকগুলি করা উচিত?

কেবল নীচের কোডগুলিতে আমাদের কিছু চেক প্রয়োজন (ull n নলের সাথে স্পষ্ট তুলনা সেরা):

# 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) {
    ...
}

4
যদি COM অবজেক্ট প্রকারটি বিদ্যমান না থাকে তবে নিউ-অবজেক্ট একটি ব্যতিক্রম ছুঁড়ে দেবে। তবে আমি দেখতে পাচ্ছি না এটি কীভাবে শূন্য করতে পারে। এছাড়াও, ব্যতিক্রম উপেক্ষা করে কেবল তখন নাল পরীক্ষা করা খারাপ ফর্ম।
জেসনমারচার

@ জেসনমারচার: আমি শেষ মন্তব্যটির সাথে একমত, একেবারে তবে সত্যই, আপনি ডেমো উদাহরণে আমার কী লিখবেন বলে আশা করবেন? এছাড়াও, একটি দৃশ্যের উপর নির্ভর করে এমনকি এই কোডটিও ঠিক আছে fine
রোমান কুজমিন

মূলত, সমস্ত কোড ব্যবহার করে যা ব্যবহার করে $ অর্থাৎ চেষ্টা inside inside এর ভিতরে} ব্যতিক্রম হলে সেভাবে এড়িয়ে যায়।
জেসনমারেচার

4
তখন কোডটি কোনও কেস দেখাচ্ছে না যখন আমাদের ull null পরীক্ষা করতে হবে।
রোমান কুজমিন

11

এই সমস্ত উত্তরগুলি হাইলাইট করে না তা হ'ল কোনও মানকে ull নাল দিয়ে তুলনা করার সময়, আপনাকে বাম দিকে ull নাল রাখতে হবে, অন্যথায় সংগ্রহের ধরণের মানের সাথে তুলনা করার সময় আপনি সমস্যার মধ্যে পড়তে পারেন। দেখুন: https://github.com/nightroman/PowershellTraps/blob/master/ বেসিক / কম্পোরিশন- কপিরেটস-সহ- কালেকশনস / লুকস- Like-object-is-null.ps1

$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"
}

সুতরাং এই তুলনাগুলি সংগ্রহের সাথে কাজ করার জন্য বাম দিকে ull নাল রাখা গুরুত্বপূর্ণ:

$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 অপারেটরের সাথে টাইপ-চেক কোনও নাল মানের জন্য মিথ্যা প্রদান করে। বেশিরভাগ ক্ষেত্রে, সমস্ত না থাকলে, possible মান -is [সিস্টেম.অজেক্ট] যে কোনও সম্ভাব্য নন-মানের জন্য সত্য। (সব ক্ষেত্রে এটি কোনও নাল-মানের জন্য মিথ্যা হবে))

আমার মান কোনও জিনিস না হলে কিছুই নয়।


4
বা এমনকি $value -is [__ComObject]
ডেভ_জে


0

আপনি যদি আমার মত হয়ে থাকেন এবং আপনি এখানে পাওয়ার কথা বলার চেষ্টা করছেন যে আপনার পাওয়ারশেল পরিবর্তনশীলটি এই অস্তিত্বের নির্দিষ্ট গন্ধ নয়:

COM অবজেক্ট যা এর অন্তর্নিহিত আরসিডাব্লু থেকে পৃথক করা হয়েছে তা ব্যবহার করা যাবে না।

তারপরে এখানে এমন কিছু কোড রয়েছে যা আমার পক্ষে কাজ করেছে:

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)}

অন্যান্য লোকদের আরও ভাল উত্তর থেকে একসাথে ছড়িয়ে পড়ে:

এবং কিছু অন্যান্য দুর্দান্ত জিনিসগুলি জানতে:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.