পাওয়ারশেলে গল্ফ করার টিপস


45

উইন্ডোজ পাওয়ারশেলে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা পাওয়ারশেলের অন্তত কিছুটা নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)। দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।

মার্কোগের প্রশ্ন থেকে প্রায় ভার্বাটিম গ্রহণ করেছেন


3
আমি যখন "পাওয়ারশেল গল্ফ" গুগল করলাম তখন এটিই প্রথম হিট!
ম্যাট

উত্তর:


24

বৈজ্ঞানিক স্বরলিপি সহ 10 টি আক্ষরিক শক্তি:

4e6 = 4000000

2 আক্ষরিক শক্তি:

4KB = 4096
4MB = 4194304
4GB = 4294967296

# TB and PB suffixes also exist, but less useful for golf.

কাজে আসতে পারে।


19

আপনার যদি কোনও লুপ চালানোর প্রয়োজন হয় এবং আপনি প্রতিবার এটি চালানোর জন্য ঠিক কতবার জানেন তবে ব্যবহারের পরিবর্তে ওরফে দিয়ে সামঞ্জস্য পূর্ণসংখ্যার একটি অ্যারের পাইপিংয়ের বিষয়টি বিবেচনা ForEach-Objectকরুন ।%for

for($x=1;$x-le10;$x++){...}

বনাম

1..10|%{...}


18

আপনি পাওয়ারশেলে স্পেসগুলি অনেকটা এড়িয়ে যেতে পারেন । যদি এটি মনে হয় এটির প্রয়োজন নাও হতে পারে তবে এটি সম্ভবত সম্ভবত নয়। এটি তুলনার ক্ষেত্রে বিশেষভাবে কার্যকর।

উদাহরণ:

$x-eq$i-and$x-ne9

বনাম

$x -eq $i -and $x -ne 9

যদি আপনার একক পরীক্ষার ফলাফলের ভিত্তিতে আপনার স্ক্রিপ্টটি শাখা করা দরকার যার একাধিক ফলাফল হতে switchপারে তবে কখনও কখনও কোনও বিবৃতি মেলে বা পরাজিত করতে পারে ।

উদাহরণ (স্যুইচ বনাম যদি / অন্য - টাই):

if($x%2-eq0){'even'}else{'odd'}

বনাম

switch($x%2){0{'even'}1{'odd'}}

অথবা (স্যুইচ বনাম। / / যদি অন্যরকম / অন্য 15 - স্যুইচটি 15 দ্বারা জিতেছে):

if($x%2-eq0){'even'}elseif($x%2-eq1){'odd'}else{'error'}

বনাম

switch($x%2){0{'even'}1{'odd'}2{'error'}}

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

('even','odd','error')[$x%2]

আপনি যদি একটি নির্দিষ্ট কমান্ডটি প্রচুর ব্যবহার করছেন, বিশেষত পূর্ব-বিদ্যমান শর্ট হ্যান্ড ওরফে ছাড়া একটি, একটি সিঙ্গেল-চরিত্রের উপন্যাসটি খুব তাড়াতাড়ি সেটআপ করুন।

উদাহরণ:

nal g Get-Random;g 10;g 10;g 10

বনাম

Get-Random 10;Get-Random 10;Get-Random 10

('even','odd')[$x%2]অবগতির জন্য।
TheIncorr وړ1

15

প্রথম কমান্ডে ভেরিয়েবলের সংজ্ঞা দেয় এমন কমান্ডটি এনক্যাপসুলেটিং আপনাকে ভেরিয়েবলের সংজ্ঞাটি সরাসরি অন্যান্য কমান্ডগুলিতে খাওয়ানোর অনুমতি দেয়।

উদাহরণস্বরূপ, আপনি এটি দিয়ে একটি শটে in x এর মানের উপর ভিত্তি করে $ x সেট করতে পারেন এবং তারপরে y $ y সেট করতে পারেন:

$y=($x=1)+1

এর পরিবর্তে:

$x=1;$y=$x+1

আপনি h$ সেট করতে পারেন এবং এটি দিয়ে এটি আউটপুট করতে পারেন:

($h='Hello World!')

এর পরিবর্তে:

$h='Hello World!';$h

1
এটি বস্তুগুলিতে কল করার পদ্ধতিগুলির জন্য বিশেষভাবে কার্যকর। ($x=New-Object Windows.Forms.Form).Controls.Add($t)
বানান

14

একটি অ্যারে দেওয়া হলে একটি স্যুইচ লুপের মতো কাজ করতে পারে। উদাহরণ স্বরূপ:

$FooBarMeh='a','b','c'
switch ($FooBarMeh)
{
    'a'{'FOO'}
    'b'{'BAR'}
    default{'MEH'}
}

আউটপুট দেবে:

ফু
বার বার
মে

এটি কোথায় কার্যকর হবে তা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে আমি আশা করি এটি কিছু সময়ের জন্য কার্যকর হবে।


2
এটা তোলে প্রত্যেক সময় আপনি একটি প্রয়োজন সুবিধাজনক ForEach-Objectএবং switchযে মধ্যে। এটি উদাহরণস্বরূপ (বাস্তব-জগতে) পাঠ্য ফাইলগুলির দ্রুত পার্সার লেখার জন্য কোডটি খুব সুন্দর যেখানে কোন লাইনের সাথে কোন মিল রেখেছে তার উপর নির্ভর করে আপনাকে বিভিন্ন জিনিস করতে হবে।
জোয়

এটি ... জঘন্য অদ্ভুত। একটি অ্যারের একটি চরের সাথে মেলে না, তবে এটি হয়।
বিড়াল

@ জোয়ি যা এর switch -File $pathজন্য তা
TheIncorr وړ1

