পাওয়ারশেলে সমাবেশগুলি কীভাবে লোড করবেন?


153

নিম্নলিখিত পাওয়ারশেল কোড

#Get a server object which corresponds to the default instance
$srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
... rest of the script ...

নিম্নলিখিত ত্রুটি বার্তা দেয়:

New-Object : Cannot find type [Microsoft.SqlServer.Management.SMO.Server]: make sure 
the assembly containing this type is loaded.
At C:\Users\sortelyn\ ... \tools\sql_express_backup\backup.ps1:6  char:8
+ $srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

ইন্টারনেটে প্রতিটি উত্তর লিখেছে যে আমাকে সমাবেশটি লোড করতে হবে - নিশ্চিতভাবেই আমি ত্রুটি বার্তাটি থেকে এটি পড়তে পারি :-) - প্রশ্নটি হ'ল:

আপনি কীভাবে সমাবেশটি লোড করবেন এবং স্ক্রিপ্টটি কাজ করবেন?

উত্তর:


179

LoadWithPartialNameঅবচয় করা হয়েছে। পাওয়ারশেল ভি 3 এর প্রস্তাবিত সমাধানটি Add-Typeসেমিডলেট ব্যবহার করা যেমন:

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll'

একাধিক বিভিন্ন সংস্করণ রয়েছে এবং আপনি একটি বিশেষ সংস্করণ বেছে নিতে চাইতে পারেন। :-)


1
ঠিক আছে আমি PowerShell3 ব্যবহার করি - এর মধ্যে অন্তর্ভুক্ত আদেশগুলি খুব জটিল বলে মনে হচ্ছে। আমি কেবল "ফাইলের নাম অন্তর্ভুক্ত" এর মতো কিছু আশা করব।
ব্যাক্সটার

6
পাওয়ারশেল কেস-সংবেদনশীল (যদি না আপনি এটি -cmatch, -ceq এর মতো অপারেটরদের সাথে কেস-সংবেদনশীল হতে বলেন)। সুতরাং কমান্ডের নাম এবং পরামিতিগুলিতে কেসিংয়ের বিষয়টি বিবেচনা করে না।
কীথ হিল

5
হ্যাঁ. msdn.microsoft.com/en-us/library/12xc5368(v=vs.110).aspx উপরের নোটটি দেখুন - This API is now obsolete. অবশ্যই, এটি লোকেদের এটি ব্যবহার থেকে বিরত রাখে না।
কিথ হিল

2
যদিও এটি প্রযুক্তিগতভাবে সঠিক যা অবমূল্যায়ন করাLoadWithPartialName হয়েছে, কারণগুলি ( ব্লগস.এমএসডন.কম / বি /সুউক / আর্কাইভ / ২০০৩ / ৩০ / ৩০ / ৫7১9৯.এসপিএক্সে বর্ণিত হিসাবে ) স্পষ্টভাবে একটি ইন্টারেক্টিভ পাওয়ারশেল সেশনের জন্য প্রয়োগ করবেন না don't আমি আপনাকে একটি নোট যুক্ত করার পরামর্শ দিচ্ছি যে ইন্টারেক্টিভ পাওয়ারশেল ব্যবহারের জন্য এপিআই ঠিক আছে।
মিশা ওয়েইডম্যানম্যান

বেশিরভাগ সময়, আমার এসএমও সমাবেশে কোনও সমস্যা হয় না তবে মাঝে মাঝে আমাকে পাওয়ারশেলটি মেরে ফেলতে হয় এবং যখন আমি করি তখন আমার এসএমও লোডিংয়ের সমস্যা শুরু হয় having অ্যাড-টাইপ-প্যাথ সংশোধন করে।
নিকোলাস ডি ফন্টেনে

73
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")

