পাওয়ারশেলের মুদ্রণ অবজেক্টের বৈশিষ্ট্য


119

ইন্টারেক্টিভ কনসোলে কাজ করার সময় যদি আমি কোনও নতুন অবজেক্ট সংজ্ঞায়িত করি এবং এর জন্য কিছু সম্পত্তি মান নির্ধারণ করি:

$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"

তারপরে আমি যখন আমার পরিবর্তনশীলটির নামটি ইন্টারেক্টিভ উইন্ডোতে টাইপ করি তখন পাওয়ারশেল আমাকে বস্তুর বৈশিষ্ট্য এবং মানগুলির সংক্ষিপ্তসার দেয়:

PS C:\demo> $obj
SomeProperty                                                                                                                                                                                  
------------                                                                                                                                                                                  
Test

আমি মূলত এটি করতে চাই তবে একটি স্ক্রিপ্টের একটি ফাংশন থেকে। ফাংশনটি একটি অবজেক্ট তৈরি করে এবং কিছু সম্পত্তি মান সেট করে এবং আমি এটি ফিরে আসার আগে পাওয়ারশেল উইন্ডোতে অবজেক্ট মানের মানগুলির একটি সংক্ষিপ্তকরণ প্রিন্ট করতে চাই। আমি ফাংশনটির মধ্যে লিখিত-হোস্টটি ব্যবহার করার চেষ্টা করেছি:

Write-Host $obj

তবে এটি কেবলমাত্র আউটপুটটির প্রকারের সারাংশ দেয় না:

System.Object

আমি কীভাবে আমার ফাংশন আউটপুটটিতে পাওয়ার শেল উইন্ডোটিতে অবজেক্টটির সম্পত্তির মানগুলির সংক্ষিপ্তসার পেতে পারি?

উত্তর:


186

এটা চেষ্টা কর:

Write-Host ($obj | Format-Table | Out-String)

অথবা

Write-Host ($obj | Format-List | Out-String)

4
-Forceএটিকে কাজ করার জন্য আমাকে প্যারামিটারটি পাস করতে হয়েছিল, যেমনWrite-Host ($obj | Format-List -Force | Out-String)
বার্ট ভেরকোইজেন

1
ইসস! এটি এখনও স্ক্রিনে অনুভূমিকভাবে প্রদর্শিত হবে .... যদি কোনও আউটপুট আপনার বাফারের বাইরে চলে যায় তবে এটি কেবল রাখে ...। POSH- এর সাথে আমার একটি ভালোবাসার ঘৃণা রয়েছে
কলব ক্যানিয়ন

ব্যবহার $objs = @();এবং $objs = $objs + $obj; আমি ব্যবহার করতে পারি ConvertTo-Html: $ কলস = $ আপত্তি | কনভার্টটো-এইচটিএমএল -ফ্র্যাগমেন্ট-প্রপার্টি নাম, ডেটাটাইপ, ডিফল্ট, পরিচয়, ইনপ্রাইমারিকি, ইসফোরেইনকি, বর্ণনা;
কিকিনেট


16

পাওয়ারশেলে অবজেক্টের বৈশিষ্ট্য এবং মানগুলি মুদ্রণ করতে। নীচে উদাহরণ আমার জন্য ভাল কাজ করে।

$ পুল = গেম-আইটেম "আইআইএস: \ অ্যাপপুলগুলি N নেট ভি 4.5"

$ পুল | পান-সদস্য

   TypeName: Microsoft.IIs.PowerShell.Framework.ConfigurationElement#system.applicationHost/applicationPools#add