পার্স করা সমস্ত কিছুই ফাইল হিসাবে ঘটে না।
জোয়

12

[math]::powগুণের সাথে প্রতিস্থাপন করুন । পরিবর্তে

[math]::pow($a,$b)

তুমি লিখতে পারো

"$a*"*$b+1|iex

এটি পূর্ণসংখ্যক> = 0 এর জন্য কাজ করে।


আমি দেখতে প্রয়োজন এই উত্তরটি বুঝতে iexজন্য ... ওরফেInvoke-Expression
HeatfanJohn

11

তুলনা অপারেটরগুলি ম্যাচের মানগুলি ফিরিয়ে মান সংগ্রহের কাজ করে:

1..5 -gt 2

ফলন হবে 3, 4এবং 5। কিছু ক্ষেত্রে এটি অন্যথায় দীর্ঘতর সংরক্ষণে সহায়তা করতে পারে |?{$_...}

-match একটি তুলনা অপারেটর।


1
মনে রাখবেন যে সেই উদাহরণে আপনার কোনও স্থানের দরকার নেই1..5-gt2
ম্যাট

1
আমি জানি; এই কৌশলটি প্রদর্শন সম্পর্কে আরও ছিল। স্পেসগুলি পৃথক উত্তরে রয়েছে
জোয়ে

11

যখনই সম্ভব এলিয়াস ব্যবহার করুন। এখানে অনেকগুলি দরকারী রয়েছে:

?        Where-Object
%        ForEach-Object
gu       Get-Unique
sort     Sort-Object
iex      Invoke-Expression

11

মান সংগ্রহের সর্বাধিক বা সর্বনিম্ন সন্ধান করতে চান? চেষ্টা করা হয়েছে

(...|measure -ma).Maximum

অথবা

(...|measure -mi).Minimum

ইতিমধ্যে?

কেবল শেষ বা প্রথম আইটেমটি বাছাই করুন এবং ব্যবহার করুন:

(...|sort)[-1]  # maximum
(...|sort)[0]   # minimum

1
এবং, যদি আপনি মান সংগ্রহের দৈর্ঘ্য জানেন এবং এটি 10 ​​এরও কম ...
wizzwizz4

@ উইজউইফজ ৪: ওহ, সর্বাধিক দৈর্ঘ্য প্রায়শই সৃজনশীলভাবে নিযুক্ত করা যেতে পারে, অগত্যা 10 এর মতো নয় Although
জোয়

1
আমি বলতে চাচ্ছি, যদি চূড়ান্ত আইটেমটি হিসেবে পরিচিত 0, 1, 2, 3, 4, 5, 6, 7, 8বা 9, এটি একটি বাইট সংরক্ষণ পরিবর্তে পরিচিত দৈর্ঘ্য লিখতে হবে -1
wizzwizz4

10

সম্পত্তি নাম সংক্ষিপ্তকরণ

দুঃখের বিষয়, পরামিতিগুলির বিপরীতে, বৈশিষ্ট্য / পদ্ধতিগুলি (কোনও বিন্দুর সাথে অ্যাক্সেসযুক্ত যে কোনও কিছু .) সাধারণত তার দ্ব্যর্থহীন আকারে ছোট করা যায় না।

তবে নির্দিষ্ট কিছু সেমিডলেটগুলি সম্পত্তির নামগুলিতে পরিচালনা করতে পারে এবং ওয়াইল্ডকার্ড নিতে পারে এবং এর অল্প-পরিচিত পরামিতি সেট রয়েছে %এবং ?এটি কার্যকর হতে পারে।

সাধারণত আমরা একটি স্ক্রিপ্টব্লেকে পাস করি এবং সাথে আইটেমটি উল্লেখ করি $_তবে এর আরও একটি রূপ রয়েছে যা একটি সম্পত্তির নাম নেয় এবং এটি একটি ওয়াইল্ডকার্ড গ্রহণ করে।

$o|select Le*  
$o|%{$_.Length}

.LengthV3 ম্যাজিকের মতো আমরা ব্যবহার করতে পারি না যা সাধারণত অ্যারেতে কাজ করবে কারণ Lengthঅ্যারে নিজেই একটি সম্পত্তি, সুতরাং উপরের দুটি পৃথক সদস্যের দৈর্ঘ্য পেতে ব্যবহার করা যেতে পারে। selectআসে একটু খাটো বিট।

তবে %সরাসরি কোনও সম্পত্তির নাম নিতে পারে এবং সেই মানটি ফিরিয়ে দিতে পারে:

$a|% Length

যা ওয়াইল্ডকার্ড দিয়ে ছোট করা যেতে পারে। ওয়াইল্ডকার্ডকে অবশ্যই একটি একক সম্পত্তি (বা পদ্ধতি, এরপরে আরও) সমাধান করতে হবে, সুতরাং এটি কোন সদস্যকে সমাধান করতে পারে তা নির্দেশ করে সঠিকভাবে ত্রুটি ছুঁড়ে ফেলবে,

ক্ষেত্রে Length, Le*সাধারণত সবচেয়ে কম হয়। এমনকি একটি একক স্ট্রিংয়েও, সম্পত্তিটি ব্যবহারের চেয়ে এই পদ্ধতিটি 1 বাইট ছোট।

$a.Length                # 9   #(doesn't work on array)
$a|%{$_.Length}          # 15
$a|% Le*                 # 8

তবে আপনি এটি দিয়ে কী করছেন তার উপর নির্ভর করে এটি আরও খারাপ হতে পারে। আপনি এটি করতে পারেন $a.Length*5তবে পাইপলাইন এক্সপ্রেশন দিয়ে এটি করার জন্য আপনাকে এটি আবৃত করতে হবে ($a|% Le*)*5; এটি যদি কোনও অ্যারের বিরুদ্ধে হয় তবে এখনও এটি মূল্যবান হতে পারে তবে মূল বিষয়টি হ'ল এটি সর্বদা সরল প্রতিস্থাপন হিসাবে উপযুক্ত নয়।

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