8
এটি একটি প্রতিস্থাপন ছাড়া অবচয় করা খুব দরকারী! আমার দল 2008 এবং 2012 ক্লায়েন্ট সরঞ্জামগুলির মিশ্রণ ব্যবহার করে। আনাড়ি সংস্করণ-ফ্যালব্যাক যুক্তি যুক্ত না করে আমার পাওয়ারশেল স্ক্রিপ্টগুলি আমার সমস্ত দলের জন্য কাজ করার একমাত্র উপায়।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

4
আপনি Out-Nullযদি জিএসি স্টাফ প্রতিধ্বনি করতে না চান তবে আপনি আউটপুটটি পাইপ করতে পারেন।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

3
@ বাক্সটার - আপনার এই উত্তরটি বা কেথের গ্রহণ করা উচিত এবং এই প্রশ্নের উত্তর চিহ্নিত করা উচিত।
জয়কুল

3
আমি [অকার্যকর] [সিস্টেম.আরফ্লেশন.অ্যাস্পেসেশন] :: লোডউইথ পার্টিশিয়াল নেম ("মাইক্রোসফট.সক্ল্যাওয়ার সার্ভার.স্মো")
এল

@ আইইনএল্ডার "আনাড়ি সংস্করণ-ফ্যালব্যাক যুক্তি" আপনি বলেছেন যে আপনি সংস্করণে অসম্পূর্ণতা না চালানো পর্যন্ত! বলা মুশকিল Add-Type -Path [...]; if (!$?) { Add-Type -Path [...] } elseif [...]
বেকন বিটস

44

বেশিরভাগ লোকেরা এখন System.Reflection.Assembly.LoadWithPartialNameঅবধি জানেন যে এটি হ্রাস করা হয়েছে, তবে দেখা যাচ্ছে যে এর Add-Type -AssemblyName Microsoft.VisualBasic চেয়ে ভাল আচরণ করে নাLoadWithPartialName :

আপনার সিস্টেমের প্রসঙ্গে আপনার অনুরোধটিকে বিশ্লেষণের জন্য কোনও প্রচেষ্টা করার পরিবর্তে [অ্যাড-টাইপ] "আংশিক নাম" "পুরো নাম" তে অনুবাদ করার জন্য একটি স্থিতিশীল, অভ্যন্তরীণ সারণীর দিকে তাকান।

যদি আপনার "আংশিক নাম" তাদের টেবিলে উপস্থিত না হয়, আপনার স্ক্রিপ্ট ব্যর্থ হবে।

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

আপনি যে সংস্করণগুলি ইনস্টল করেছেন সেগুলি যদি টেবিলের অপ্রচলিত সংস্করণের চেয়ে সমস্ত নতুন হয় তবে আপনার স্ক্রিপ্টটি ব্যর্থ হবে।

অ্যাড-টাইপের কোনও "আংশিক নাম" এর মতো বুদ্ধিমান পার্সার নেই .LoadWithPartialNames

মাইক্রোসফ্ট যা বলেছে আপনি আসলে করণীয় তা হ'ল:

Add-Type -AssemblyName 'Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

অথবা, আপনি যদি পথটি জানেন তবে এরকম কিছু:

Add-Type -Path 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.VisualBasic\v4.0_10.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualBasic.dll'

সমাবেশের জন্য প্রদত্ত সেই দীর্ঘ নামটি শক্তিশালী নাম হিসাবে পরিচিত , যা সংস্করণ এবং সমাবেশ উভয়েরইই অনন্য এবং এটি কখনও কখনও পুরো নাম হিসাবেও পরিচিত।

তবে এর ফলে কয়েকটি প্রশ্নের উত্তর দেওয়া যায় না:

  1. প্রদত্ত আংশিক নাম দিয়ে আমার সিস্টেমে আসলে কী বোঝা যাচ্ছে তার শক্ত নামটি আমি কীভাবে নির্ধারণ করব?

    [System.Reflection.Assembly]::LoadWithPartialName($TypeName).Location; [System.Reflection.Assembly]::LoadWithPartialName($TypeName).FullName;

এগুলিও কাজ করা উচিত:

Add-Type -AssemblyName $TypeName -PassThru | Select-Object -ExpandProperty Assembly | Select-Object -ExpandProperty FullName -Unique
  1. যদি আমি চাই যে আমার স্ক্রিপ্টটি সর্বদা একটি .dll এর একটি নির্দিষ্ট সংস্করণ ব্যবহার করে তবে আমি এটি কোথায় ইনস্টল করেছি তা সম্পর্কে নিশ্চিত হতে পারি না, আমি কীভাবে নির্ধারণ করব যে শক্তিশালী নামটি কী .dll থেকে আছে?

    [System.Reflection.AssemblyName]::GetAssemblyName($Path).FullName;

বা:

Add-Type $Path -PassThru | Select-Object -ExpandProperty Assembly | Select-Object -ExpandProperty FullName -Unique
  1. আমি যদি শক্ত নামটি জানি, তবে আমি কীভাবে। Dll পথ নির্ধারণ করব?

    [Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a').Location;

  2. এবং, অনুরূপ শিরাগুলিতে, আমি যদি ব্যবহার করছি তার প্রকারের নামটি যদি আমি জানি তবে কীভাবে আমি জানি যে এটি কী সমাবেশ থেকে আসছে?

    [Reflection.Assembly]::GetAssembly([Type]).Location [Reflection.Assembly]::GetAssembly([Type]).FullName

  3. কীভাবে অ্যাসেম্বলিগুলি উপলব্ধ তা আমি কীভাবে দেখতে পারি?

আমি জিএসি পাওয়ারশেল মডিউলটির পরামর্শ দিই । Get-GacAssembly -Name 'Microsoft.SqlServer.Smo*' | Select Name, Version, FullNameবেশ ভাল কাজ করে।

  1. যে তালিকাটি Add-Typeব্যবহার করে তা কীভাবে দেখতে পাব ?

এটি কিছুটা জটিল। । নেট প্রতিফলক (পাওয়ারশেল কোর 6.0 এর জন্য নীচের আপডেটটি দেখুন) দিয়ে পাওয়ারশেলের যে কোনও সংস্করণে এটি কীভাবে অ্যাক্সেস করা যায় তা আমি বর্ণনা করতে পারি।

প্রথমে কোন পাঠাগারটি Add-Typeএসেছে তা নির্ধারণ করুন:

Get-Command -Name Add-Type | Select-Object -Property DLL

আপনার প্রতিফলক দিয়ে ফলাফল ডিএলএল খুলুন। আমি এটির জন্য আইএলএসপিএস ব্যবহার করেছি কারণ এটি ফ্লসস , তবে যে কোনও সি # প্রতিফলকের কাজ করা উচিত। সেই লাইব্রেরিটি খুলুন এবং দেখুন Microsoft.Powershell.Commands.Utility। অধীনে Microsoft.Powershell.Commands, সেখানে থাকা উচিত AddTypeCommand

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

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


তৃতীয় উত্তরহীন প্রশ্ন: আমি যদি একটি নির্দিষ্ট সংস্করণ প্রয়োজন না চাই?
jpmc26

1
@ jpmc26 ঠিক আছে, আপনি কেবল ব্যবহার করতে পারেন Add-Typeবা LoadWithPartialName(), তবে আপনার সচেতন হওয়া দরকার যে পূর্ববর্তী সংস্করণগুলিতে 100% সামঞ্জস্যপূর্ণ হতে চলেছে না এবং পরবর্তীটি একটি অপ্রচলিত পদ্ধতি। অন্য কথায়,। নেট আপনি যে লাইব্রেরিটি লোড করেন সেটির সংস্করণটি আপনার যত্ন নিতে চায় et
বেকন বিট

@ বাকনবিটস জেএমপিসি 26 এর প্রশ্নের সম্পূর্ণ উত্তরটি হ'ল আপনি পাওয়ারশেল 5 বা পাওয়ারশেল 6 এ আছেন কিনা তার উপর নির্ভর করে, লোড করা সমাবেশটি আলাদা হতে পারে। জেএসওএন.এনইটের অ্যাজুরে পিএস ফাংশনগুলির সাথে এই সমস্যা রয়েছে।
জন জাবরোস্কি 21

@ বাকনবিটস এটি পাওয়ারশেলের একটি সত্যই গভীর গভীর ডুব। আপনি একটি বই লেখা উচিত।
জন জাব্রোস্কি

1
@ কলবক্যানিয়ন কারণ সেই ক্ষেত্রে আপনার সাধারণত ব্যবহার করা উচিত Add-Type -Path, যা উল্লিখিত দ্বিতীয় কোড, বা Assembly.LoadFrom()যা আপনার জন্য নির্ভরতা সমাধান করে (এবং যতদূর আমি বলতে পারি, এটি কী Add-Type -Pathব্যবহার করে)। আপনার একমাত্র সময়টি ব্যবহার Assembly.LoadFile()করা উচিত হ'ল যদি আপনার একাধিক অ্যাসেম্বলিগুলি লোড করার প্রয়োজন হয় যা একই পরিচয় রয়েছে তবে বিভিন্ন পাথ। এটি একটি অদ্ভুত পরিস্থিতি।
বেকন বিটস

23

আপনি যদি পাওয়ার শেল সেশনের সময়কালে কোনও অ্যাসেমব্লিকে লক না করে লোড করতে চান তবে এটি ব্যবহার করুন:

$bytes = [System.IO.File]::ReadAllBytes($storageAssemblyPath)
[System.Reflection.Assembly]::Load($bytes)

$storageAssemblyPathআপনার সমাবেশের ফাইলপথটি কোথায় ।

আপনার সেশনের মধ্যে যদি রিসোর্সগুলি পরিষ্কার করতে হয় তবে এটি বিশেষভাবে কার্যকর। উদাহরণস্বরূপ একটি স্থাপনার স্ক্রিপ্টে।


1
Ant 👍 👍 কল্পনাপ্রসূত। কারণ ভিজ্যুয়াল স্টুডিওতে, পাওয়ারশেল ডিবাগ করার সময়, পিএস সেশনটি কার্যকর হওয়ার পরে প্রায় স্থির থাকে (পাওয়ারশেলটুলসপ্রসেসহোস্টের মাধ্যমে)। এই পদ্ধতির এটি স্থির করে। ধন্যবাদ।
সিজেবিএস

15

পাওয়ারশেল ভি 1, ভি 2 এবং ভি 3-তে সমাবেশগুলি লোড করার অসংখ্য উদাহরণ সহ কয়েকটি ব্লগ পোস্ট এখানে রয়েছে।

উপায়গুলির মধ্যে রয়েছে:

  • একটি উত্স ফাইল থেকে গতিশীল
  • গতিশীলভাবে একটি সমাবেশ থেকে
  • অন্যান্য কোডের ধরণগুলি, যেমন এফ #

v1.0 পাওয়ারশেল সেশনে .NET এসেম্বলিগুলি কীভাবে লোড করবেন
v2.0 পাওয়ারশেল স্ক্রিপ্টগুলিতে সিএসএআরপি (সি #) কোড ব্যবহার করে 2.0
v3.0 উইন্ডোজ পাওয়ারশেলের নেট ফ্রেমওয়ার্ক অ্যাসেমব্লিগুলি ব্যবহার করে


10

আপনি পুরো * .dll সমাবেশটি লোড করতে পারেন

$Assembly = [System.Reflection.Assembly]::LoadFrom("C:\folder\file.dll");

3

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

শেষ ঘন্টা:

Import-module SQLPS

দ্রষ্টব্য: এসকিউএলপিএস হ্রাস করা হয়েছে তা লক্ষ করার জন্য জেসনকে ধন্যবাদ

পরিবর্তে চালান:

Import-Module SqlServer

অথবা

Install-Module SqlServer

2
এই পদ্ধতির ব্যবহার কারও জন্য, এফওয়াইআই যা sqlpsমডিউলটির পক্ষে অবহিত করা হয়েছেsqlserver
জেসন


2

আপনি ব্যবহার করতে পারে LoadWithPartialName। তবে, তারা যেমন বলেছিল তেমন অবমূল্যায়ন করা হয়।

আপনি সত্যিই সাথে যেতে পারেন Add-Typeএবং অন্যান্য উত্তরগুলি ছাড়াও, আপনি .dll ফাইলের পুরো পথ নির্দিষ্ট করতে না চাইলে আপনি কেবল সহজভাবে করতে পারেন:

Add-Type -AssemblyName "Microsoft.SqlServer.Management.SMO"

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

Add-Type -AssemblyName "System.Windows.Forms"

এমএসডিএন সাইটে আপনি নির্দিষ্ট শ্রেণীর অন্তর্গত নির্দিষ্ট সমাবেশের নামটি জানতে পারেন:

নির্দিষ্ট শ্রেণীর অন্তর্গত সমাবেশ নাম সন্ধানের উদাহরণ


2

আপনার নীচের বৈশিষ্ট্যগুলি ক্রমে ইনস্টল করা আছে তা নিশ্চিত করুন

  1. এসকিউএল সার্ভারের জন্য মাইক্রোসফ্ট সিস্টেম সিএলআর প্রকার
  2. মাইক্রোসফ্ট এসকিউএল সার্ভার শেয়ারড ম্যানেজমেন্ট অবজেক্টস
  3. মাইক্রোসফ্ট উইন্ডোজ পাওয়ারশেল এক্সটেনশানস

এছাড়াও আপনার বোঝা লাগতে পারে

Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll"
Add-Type -Path "C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.SqlWmiManagement.dll"

আমি সমাবেশটি লোড করার চেষ্টা করে এক সপ্তাহ কাটিয়েছি এবং বিবৃতিতে কোনও আউটপুট দেখতে পেল না যা সেগুলি বোঝায় তবে আমি যখন এটি ব্যবহার করার চেষ্টা করেছি তখন আমার ত্রুটি হয়েছিল hen যখন আমি এই তিনটি জিনিস ইনস্টল করেছি, এটি কাজ করেছিল। - ধন্যবাদ
pparas

0

শীর্ষে সমাবেশের রেফারেন্স যুক্ত করুন।

#Load the required assemblies SMO and SmoExtended.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null

আপনি এটি থেকে একটি উদাহরণ তৈরি করতে পারেন?
endo.anaconda

1
পাওয়ারশেল স্ক্রিপ্টের শুরুতে আপনার এটি যুক্ত করা দরকার। উদাহরণস্বরূপ: একটি ডেটাবেসটির ব্যাকআপ তৈরি করুন: [সিস্টেম.রিফ্লেশন.অসাধারণ] :: লোডউইথ পার্টিশনাল নেম ("মাইক্রোসফ্ট.এসএলএল সার্ভার.এসএমও") | আউট-নাল [সিস্টেম.রিফ্লেশন.অ্যাস্পেসেশন] :: লোডউইথ পার্টিশিয়াল নেম ("মাইক্রোসফ্ট.এসএলএল সার্ভার.স্মো এক্সটেন্ডেড") | আউট-নুল $ এসকিউএল সার্ভার = রিড-হোস্ট-প্রম্পট 'এসকিউএল সার্ভারের নাম (alচ্ছিক)' যদি ([স্ট্রিং] :: ইসনুলআরওয়াইটসেস ($ এসকিউএল সার্ভার)) {$ এসকিউএল সার্ভার = "এক্সএক্সএক্স"; $ $ এসকিউএলডিবিএন = রিড-হোস্ট-প্রম্পট ' এসকিউএল ডাটাবেস নাম (alচ্ছিক) 'আইএফ ([স্ট্রিং] :: ইসনুলআরওয়েটস্পেস ($ এসকিউএলডিবি নাম)) {$ এসকিউএলডিবিএন = "এক্সএক্সএক্স"; $ QL এসকিউএলগিন = রিড-হোস্ট-প্রম্পট' লগইন '
অমৃতা বসু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.