পাওয়ারশেলে, আমি কীভাবে কোনও ফাইলের কোনও ফাংশন সংজ্ঞায়িত করব এবং পাওয়ারশেল কমান্ডলাইন থেকে কল করব?


242

আমার কাছে একটি .ps1 ফাইল রয়েছে যাতে আমি কাস্টম ফাংশনগুলি সংজ্ঞায়িত করতে চাই।

কল্পনা করুন যে ফাইলটি বলা হয় MyFunitions.ps1, এবং লিখিত সামগ্রীটি নীচে রয়েছে:

Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

এই স্ক্রিপ্টটি চালানোর জন্য এবং তাত্ত্বিকভাবে এ 1 ফাংশনটি নিবন্ধিত করতে, আমি ফোল্ডারে ন্যাভিগেট করি যেখানে .ps1 ফাইলটি থাকে এবং ফাইলটি চালায়:

.\MyFunctions.ps1

এই ফলাফলগুলি:

Installing functions
Done

তবুও, আমি যখন এ 1 কল করার চেষ্টা করি তখন আমি কেবল ত্রুটি পেয়েছি যে এই নামটি দিয়ে কোনও আদেশ / ক্রিয়াকলাপ নেই:

The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling
 of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:3
+ A1 <<<<
    + CategoryInfo          : ObjectNotFound: (A1:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

আমার অবশ্যই কিছু পাওয়ারশেল ধারণার ভুল বোঝাবুঝি। আমি স্ক্রিপ্ট ফাইলগুলিতে ফাংশন সংজ্ঞায়িত করতে পারি না?

নোট করুন যে আমি ইতিমধ্যে আমার বাস্তবায়ন নীতিটি 'রিমোটসাইনড' এ সেট করে রেখেছি। এবং আমি ফাইলের নামের সামনে একটি বিন্দু ব্যবহার করে .ps1 ফাইল চালানো জানি: \ myFile.ps1


পিএস স্টার্টআপে লোডিং ফাংশনগুলির জন্য দুর্দান্ত লিঙ্ক: স্যান্ডফেল্ড.নেট
অ্যান্ড্রু

উত্তর:


262

পাওয়ারশেল কমান্ড লাইনে এটি ব্যবহার করে দেখুন:

. .\MyFunctions.ps1
A1

ডট অপারেটর স্ক্রিপ্ট অন্তর্ভুক্ত জন্য ব্যবহৃত হয়।


11
ঠিক আছে, এর অর্থ "শিশু প্রসঙ্গে পরিবর্তে বর্তমান প্রসঙ্গে এটি চালান" means
জেসনমারচার

15
এর অর্থ এই ফাইলটির বিষয়বস্তু source বাশ হিসাবে একই । ss64.com/bash/period.html
inquam

2
এটি চালানো না হলে (কমপক্ষে আইএসই থেকে) যদিও এটি খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে না \ এটি উপলব্ধ করার জন্য প্রথমে MyFunitions.ps1। আমি পাওয়ারশেল.এক্সে থেকে কঠোরভাবে চলার বিষয়ে নিশ্চিত নই।
মাইক চিল

1
আমি ভেবেছিলাম যে এটি স্ব-স্বজ্ঞাত যে ডট-সোর্সিং স্ক্রিপ্টের পরিবর্তে পিডব্লিউডের সাথে সম্পর্কিত পথটি ব্যবহার করেছে, সুতরাং আমি লোকদের পরিবর্তে জোগের উত্তরটি সন্ধান করার এবং মডিউলগুলি ব্যবহার করার জন্য অনুরোধ করব।
স্পার্ক

5
@Spork . "$PSScriptRoot\MyFunctions.ps1"। V3 এর শুরু, দেখতে আগে Availalbe stackoverflow.com/questions/3667238/... । এটি খুব সাধারণ।
yzorg

231

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

সুতরাং প্রথমে, .ps1 ফাইলটির নতুন নামকরণ করুন এতে আপনার সমস্ত ফাংশন মাইফুনিউশনস.পিএসএম 1 (আপনি সবেমাত্র একটি মডিউল তৈরি করেছেন!) করুন। মডিউলটি সঠিকভাবে লোড করার জন্য, আপনাকে ফাইলটি সহ কিছু নির্দিষ্ট জিনিস করতে হবে। প্রথমে আমদানি-মডিউলটি মডিউলটি দেখতে (আপনি শেলটিতে মডিউলটি লোড করার জন্য এই সেন্টিমলেটটি ব্যবহার করেন), এটি একটি নির্দিষ্ট স্থানে থাকতে হবে। মডিউল ফোল্ডারের ডিফল্ট পাথ হ'ল হোম \ ডকুমেন্টস \ উইন্ডোজপাওয়ারশেল \ মডিউল।

সেই ফোল্ডারে মাইফুনিউশনস নামে একটি ফোল্ডার তৈরি করুন এবং এর মধ্যে মাইফুনিউশনস.পিএসএম 1 ফাইল রাখুন (মডিউল ফাইলটি অবশ্যই পিএসএম 1 ফাইলের ঠিক একই নামের একটি ফোল্ডারে থাকতে হবে)।

এটি হয়ে গেলে, পাওয়ারশেলটি খুলুন এবং এই আদেশটি চালান:

Get-Module -listavailable

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

মডিউলটি ব্যবহার করতে, শেলটিতে নিম্নোক্ত টাইপ করুন (বা আপনার $ প্রোফাইলে এই লাইনটি রাখুন, বা স্ক্রিপ্টে এটি প্রথম লাইন হিসাবে রেখে দিন):

Import-Module MyFunctions

আপনি এখন আপনার ফাংশন পরিচালনা করতে পারেন। এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল একবার আপনার সেখানে 10-15 ফাংশন হয়ে গেলে আপনি কোনও দম্পতির নাম ভুলে যাবেন। আপনার যদি মডিউলে থাকে, আপনি আপনার মডিউলে সমস্ত ফাংশনগুলির একটি তালিকা পেতে নিম্নলিখিত কমান্ডটি চালাতে পারেন:

Get-Command -module MyFunctions

এটি বেশ মিষ্টি, এবং সামনের দিকে সেট আপ করতে যে ক্ষুদ্রতর প্রচেষ্টা লাগবে তা মূল্যবান।


6
যদি আপনার ফাংশনগুলি কেবলমাত্র সেই প্রদত্ত পাওয়ার শেল অ্যাপ্লিকেশনটির জন্য প্রাসঙ্গিক হয় তবে কী হবে? আমি বলতে চাইছি, আপনি যদি কোথাও কোনও কাজ করার জন্য পিএস 1 এর একটি প্যাকেজ ইনস্টল করেন তবে আপনি নিজের প্রোফাইলে প্রতিটি ফাংশন চান না, তাই না?
ইয়ান প্যাট্রিক হিউজেস

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

16
পিএসএম 1 ফাইলের ঠিক একই নামের একটি ফোল্ডারে মডিউল ফাইল থাকা প্রয়োজন। এটি করা যেতে পারে Import-Module .\buildsystem\PSUtils.psm1
মাইকেল ফ্রেইজিম

2
@ মিশেলফ্রিজেম যদি এটি কেবলমাত্র এক্সটেনশানটির .সাথে পরিবর্তন Import-Moduleএবং নাম পরিবর্তনের মতো সহজ হয় এবং মডিউলগুলি নির্দিষ্ট ফোল্ডারে রাখার প্রয়োজন হয় না, যেমন আমি এটি চাই যে কোনও ডিরেক্টরিতে ডট সোর্সিংয়ের মতো রাখতে পারি, এমনকি স্কুপিংয়ের জন্য আসা সুবিধাগুলি বিবেচনা করে মডিউলগুলিতে ডট সোর্সিং করার কোনও কারণ আছে? (অবশ্যই যদি সেই সুযোগগুলি "বিষয়গুলি" তবে আপনি চান
আব্দুল

2
আবদুল, ডট সোর্সিং সহজ, মডিউলগুলি আরও বেশি শক্তিশালী। দেখুন stackoverflow.com/questions/14882332/...
মাইকেল Freidgeim

17

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

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

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


এফডাব্লুআইডাব্লু, মডিউলে স্ক্রিপ্ট চালানোর জন্য আপনাকে সেই জিনিসগুলির কোনওটিই করতে হবে না।
নিক কক্স

@ নিককক্স আমি এর কয়েকটি উদাহরণ দেখতে পছন্দ করব। তোমার কি কিছু আছে? +10 যদি উদাহরণ কোনও ওএসএস প্রকল্প থেকে হয়। বিশেষত, পিএস মডিউলের একটি আপেক্ষিক পথে (পিএসমোডুলপথ নয় বা পিএসমোডুলপথটি কাস্টমাইজ করা ছাড়াই) লোড হওয়ার উদাহরণ এবং অ-তুচ্ছ উদাহরণ (যেমন মডিউলটিতে সাধারণ স্ক্রিপ্টের স্কোপিংয়ের চেয়ে বেশি সুবিধা রয়েছে)।
yzorg

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

আমি কোনও স্ক্রিপ্ট হিসাবে মডিউল হিসাবে এটি প্যাকেজিংয়ের তুলনামূলক দক্ষতা এবং কনসের বিষয়ে নিশ্চিত নই: সম্ভবত লেখকের সাথে এটিই আলোচনা করতে পারে? আমার মনে হয় এর ব্যর্থতা Get-Command -Module FluentMigrator.PowerShellবেশ সুন্দর?
নিক কক্স

@ নিককক্স আপনি সেই কমান্ডের মডিউলটির পথটি পুরোপুরি যোগ্যতা অর্জন করেন নি, যার অর্থ আপনি যদি না কোনও হয় বৈশ্বিক মডিউল ফোল্ডারে মডিউলটি অনুলিপি করেন বা আপনার জিআইটি ফোল্ডারটিকে বৈশ্বিক পরিবেশে পরিবর্তনশীল হিসাবে যুক্ত না করেন it আমি মনে করি আপনি কেবল আমার বক্তব্য প্রদর্শন করেছেন rated
yzorg

7

আপনি অবশ্যই স্ক্রিপ্ট ফাইলগুলিতে ফাংশনগুলি সংজ্ঞায়িত করতে পারেন (আমি তারপরে লোডের উপর আমার পাওয়ারশেল প্রোফাইলের মাধ্যমে এগুলি লোড করব)।

প্রথমে আপনার চালনাটি ফাংশনটি লোড হয়েছে তা নিশ্চিত করার জন্য আপনাকে পরীক্ষা করতে হবে:

ls function:\ | where { $_.Name -eq "A1"  }

এবং এটি তালিকায় উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন (1 এর তালিকা হওয়া উচিত!), তবে আপনি কী আউটপুট পাবেন তা আমাদের জানান!


1
পাওয়ারশেলে ফাংশনটিকে একটি ডিরেক্টরি হিসাবে বিবেচনা করা হয় তাই এটি c: \ বা d: saying বলার মতোই \ সমানভাবে আপনি এটি ব্যাকস্ল্যাশ ছাড়া কাজ করবে তাই ls ফাংশন: | যেখানে {$ _। নাম -eq "এ 1"}
জনি

4

আপনি এতে ফাংশন যুক্ত করতে পারেন:

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

একটি ফাংশন উপলব্ধ হবে।


3

আপনার ফাইলে যদি কেবলমাত্র একটি মূল ফাংশন থাকে যা আপনি কল করতে / প্রকাশ করতে চান তবে আপনি কেবল ফাইলটি শুরু করতে পারেন:

Param($Param1)

এরপরে আপনি এটিকে কল করতে পারেন যেমন:

.\MyFunctions.ps1 -Param1 'value1'

যদি আপনি সহজেই ফাংশনটি আমদানি না করে কেবল সেই ফাংশনটিতে কল করতে চান এটি এটি আরও বেশি সুবিধাজনক করে তুলেছে।


আমার এও লক্ষ্য করা উচিত যে আমি আজ আবিষ্কার করেছি (আমার একজন সহকর্মী আমাকে বলার পরে) যে পাওয়ারশেল স্বয়ংক্রিয়ভাবে [CmdletBinding()]বৈশিষ্ট্যটি যুক্ত করে এবং এটিকে একটি উন্নত ফাংশনে বিনামূল্যে আপগ্রেড করে। :-)
বার্গমিস্টার

1

ধরে নিচ্ছি আপনার কাছে ডামি-নেম.এসপিএম 1 নামে একটি মডিউল ফাইল রয়েছে যার ফাংশন-ডাম্ব () নামক একটি পদ্ধতি রয়েছে

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.