$a.ToUpper()             # 12
$a|% *per                #  9

যুক্তি সহ:

'gaga'-replace'g','r'    # 21
'gaga'|% *ce g r         # 16

এগুলি কঠোরভাবে একই রকম হয় না যে -replaceঅপারেটর একটি রিজেক্স প্রতিস্থাপন করে, তবে আপনি যদি কেবল একটি স্ট্রিং প্রতিস্থাপন করেন তবে এটি (এখন) পদ্ধতিটি ব্যবহার করা সংক্ষিপ্ত হতে পারে; এটি স্ট্রিংগুলি পদ্ধতি আর্গুমেন্টের পরিবর্তে সেমিডলেট আর্গুমেন্ট হিসাবে সহায়তা করে যাতে তাদের উদ্ধৃতি দেওয়ার প্রয়োজন হয় না।

যেখানে-বস্তুর বৈশিষ্ট্য

?(আংশিক) সম্পত্তির নামও নিতে পারে এবং এতে একটি "অপারেটর" প্রয়োগ করতে পারে (স্যুইচ প্যারামিটার আকারে)। আবার Where-Objectসম্পত্তির নামটি যথেষ্ট দীর্ঘ এবং অনন্য হলে মান স্ক্রিপ্টব্লক পদ্ধতির ব্যবহারের চেয়ে কম হতে পারে ।

$a|?{$_.Length-gt5}      # 19
$a|? Le* -GT 5           # 14

($a|% Le*)-gt5           # 14 - Lengths, not objs

1
শ্বেতস্থান প্রয়োজন এমন কয়েকটি জায়গার মধ্যে একটি। ভাল লাগছে, যদিও। আমি বেশ কয়েকটি ক্ষেত্রের কথা ভাবতে পারি যেখানে এটি জিনিসগুলি ছোট করবে।
অ্যাডমবর্কবার্ক

সুন্দর সম্পাদনা জোয়াই! ধন্যবাদ।
ব্রিটিশবাদী

এটির সংক্ষিপ্তকরণের জন্য আপনি একটি উপায় খুঁজে পেয়েছেন ;-) ... এর সম্পর্কে দুঃখজনক বিষয়টি হ'ল সামগ্রিকভাবে এটি আবার একটি পাইপলাইন যা এর উপযোগিতাটি কিছুটা সীমিত করে। বা বরং, এমন অনেক জায়গাগুলি রয়েছে যেখানে আপনাকে আবার এক্সপ্রেশন পাওয়ার জন্য বন্ধনীতে আবদ্ধ করতে হবে। তবে কয়েকটি গল্ফ কৌশল ট্রেড-অফ ছাড়াই রয়েছে ...
জোয়

1
@ কননরএলএসডাব্লু আহ হ্যাঁ আমি এটি আপডেট করার অর্থ হ'ল যেহেতু আমি বুঝতে পেরেছি আপনি আরোগুলি সেভাবে পাস করতে পারেন যা এটির কার্যকারিতাটিকে ব্যাপকভাবে বৃদ্ধি করে। দুর্দান্ত ব্যবহার .ToString()!
ব্রিটিশবাদী

2
@ ব্রায়েন্টিস্ট এটি পাওয়ারশেলকে অনেক বেশি প্রতিযোগিতামূলক ভাষায় রূপান্তরিত করেছে, সত্যই বিরক্তিকর কিছু শব্দভাণ্ডার কেটে ফেলেছে et নেট কল।
কলসডাব্লু

9

দীর্ঘ পথের যোগফল খুঁজে পাওয়া:

(...|measure -s).Sum

একটি ছোট উপায়:

...|%{$s+=$_};$s

এমনকি আরও ছোট:

...-join'+'|iex

9

সেমিকোলন এবং লাইন ব্রেকগুলি বিনিময়যোগ্য। গল্ফযুক্ত কোডটি একটি লাইনে জ্যাম না থাকলে প্রায়শই বেশি পঠনযোগ্য। এবং দৈর্ঘ্যটি এখনও একই (আপনি যদি লাইন ব্রেক হিসাবে ইউ + 000 এ ব্যবহার করেন তবে পাওয়ারশেল সমস্যা ছাড়াই পরিচালনা করে)।


2
অপেক্ষা করুন, আমরা পাঠযোগ্যতার জন্য চিন্তিত ?!
কেভিন কক্স

4
দৈর্ঘ্যে যদি এর কোনও প্রভাব না থাকে ... কেন নয়?
জোয়

সেমিকোলনটি \ r \ n এর চেয়ে কম চরিত্র হওয়ায় এটি প্রযুক্তিগতভাবে কোনও পার্থক্য তৈরি করে না? কেবল ইউনিক্সে এটি একটি একক \ n।
ভাসিলি সিরিাকিস

2
@ ভ্যাসিলি: আপনি কেবলমাত্র লাইনগুলির মধ্যে কেবলমাত্র U + 000A দিয়ে ফাইলগুলি সংরক্ষণ করতে পারেন। পাওয়ারশেল অভিযোগ করবেন না। যা আমি উত্তরে ইতিমধ্যে লিখেছি, উপায় দ্বারা। লাইন ব্রেকগুলি ফাইলটির একটি সম্পত্তি , এটি ব্যবহৃত অপারেটিং সিস্টেমের নয়। কেউ বলে না যে আপনি উইন্ডোজে ইউনিক্স লাইনের শেষ ব্যবহার করতে পারবেন না।
জোয়