Name                        MemberType            Definition
----                        ----------            ----------
Recycle                     CodeMethod            void Recycle()
Start                       CodeMethod            void Start()
Stop                        CodeMethod            void Stop()
applicationPoolSid          CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
state                       CodeProperty          Microsoft.IIs.PowerShell.Framework.CodeProperty
ClearLocalData              Method                void ClearLocalData()
Copy                        Method                void Copy(Microsoft.IIs.PowerShell.Framework.ConfigurationElement ...
Delete                      Method                void Delete()
...

$ পুল | নির্বাচন-অবজেক্ট-প্রপার্টি * # আপনি -প্রপার্টি বাদ দিতে পারেন

name                        : .NET v4.5
queueLength                 : 1000
autoStart                   : True
enable32BitAppOnWin64       : False
managedRuntimeVersion       : v4.0
managedRuntimeLoader        : webengine4.dll
enableConfigurationOverride : True
managedPipelineMode         : Integrated
CLRConfigFile               :
passAnonymousToken          : True
startMode                   : OnDemand
state                       : Started
applicationPoolSid          : S-1-5-82-271721585-897601226-2024613209-625570482-296978595
processModel                : Microsoft.IIs.PowerShell.Framework.ConfigurationElement
...

1
এর শেষ রূপটি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে - এটি সংক্ষিপ্তও করতে পারে $x | select *, ইন্টারেক্টিভের জন্য দুর্দান্ত।
42

কোনও স্ক্রিপ্টে রাখতে চাইলে এটি কাজ করে বলে আমি মনে করি না। যদি তা হয়, তবে আমি মনে করি যে এটিতে কনসোলটিতে মুদ্রণ করতে যা যা বলা হয়েছে তার থেকে আপনাকে অতিরিক্ত কিছু করতে হবে (যেমন: লিখন-আউটপুট <
ফ্র্যাক্টাল

11

টিপ # 1

লিখন-হোস্ট কখনও ব্যবহার করবেন না।

টিপ # 12

পাওয়ারশেল সেমিডলেট বা ফাংশন থেকে তথ্য আউটপুট দেওয়ার সঠিক উপায় হ'ল আপনার ডেটা যুক্ত কোনও বস্তু তৈরি করা এবং তারপরে রাইট-আউটপুট ব্যবহার করে পাইপলাইনে সেই অবজেক্টটি লেখা।

-ডন জোন্স: পাওয়ারশেল মাস্টার

আদর্শভাবে আপনার স্ক্রিপ্টটি আপনার বস্তুগুলি তৈরি করবে ( $obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}) তবে কেবল একটি করুন Write-Output $objects। আপনি আউটপুট পাইপ হবে Format-Table

PS C:\> Run-MyScript.ps1 | Format-Table

তাদের সত্যই পাওয়ারশেল পাওয়ারঅবজেক্ট এবং পাইপিংহেলকে কল করা উচিত।


4
ধন্যবাদ বব, আমি মজলিনারের উত্তর মেনে নিয়েছি কারণ আমি মনে করি যে এটি প্রশ্নের সরাসরি উত্তর দেয়, তবে আপনি যে লিঙ্কগুলি সরবরাহ করেছেন সেগুলি থেকে আমি অনেক কিছু শিখেছি এবং একমত যে বেশিরভাগ ক্ষেত্রে লিখিত-হোস্ট উপযুক্ত নয় not ধন্যবাদ!
জন

1
একই কৌশলটি কাজ করবে এবং সম্ভবত রাইট-ভারবোজ বা রাইট-ডিবাগের সাথে আরও বেশি ব্যবহৃত হবে।
mjolinor

4
আমি জানি, আমি অনেক বছর দেরি করেছি, তবে Never use Write-Host.বিবৃতি সম্পর্কে আমি একমত নই । ডেটা ফেরত ফাংশনগুলির ভিতরে আপনি লিখন-আউটপুট ব্যবহার করতে পারবেন না কারণ এটি এই ফাংশনটিকে "দূষিত" করবে। সহজ উদাহরণ। অনুমান করুন কী রিটার্নটেক্সট ফাংশন আউটপুট দেবে? এই কারণেই আমি সর্বদা রচনা-হোস্টের ভিতরে ফাংশন ব্যবহার করি। ফাংশন রিটারটেক্সট () {লিখন-আউটপুট "কিছু এলোমেলো বার্তা" ফেরত "আমি কী ফিরিয়ে দিতে চাই"}
ডেনিস মোলাদત્সভ

3
@ ডেনিসমলডটসভ আমি সম্পূর্ণ একমত লগিংয়ের তথ্যের উদ্দেশ্যে লেখার আউটপুট কখনও ব্যবহার করা উচিত নয় যদি না ফাংশনটি তুচ্ছ হয় unless একবার একাধিক ফাংশন স্তর হয়ে গেলে এবং আপনাকে আউটপুট ফেরত দিতে হবে অন্য কিছু ব্যবহার করা আবশ্যক এবং লিখন-হোস্টটি বিলটি পূরণ করে।
রবজি

2
লিখিত-হোস্টটি তত্ক্ষণাত দূরবর্তী সেশন থেকে আপনাকে অগ্রগতি দেখার অনুমতি দেয় এবং যদি কোনও দূরবর্তী সেশনে একটি ত্রুটি ছুড়ে দেয় তবে লিখন-আউটপুট তথ্যটি হারিয়ে যায়।
রবজি

3

কিছু সাধারণ নোট।


$obj | Select-Object $obj | Select-Object -Property *

পরেরটি সমস্ত অ-আন্তঃজাতীয়, অ-সংকলক-উত্পাদিত বৈশিষ্ট্যগুলি দেখায় । সাবেক নেই না (সবসময়) দেখানোর জন্য প্রদর্শিত সব প্রপার্টি ধরনের (আমার পরীক্ষা, এটা দেখানোর জন্য প্রদর্শিত হচ্ছে না CodeProperty MemberTypeধারাবাহিকভাবে যদিও - এখানে কোন গ্যারান্টি)।


গেট-সদস্যের জন্য সচেতন হতে কিছু স্যুইচ

  • Get-Memberনেই না ডিফল্টরূপে স্ট্যাটিক সদস্যদের পেতে। আপনি স্থিতিশীল সদস্যদের সাথে (সরাসরি) পেতে পারবেন না । এটি হ'ল, স্যুইচটি ব্যবহারের ফলে কেবল স্থিতিশীল সদস্যদেরই ফিরে আসবে:

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name        MemberType Definition
    ----        ---------- ----------
    Equals      Method     static bool Equals(System.Object objA, System.Object objB)
    ...
  • ব্যবহার করুন -Force

    Get-Memberকমান্ড ব্যবহার ফোর্স প্রদর্শনে স্বকীয় সদস্য ও বস্তুর কম্পাইলার তৈরি হওয়া সদস্যদের যোগ করার জন্য প্যারামিটার। Get-Memberএই সদস্যদের পায়, কিন্তু এটি তাদের ডিফল্টরূপে আড়াল করে।

    PS Y:\Power> $obj | Get-Member -Static
    
       TypeName: System.IsFire.TurnUpProtocol
    
    Name          MemberType     Definition
    ----          ----------     ----------
    ...
    pstypenames   CodeProperty   System.Collections.ObjectModel.Collection...
    psadapted     MemberSet      psadapted {AccessRightType, AccessRuleType,...
    ...

ConvertTo-Jsonগভীরতা এবং পাঠযোগ্য "সিরিয়ালাইজেশন" এর জন্য ব্যবহার করুন

আমি কি না প্রয়োজনীয় সুপারিশ সংরক্ষণ (ব্যবহারের JSON ব্যবহার করে বস্তু Export-Clixmlপরিবর্তে)। তবে, আপনি আরও বা কম পাঠযোগ্য আউটপুট পেতে পারেন ConvertTo-Jsonযা আপনাকে গভীরতা নির্দিষ্ট করার অনুমতি দেয়।

নোট করুন যে নির্দিষ্ট করে না Depthবোঝায়-Depth 2

PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
    "AllowSystemOverload":  true,
    "AllowLifeToGetInTheWay":  false,
    "CantAnyMore": true,
    "LastResortOnly": true,
...

এবং আপনি যদি এটি পড়ার পরিকল্পনা না করেন আপনি এটি করতে পারেন -Compress(অর্থাত্ স্ট্রিপ হোয়াইটস্পেস)

PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress

-InputObjectআপনি যদি করতে পারেন তবে ব্যবহার করুন (এবং ইচ্ছুক)

পাওয়ারশেল ব্যবহার করার সময় 99.9% সময়: হয় পারফরম্যান্সে কিছু আসে যায় না, বা আপনি পারফরম্যান্সের বিষয়ে চিন্তা করেন না। যাইহোক , এটি লক্ষ করা উচিত যে পাইপটি যখন আপনার প্রয়োজন হবে না তখন এড়ানো কিছু ওভারহেড সংরক্ষণ করতে পারে এবং কিছু গতি যোগ করতে পারে (পাইপিং, সাধারণভাবে, সুপার-দক্ষ নয়)।

এটি হ'ল, আপনার যদি সমস্ত কিছু $objমুদ্রণের জন্য একক কার্যকর হয় (এবং আমার মতো মাঝে মাঝে টাইপ করতে খুব অলস না হন -InputObject):

# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj

এর জন্য সতর্কতা Get-Member -InputObject: যদি $জেজ একটি সংগ্রহ হয় (উদাঃ System.Object[]), আপনি সংগ্রহ অবজেক্টের নিজেই তথ্য পেতে শেষ করবেন:

PS Y:\Power> gm -InputObject $obj,$obj2
   TypeName: System.Object[]

Name        MemberType            Definition
----        ----------            ----------
Count       AliasProperty         Count = Length
...

আপনি যদি সংগ্রহে Get-Memberপ্রতিটি জন্য চান TypeName(প্রতিটি জন্য NB TypeName, না প্রতিটি বস্তুর জন্য - সমস্ত একই সাথে এন বস্তুর একটি সংগ্রহ TypeNameকেবল তার জন্য 1 টেবিল প্রিন্ট করবে TypeName, প্রতিটি বস্তুর জন্য এন টেবিল নয়) ...... কেবল এটি সরাসরি পাইপ দিয়ে আটকে দিন।


1

নীচে আমার জন্য সত্যিই ভাল কাজ করেছে। আমি উপরের সমস্ত উত্তর একত্রে প্যাচ করেছি এবং নীচের লিঙ্কে অবজেক্টের বৈশিষ্ট্য প্রদর্শন করার বিষয়ে পড়ি এবং মুদ্রণ অবজেক্টগুলি সম্পর্কে নীচের সংক্ষিপ্ত পঠন নিয়ে এসেছি

Print_object.ps1 নামের একটি ফাইলটিতে নিম্নলিখিত পাঠ্য যুক্ত করুন:

$date = New-Object System.DateTime
Write-Output $date | Get-Member
Write-Output $date | Select-Object -Property *

পাওয়ারশেল কমান্ড প্রম্পটটি খুলুন, সেই ডিরেক্টরিতে যান যেখানে সেই ফাইলটি বিদ্যমান এবং নিম্নলিখিত টাইপ করুন:

powershell -ExecutionPolicy ByPass -File is_port_in_use.ps1 -Elevated

আপনি যেকোন বস্তু মুদ্রণ করতে চান তার সাথে 'সিস্টেম.ডেটটাইম' প্রতিস্থাপন করুন। যদি বস্তুটি নাল হয় তবে কিছুই মুদ্রণ করবে না।


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