@ জোয়ি যদি আপনি কিছু তাড়াতাড়ি প্রোগ্রামিং করতে উইন্ডোজের একটি নতুন ইনস্টল ব্যবহার করেছেন, তবে আপনি খেয়াল করবেন নোটপ্যাড \ x0a দিয়ে ভাল খেলবে না
স্টান স্ট্রাম

9

Getক্রিয়া উহ্য হয়। এটি যে কোনওটিকে সংক্ষিপ্ত করতে Get-Frobপারে Frob। ঘন ঘন প্রতিদ্বন্দ্বী হয় dateবা random

মনে রাখবেন যে এটি কিছু ক্ষেত্রে সঠিকভাবে কাজ করবে না কারণ আপনার পথে আপনার জিএনইউ ইউটিলিটি থাকতে পারে (বা অন্যান্য নেটিভ প্রোগ্রামগুলির সংঘাত রয়েছে)। সেক্ষেত্রে কমান্ড লুকিংয়ের ক্রমটি Get-মুছে ফেলা সহ সেমিডলেটগুলি বিবেচনা করার আগে দেশীয় প্রোগ্রামটিকে পছন্দ করে বলে মনে হচ্ছে :

PS Home:\> date

Freitag, 15. November 2013 07:13:45


PS Home:\> $Env:Path += ';D:\Users\Joey\Apps\GnuWin32\bin'
PS Home:\> date
Fr Nov 15 07:14:13 W. Europe Standard Time 2013

এই না বেশ সবসময় কাজ আশানুরূপ। আমার একটি স্ক্রিপ্ট রয়েছে যা nal g Get-Randomঅক্ষরগুলি পরে সংরক্ষণ করতে শুরু করা হয়। এটিকে পরিবর্তনের nal g Randomফলে স্ক্রিপ্টটি অনির্দিষ্টকালের জন্য স্তব্ধ হয়ে যায় (বা, কমপক্ষে, প্রক্রিয়া করার জন্য একটি প্রচুর পরিমাণ সময় নিন - এটি শেষ হওয়ার জন্য অপেক্ষা করার মতো ধৈর্য আমার ছিল না, তবে এটি মূল আকারের চেয়ে বেশিরভাগ আদেশের বেশি সময় নিচ্ছে আমি গর্ভপাত আগে)।
ইসজি

2
দুটি সংক্ষিপ্ত Measure-Commandআহ্বান (100 গুণ Get-Randomবনাম random) আমাকে বলুন এটি প্রায় 500 গতি কম। আমি আগে জানতাম না, সত্যি বলতে। তবে এটি মনে রাখা ভাল, বিশেষত বহু পুনরাবৃত্তির সাথে লুপগুলিতে। বলা হচ্ছে, গল্ফড কোডটি সংক্ষিপ্ত হওয়া উচিত, দ্রুত নয় ( এটি বলা হচ্ছে, এটি কোনও প্রকল্প ইউলারের সমস্যার উত্তরের জন্য দু'দিন অপেক্ষা করতে হবে)।
জোয়

1
আমার সমস্যাটি মন্টি হল দৃশ্যের 10,000 টি পুনরাবৃত্তি চলছিল, প্রত্যেকটির জন্য গেট-র্যান্ডমের তিনটি পুনরাবৃত্তি প্রয়োজন। প্রক্রিয়াজাতকরণের সময়কালে 50,000% বৃদ্ধি, 30,000 রানের জুড়ে গুণিতটি খুব বাজে।
ইসজি

কি দারুন. দেখে মনে হচ্ছে এটি কোনওরূপে সম্ভবত সঠিক আছে। Get-Variableবনাম পরীক্ষিত gvএবং একটি অনুরূপ তুলনা পেয়েছে।
ইসজি

1
এটা হতে পারে। আমি কিছু গণিত করেনি এবং মূর্ত আমার মন্টি হল স্ক্রিপ্ট 1.5 ঘন্টা (সাধারণত, 10-11 সেকেন্ড) ছাড়াই চালানো সম্পর্কে গ্রহণ করা উচিত Get-। দৈর্ঘ্যে মাত্র 4 টি অক্ষরের সঞ্চয়ী সঞ্চয়ের জন্য রান সময়টিতে এটি একটি চমকপ্রদ ফুল।
ইসজি

8

for লুপগুলির শিরোনামে 0 এবং তিনটি স্টেটমেন্টের মধ্যে কিছু থাকতে পারে:

অন্তহীন লুপ:

for(){}

সূচনা সহ লুপ:

for($n=0){}

সূচনা এবং শেষ শর্ত সহ লুপ:

for($n=0;$n-lt7){}

এ জাতীয় ক্ষেত্রে সি-জাতীয় ভাষাগুলির বিপরীতে যেগুলি সর্বদা ঠিক তিনটি বিবৃতি প্রয়োজন তার বিপরীতে এগুলি শেষে অতিরিক্ত অর্ধসীমা বাদ দেওয়া যেতে পারে (এটি ভাষা স্পেসিফিকেশনে স্পষ্টভাবে বলা হয়েছে , সুতরাং এটি বাস্তবায়নের বিশদ নয়)।

এটি whileকিছুটা খাটো করে তোলে । তুলনা করা

while(...){}

এবং

for(;...){}

forঅতিরিক্ত যুক্ত ব্যতীত (এবং এমনকি কোনও অক্ষর সংরক্ষণ না করে) আপনি আগের লাইনে আটকে রাখতে পারেন (যদি থাকে তবে) অতিরিক্ত বোনাস দিয়ে ।


8

যদি আপনি এমন একটি অ্যারে বরাদ্দ করেন যা আপনি জানেন যে কেবল দুটি মান থাকবে তবে সূচী ব্যবহার করবেন না।

এটার মতো কিছু:

$a="apple","orange"
$a[0] # apple
$a[1] # orange

সহজেই এতে রূপান্তরিত হতে পারে:

$a,$o="apple","orange"
$a # apple
$o # orange

আপনার যদি অ্যারের প্রথম উপাদানটির প্রয়োজন হয় তবে এটির জন্যও এটি কার্যকর হতে পারে:

$a,$b=1..10
$a # 1
$b # 2..10

এই ক্ষেত্রে (স্ট্রিং সহ) $a="apple";$o="orange"দৈর্ঘ্যে অভিন্ন। এটি দীর্ঘতর অ্যারে যা কখনও কখনও মোটামুটি সুন্দরভাবে অনুকূলিত করা যায়, যেমন সমস্ত বিভাজনকারীকে একটি স্ট্রিংয়ের সাথে একটি স্ট্রিংয়ে রেখে এবং তারপরে ব্যবহার করে -split(স্বেচ্ছাসেবীকে বিভাজক হিসাবে ব্যবহার করা ভাল কারণ তখন ইউনারি -splitযথেষ্ট হবে)।
জোয়

8

স্ট্রিংয়ে কাস্টিং:

[string]$x

বনাম

"$x"

এর মতো স্ট্রিং এ ingালাইয়ের সাথে যুক্ত হওয়ার পরিবর্তে কোনও স্ট্রিংয়ের অ্যারের সমতল করতেও এটি ব্যবহার করা যেতে পারে:

$a = @('a','b','c')
$a -join ' '

বনাম

$a = @('a','b','c')
"$a"

একটি সাংখ্যিক প্রকারে একটি স্ট্রিং ingালাই:

[int]$x     [float]$x

বনাম

+$x

এছাড়াও এটি জানতে খুব দরকারী যে পাওয়ারশেল সর্বদা কোনও এক্সপ্রেশন এবং চূড়ান্ত রূপ প্রয়োগের জন্য চূড়ান্ত প্রকার নির্ধারণ করতে বাম অপারেন্ডের ধরণটি গ্রহণ করে:

'1'+2    -> '12'
1+'2'    -> 3

যা অযথা ক্যাসেট কোথায় তা নির্ধারণে সহায়তা করতে পারে।


6

ভুলে যাবেন না যে আপনার সবসময় কোনও প্যারামিটারের পুরো নাম সরবরাহ করার প্রয়োজন হয় না এবং কিছু পরামিতি অবস্থানগত হয়।

Get-Random -InputObject (0..10)

... এর মধ্যে ছাঁটাই করা যেতে পারে ...

Get-Random -I (0..10)

... কারণ "আমি", InputObjectএক্ষেত্রে এই কমান্ডের জন্য অন্যান্য বৈধ প্যারামিটারগুলি থেকে স্বতন্ত্রভাবে সনাক্ত করতে যথেষ্ট ।

আপনি এটিকে আরও ছাঁটাতে পারেন ...

Get-Random (0..10)

... কারণ InputObjectএকটি অবস্থানগত পরামিতি।

পাইপিং সাধারণত প্যারামিটার হিসাবে খাওয়ানো অবজেক্টগুলির চেয়ে কম হয়, বিশেষত যখন এটি প্রথম বন্ধনীর প্রয়োজনটিকে সরিয়ে ফেলতে পারে। আসুন আমাদের এলোমেলো নম্বর জেনারেটরটি আরও ছাঁটাতে দিন ...

0..10|Get-Random

আপনি কমান্ডটি পরিবর্তন করতে না পারলেও একই জিনিসটি সম্পাদনের জন্য অন্যান্য উপায়ের সন্ধান করুন। উপরের ক্ষেত্রে, আপনি এটি করতে পারেন:

Get-Random 11

বা, অন্য একটি পরামর্শ অন্তর্ভুক্ত *:

Random 11

** দ্রষ্টব্য: Get-কমান্ডের নাম থেকে অব্যাহতি দিলে রান সময় প্রায় 50,000% পুষতে পারে। আপনার যদি একবার কমান্ডের প্রয়োজন হয় তবে খারাপ নয়, তবে এটি দীর্ঘ লুপগুলিতে ব্যবহার করার ক্ষেত্রে সতর্ক হন *

এবং এটি কীভাবে একটি সাধারণ কমান্ডকে তার আকারের এক তৃতীয়াংশ পর্যন্ত কড়াতে পারে।


6

ভুয়া টার্নারি অপারেটর। আপনি সরাসরি ifবিবৃতি থেকে বরাদ্দ করতে পারেন :

$z=if($x-eq$y){"truth"}else{"false"}

তবে আপনি একটি 2-উপাদান অ্যারে ব্যবহার করতে পারেন এবং এটিতে সূচি পরীক্ষার জন্য ব্যবহার করতে পারেন। y ভুয়া ফলাফলগুলি উপাদান 0 পায়, y সত্য ফলাফল ফলাফল 1 নেয়:

$z=("false","true")[$x-eq$y]

বিশেষ দ্রষ্টব্য। এই যে সত্যিই অ্যারের ইন্ডেক্স করছে, এবং যদি একটি মান পরীক্ষার ফলাফল যা করতে একটি পূর্ণসংখ্যা কাস্ট করা, আপনি অ্যারের সীমার বাইরে একটি আইটেম জন্য অনুরোধ এবং $ নাল ফিরে পাবেন, এবং কি প্রয়োজন হবে !(test)বল করতে বিকল্পগুলিকে বিপরীত করে একটি ফলটিতে ফলাফল ফেলুন।


প্রথম স্নিপেটটি এক মুহুর্তে (পুরানো পাওয়ারশেল সংস্করণ) কাজ করে না, যদি আমি সঠিকভাবে মনে করি তবে এটি এটিকে মোড়ানো প্রয়োজন $()। কমান্ড এবং বিবৃতি থেকে তৈরি পাইপলাইনগুলি এক্সপ্রেশন হিসাবে ব্যবহার করার মূলত একটি পার্থক্য ছিল। মনে হচ্ছে যা এখনই চলে গেছে, কমপক্ষে পাওয়ারশেল ৫.
জো

অতিরিক্তভাবে, অ্যারে উপাদানগুলি স্থিতিশীল না হলে, উভয়ই শৃঙ্খলাবদ্ধ হওয়ার আগে অ্যারে তৈরির অংশ হিসাবে পার্স এবং প্রক্রিয়াজাত হয়ে ফলাফল নির্ধারিত হয়। উদাহরণস্বরূপ
অ্যাডমবর্কবর্ক 20 मे

6

কোনও অপারেটরের আর্গুমেন্ট হিসাবে কোনও নম্বর ব্যবহার করার জন্য যা অন্যথায় স্ট্রিংয়ের প্রয়োজন হয়, আপনি সরাসরি নম্বরটি ব্যবহার করতে পারেন। তুলনা করা

...-join'0'

বনাম

...-join0

সঙ্গে কাজ করে -splitপাশাপাশি। যুক্তিটি সর্বদা প্রথমে একটি স্ট্রিংয়ে রূপান্তরিত হয়।


রেফারেন্সের জন্য, এটি -replaceপাশাপাশি কাজ করে ।
অ্যাডমবর্কবার্ক

-replaceআপনি ম্যাচগুলি সরাতে চাইছেন এমন কোনও দ্বিতীয় যুক্তির সাথে কাজ করে না
জোয়

5

পরম মান value

সঙ্গে

$n=-123

পরিবর্তে

[math]::abs($n)

ব্যবহার

$n-replace'-'

অবশ্যই, বন্ধনী প্রয়োজন হলে সঞ্চয় বাতিল করা হয়।


অথবা আপনার যদি অপারেটরের বাম দিকে ফলাফলের প্রয়োজন হয় ;-)
জোয়

5

আপনার যদি ত্রুটিগুলি নিঃশব্দ করার প্রয়োজন হয় তবে সুস্পষ্ট রূপটি হবে

try{ <# something that throws errors #> }catch{}

তবে এটি বেশ দীর্ঘ way একটি সংক্ষিপ্ত রূপটি হ'ল tryব্লকটিকে স্ক্রিপ্ট ব্লক হিসাবে চালানো এবং ত্রুটিগুলি কেবল একটি আনসেট ভেরিয়েবলের মধ্যে পুনঃনির্দেশ করা ( $nullএটি স্বাভাবিক হবে তবে এটি এখনও অনেক দীর্ঘ):

.{ <# something that throws errors #> }2>$x

এটি পাঁচটি মূল্যবান বাইট সংরক্ষণ করে (যদি বিশ্ব না হয়)।


5

ব্যবহার করুন $ofs বিশেষ পরিবর্তনশীল পরিবর্তন করতে হে utput এফ ield এস eparator যখন একটি অ্যারের stringifying ব্যবহৃত। আপনার যদি অ্যারেগুলিকে একাধিকবার স্ট্রিংয়ে রূপান্তর করতে হয় তবে দরকারী।

উদাহরণ স্বরূপ:

$a=1,2,3,4
$a-join',';$a-join','
$ofs=',';"$a";"$a"

2 য় 2+ এন অক্ষর সংরক্ষণ করে -join, যেখানে n বিভাজকের দৈর্ঘ্য এবং তৃতীয় এবং পরবর্তী প্রতিটি জন্য অতিরিক্ত 5+ এন সংরক্ষণ -joinকরে।


1
দুঃখজনকভাবে খুব কমই দরকারী (অন্তত আমার গল্ফিং এ এখনও পর্যন্ত - আমি এটিকে শেষের দিকে কেবল এককভাবে যোগ দিতে চাই)।
জোয়ে

5

অটোমেটিক ভেরিয়েবলগুলির ট্রু এবং ভুয়া হিসাবে বুলেট রয়েছে $trueএবং $falseআপনি লজিকাল নট অপারেটর !এবং পূর্ণসংখ্যা 0 এবং 1 (বা কোনও শূন্য-অবধি পূর্ণসংখ্যক) ব্যবহার করে অনুরূপ ফলাফল পেতে পারেন )

PS C:\Users\matt> !1
False

PS C:\Users\matt> !0
True

সমস্ত পাওয়ারশেল এক্সপ্রেশন কাছাকাছি বুলিয়ান হিসাবে মূল্যায়ন করা যেতে পারে। সুতরাং যতক্ষণ আপনি নির্দিষ্ট ডেটা কীভাবে মূল্যায়ন করা হয় তা অবধি অবধি আপনি বুলিয়ান পেতে পারেন এবং সেগুলি স্পষ্টভাবে কাস্ট করার দরকার নেই। এগুলি করার সময় এলএইচএস মান সম্পর্কে সচেতন হন।

  • পূর্ণসংখ্যা 0 মিথ্যা এবং শূন্য-শূন্য পূর্ণসংখ্যাগুলি সত্য হিসাবে মূল্যায়ন করা হয়।
  • নন-শূন্য দৈর্ঘ্যের স্ট্রিংগুলি সত্য এবং খালি বা নাল (এবং নাল নিজেরাই) স্ট্রিংগুলি মিথ্যা।

অন্যান্য উদাহরণ রয়েছে তবে আপনি সহজেই একটি কাস্ট করে পরীক্ষা করতে পারেন

PS C:\Users\matt> [bool]@(0)
False

1
অন্যান্য অনেক ডেটা টাইপেরও একই অবস্থা। আনইনিটালাইজড ভেরিয়েবলগুলি ডিফল্ট $nullএটিকে মিথ্যা। খালি স্ট্রিং (এবং ভেরিয়েবলগুলি খালি স্ট্রিংয়ে সেট করা হয়) মিথ্যা। ইত্যাদি। এরপরে এটি অ্যারের সাথে শর্টকাট ইনডেক্সিংয়ের জন্য ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ, যখন if/ একটি করছেন else), যেমনটি ফিজবুজ-এ ব্যবহৃত হয়েছিল ।
অ্যাডমবর্কবার্ক

@ টিমিডি খুব সত্য। intS ব্যবহার করা কেবল ছোট
ম্যাট

@ টিমিডি আমি আপনার দেখা না হওয়া পর্যন্ত ফিজবুজটির উত্তর দিতে চেয়েছিলাম .... এটি পরাতে পারি না .... কমপক্ষে এখনও নয়
ম্যাট

নোট অনেক ক্ষেত্রে আপনি আসলে না যে প্রয়োজন একটি bool। আপনি ব্যবহার করতে পারেন 0এবং 1মাত্র হিসাবে ভাল। অন্তর্নিহিত রূপান্তরগুলি সেই ক্ষেত্রে অনেক সহায়তা করে (যা আপনি প্রায়শই নির্দিষ্ট অপারেটরদের সাথে জোর করতে পারেন)।
জোয়ে

4

Invoke-Expressionএবং Get-Randomযুক্তির পরিবর্তে পাইপলাইন ইনপুটও পেতে পারে।

এর জন্য iexকিছু অভিব্যক্তিগুলিতে প্রথম বন্ধনী সংরক্ষণ করতে দেয়:

iex 1..5-join'+'   # won't work
iex(1..5-join'+')  # does work, but has extra parentheses
1..5-join'+'|iex   # doesn't need the parentheses

এর ক্ষেত্রে randomএকটি সাধারণ কেসটি কিছুটা অনুকূল করা যায়:

random -mi 10 31   # gets a random integer between 10 and 30
10..30|random      # much better :-)
(random 21)+10     # if needed in another expression that doesn't require extra
                   # parentheses

এটি ব্যবহারের পরবর্তী উপায়টি কেবল তালিকা থেকে কোনও আইটেম নির্বাচন করে। -cযুক্তি একক নির্বাচন চেয়ে বেশি করার অনুমতি দেওয়া যেতে পারে।


4

ফাংশন ব্যবহারের পরিবর্তে পরিবর্তনশীলগুলিতে পুনরাবৃত্তি স্ক্রিপ্ট ব্লকগুলি সংরক্ষণ করার বিষয়ে বিবেচনা করুন।

আমি আমার রক, পেপার, কাঁচি বাস্তবায়নের কয়েকটি অক্ষর সংরক্ষণ করতে এটি ব্যবহার করতে যাচ্ছিলাম আমি বুঝতে পেরেছিলাম যে ভেরিয়েবল হিসাবে ফাংশনটি পুনরায় লেখার ফলে ভেরিয়েবলটিকে অপ্রয়োজনীয়ও করা হয়। এটি অন্য স্ক্রিপ্টগুলির জন্য এখনও কার্যকর হতে পারে, যেখানে আপনি একই কোডটি একাধিকবার চালাচ্ছেন।

function Hi{echo 'Hello, World!'};Hi

বনাম

$Hi={echo 'Hello, World!'};&$Hi

2
যুক্তি গ্রহণ না করে এমন ফাংশনগুলির জন্য দরকারী। অন্যথায় params(...)ফাংশন সংজ্ঞা সংরক্ষণের চেয়ে বেশি জায়গা নেয়। সম্পর্কিত: ব্যবহার করুন filterউপর functionযখন আপনি তা করতে পারেন।
জোয়

আপনি $argsপ্রয়োজন এড়াতে ব্যবহার করতে পারেন params; অর্থাত্ $x={$args[0]+2}(বা এমনকি $x={2+"$args"}); কিছু পরিস্থিতিতে একটি চরিত্র বা 2 সংরক্ষণ করতে পারে। আপনি একাধিক $x={$a,$b=$args;$a+$b+3}
প্যারামের

4

আপনি স্ট্রিংটিকে চর অ্যারেতে বিভক্ত করার $s|% t*yপরিবর্তে ব্যবহার করতে পারেন [char[]]$sটেসেল্লাটিংহেকলারের উত্তর থেকে দেওয়া : সমতুল্যে% t*y প্রসারিত | ForEach-Object -Method ToCharArray। এর"$args".ToCharArray()

উদাহরণস্বরূপ, তুলনা করুন

$s|% t*y

এবং

[char[]]$s

এবং

$s.ToCharArray()

এটি $argsবিশেষত:$args|% t*y


1
এটি বেশ ঝরঝরে। আমি %সদস্যদের জন্য কয়েকবার পাশাপাশি কৌশলটি ব্যবহার করেছি , তবে আমার বেশিরভাগ গল্ফিং সেই বৈশিষ্ট্যটির পূর্বাভাস দেয় ;-)। এটি বেশ সাধারণ কৌশল হিসাবেও রয়েছে: আপনার প্রয়োজনীয় সম্পত্তি / পদ্ধতির সাথে মেলে এমন একটি চিঠি / ওয়াইল্ডকার্ড সংমিশ্রণটি অনুসন্ধান করার চেষ্টা করুন (এবং এটি বাস্তবের চেয়ে ছোট)।
জোয়

উত্তর থেকে অন্য দরকারী উদাহরণ: $s|% *perজন্য $s.toUpper()এবং $s|% *werজন্য $s.toLower()। আমি একমত যে এটি বেশ ঝরঝরে।
mazzy

আরও একটি উদাহরণ : |% t* "ddd\:hh\:mm\:ss"জন্য[TimeSpan].toString("ddd\:hh\:mm\:ss")
mazzy

ঠিক আছে, এটি কেবল উদ্ধৃতিগুলির অপচয়, তবে; আপনার এখানে তাদের দরকার নেই :-)
জোয়


3

লুপে ই-কাউন্টারগুলির জায়গায় বুলিয়ান যুক্তি ব্যবহার করুন

মনে করুন আপনি 1 থেকে 10 পর্যন্ত সমস্ত সংখ্যার যোগ করছেন ... 2+4+6+8+10=30

1..10|%{if($_%2-eq0){$o+=$_}};$o

আপনি এটি বর্ধিত করতে বুলিয়ান অবহেলা ব্যবহার করতে পারেন

1..10|%{if(!($_%2)){$o+=$_}};$o

বাইট সংরক্ষণ করতে, তবে কীভাবে পরিবর্তে বুলিয়ানদের অন্তর্নিহিত ingালাই ints থেকে ব্যবহার করা যায় এবং শর্তসাপেক্ষে সঞ্চয়ের মধ্যে রোল করা যায়

1..10|%{$o+=$_*!($_%2)};$o

এই উদাহরণে 6 বাইট সংরক্ষণ করে।


2
যীশু. আমি কর্মক্ষেত্রে আমার প্রোডাকশন কোডে এটি করার পরিকল্পনা করছি, আমার সহকর্মীরা আমাকে এটির জন্য ভালবাসবেন।
শাভেজ

3

পাওয়ারশেলে পূর্ণসংখ্যার সংখ্যাগুলি ফ্লোটিং-পয়েন্টকে রূপান্তর করা একটি খনি ফিল্ড of ডিফল্টরূপে রূপান্তরগুলি ব্যাঙ্কারদের রাউন্ডিং করে যা সর্বদা দশমিক ছাড়াই ছাঁটাই করে না এবং পুরো পুরো সংখ্যাটি ছেড়ে দেয় না বা সর্বদা গোল করে .5 পরবর্তী সংখ্যা পর্যন্ত লোকেরা যেমন করুণভাবে করেন, এটি এক উপায়ে সন্নিবিষ্ট হয় এবং অন্যভাবে বৈষম্য তৈরি করে - এটি পারে অবাক করা, যেমন

PS C:\> [int]1.5
2

PS C:\> [int]2.5
2

এবং ব্রেকড কোডগলফ গণনা। অন্যান্য অনেক সাধারণ ভাষায় কাটাকাটি হয় - সুতরাং গল্ফের প্রশ্নগুলির প্রায়শই কাটা কাটা প্রয়োজন require আপনি [Math]::Floor()পরবর্তী সেরা জিনিস হিসাবে পৌঁছে যেতে পারেন , তবে সাবধান থাকুন এটি কেবল ধনাত্মক সংখ্যার জন্য ছাঁটাইয়ের মতোই আচরণ করে তবে এটি নেতিবাচক সংখ্যাগুলি কম নেয় - শূন্য থেকে আরও দূরে। [Math]::Truncate()আপনার অন্য ভাষার ডিফল্ট রাউন্ডিংয়ের সাথে সামঞ্জস্য রেখে PS ব্যবহারের দরকার কী, তবে এটি অনেকগুলি অক্ষর।

দশমিক পয়েন্টের পরে অঙ্কগুলি প্রতিস্থাপনের ফলে কয়েকটি অক্ষর বাঁচাতে সহায়তা করতে পারে:

[Math]::Truncate(1.5)
[Math]::Floor(1.5)
1.5-replace'\..*'

[Math]::Truncate($a)
[Math]::Floor($a)
$a-replace'\..*'
$a.split('.')[0]        # literal character split, not regex pattern split

3

একটি অ্যারে বিপরীত

অনেকগুলি চ্যালেঞ্জের কাজে আসে যেখানে আউটপুটটি কোনও ফ্যাশনটিতে মিরর করা হয়।

ধরুন আপনার আছে

$a=1,2,3,4,5

Traditionalতিহ্যবাহী বিপরীত পদ্ধতিটি দীর্ঘ, বিরক্তিকর এবং তাত্ক্ষণিকভাবে ব্যবহারের জন্য পাইপলাইনে অ্যারে ছাড়বে না।

[array]::reverse($a)

বিপরীত ক্রমে সরাসরি অ্যারেতে সূচক তৈরি করা কয়েক বাইট সংরক্ষণ করে, যেহেতু এটি পাইপলাইনে ফলাফল রাখে, তবে এটি আরও দীর্ঘ:

$a[($a.count-1)..0]

পরিবর্তে, একটি লুপ চেষ্টা করুন

$a|%{$a[-++$i]}

বিপরীতে সূচকগুলি ভাল কাজ করে যখন গণনার জন্য উপরের সীমা থাকে
জয়ে

3

পাওয়ারশেল কোর 6 দিয়ে শুরু করে আপনি অক্ষরের জন্যও ব্যাপ্তি ব্যবহার করতে পারেন:

'a'..'z'

যা আরও বেশি জটিলকে প্রতিস্থাপন করতে পারে

0..25|%{[char]($_+97)}

ওহ, এটি খুব কার্যকর আসতে চলেছে।
অ্যাডমবর্কবার্ক

1
[char[]](65..90)বর্ণমালা উত্পন্ন করার একটি সহজ উপায়
ভেস্কাহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.