পাওয়ারশেল আইএসই এর ভিতরে থাকা অন্য PS1 স্ক্রিপ্ট থেকে পাওয়ারশেল স্ক্রিপ্ট PS1 কল করুন


137

আমি পাওয়ারশেল আইএসই-র ভিতরে একটি দ্বিতীয় মাইস্ক্রিপ্ট 2.ps1 স্ক্রিপ্টের মধ্যে একটি মাইস্ক্রিপ্ট 1.ps1 স্ক্রিপ্টের জন্য কল কার্যকর করতে চাই।

মাইস্ক্রিপ্ট ২.ps1 এর মধ্যে নিম্নলিখিত কোডগুলি পাওয়ারশেল প্রশাসন থেকে সূক্ষ্মভাবে কাজ করে, তবে পাওয়ারশেল আইএসই-তে কাজ করে না:

#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1

আমি পাওয়ারশেল আইএসই থেকে MyScript2.ps1 সম্পাদন করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

'। \ MyScript1.ps1' শব্দটি একটি সেমিডলেট, ফাংশন, স্ক্রিপ্ট ফাইল বা অপারেবল প্রোগ্রামের নাম হিসাবে স্বীকৃত নয়। নামের বানানটি পরীক্ষা করুন বা কোনও পথ অন্তর্ভুক্ত থাকলে, पथটি সঠিক কিনা তা যাচাই করুন এবং আবার চেষ্টা করুন।

উত্তর:


83

কোনও স্ক্রিপ্টের অবস্থান সন্ধানের Split-Path $MyInvocation.MyCommand.Pathজন্য ব্যবহার করুন (স্ক্রিপ্ট প্রসঙ্গে আপনি এটি ব্যবহার করেছেন তা নিশ্চিত করুন)।

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

## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path

এখানে কিছু ফলাফল।

পিএস সি: \ ব্যবহারকারীগণ \ জেসনআর> \ স্ক্রিপ্টটেষ্ট.পিএস 1
ইনভোকেশননাম: \ স্ক্রিপ্টটেষ্ট.পিএস 1
পাথ: সি: \ ব্যবহারকারীরা \ জেসনআর \ স্ক্রিপ্টটেষ্ট.পিএস 1

পিএস সি: \ ব্যবহারকারীরা \ জেসনআর>। । \ ScriptTest.ps1
আমন্ত্রণ নাম:।
পাথ: সি: \ ব্যবহারকারীরা \ জেসনআর \ স্ক্রিপ্টটেষ্ট.পিএস 1

PS সি: \ ব্যবহারকারীরা \ জেসনআর> & "\ স্ক্রিপ্টটেষ্ট.পিএস 1"
আমন্ত্রণ নাম: এবং
পাথ: সি: \ ব্যবহারকারীরা \ জেসনআর \ স্ক্রিপ্টটেষ্ট.পিএস 1

ইন PowerShell 3.0 এবং পরে আপনি স্বয়ংক্রিয় পরিবর্তনশীল ব্যবহার করতে পারেন $PSScriptRoot:

## ScriptTest.ps1
Write-Host "Script:" $PSCommandPath
Write-Host "Path:" $PSScriptRoot
পিএস সি: \ ব্যবহারকারীগণ \ জারচার> \ স্ক্রিপ্টটেষ্ট.পিএস 1
স্ক্রিপ্ট: সি: \ ব্যবহারকারীগণ ar জ্যাচার \ স্ক্রিপ্টটেষ্ট.পিএস 1
পথ: সি: \ ব্যবহারকারী \ জার্চার

দেরিতে সংযোজন: আপনি যদি উদ্বিগ্ন হয়ে থাকেন তবে অ্যাবোট ভেরিয়েন্স (বা, আসলে "সলিড" কোড চান) আপনি সম্ভবত "লিখন-আউটপুট" ব্যবহার করতে চান "লিখন-হোস্ট" না।
KlaymenDK

20
উত্তরে স্প্লিট-পাথের উদাহরণ ব্যবহার দেখে ভাল হবে। আপনাকে অন্য স্ক্রিপ্টের ভিতরে একটি স্ক্রিপ্ট কল করাও সত্যই দেখানো দরকার।
জেরেমি

37

MyScript1.ps1 এর বর্তমান পথটি myScript2.ps1 এর মতো নয়। আপনি মাইস্ক্রিপ্ট 2.ps1 এর ফোল্ডার পাথটি পেতে এবং এটি মাইস্ক্রিপ্ট 1.ps1 এ সংযুক্ত করে এবং তারপরে এটি সম্পাদন করতে পারেন। উভয় স্ক্রিপ্ট একই স্থানে থাকতে হবে।

## MyScript2.ps1 ##
$ScriptPath = Split-Path $MyInvocation.InvocationName
& "$ScriptPath\MyScript1.ps1"

আমাকে কীভাবে $ MyInvocation ভেরিয়েবলটি শুরু করতে হবে?
নিকোলা সেলিয়েন্টো

আপনি করবেন না, এটি একটি স্বয়ংক্রিয় পরিবর্তনশীল।
শাই লেভি

এটি কাজ করে তবে ডাকা স্ক্রিপ্টটি বাস্তবায়নের আগে নিম্নলিখিত ত্রুটিটি পান: স্প্লিট-পাথ: 'পথ' প্যারামিটারে যুক্তি বাঁধতে পারে না কারণ এটি একটি খালি স্ট্রিং। 4 গৃহস্থালির কাজ: লাইন 25 + + $ ScriptPath = স্প্লিট-পাথ <<<< $ MyInvocation.InvocationName + + CategoryInfo: InvalidData: (:) [স্প্লিট-পাথ], ParameterBindingValidationException + + FullyQualifiedErrorId: ParameterArgumentValidationErrorEmptyStringNotAllowed, Microsoft.PowerShell.Commands.SplitPathCommand
নিকোলা সেলিয়েন্টো

একটি নতুন স্ক্রিপ্ট পুট তৈরি করুন: $ MyInvocation.InvocationName এতে এবং স্ক্রিপ্টটি চালান। আপনি কি স্ক্রিপ্টের পথ পাচ্ছেন?
শে লেভি

@ জেসনমারচার - পরিবর্তে কেন? আমি যতদূর জানি উভয় একই আউটপুট দিতে?
মনোজাল্ড

35

আমি myScript1.ps1 কল করছি myScript2.ps1 থেকে।

ধরে নিই যে স্ক্রিপ্ট উভয়ই একই স্থানে রয়েছে, প্রথমে এই কমান্ডটি ব্যবহার করে স্ক্রিপ্টের অবস্থানটি পান:

$PSScriptRoot

এবং, এরপরে, আপনি যে স্ক্রিপ্টটির নামটি কল করতে চান তা যুক্ত করুন:

& "$PSScriptRoot\myScript1.ps1"

এই কাজ করা উচিত.


3
& "$PSScriptRoot\myScript1.ps1"যথেষ্ট
ওয়েইহুই গুও

19

একটি লাইন সমাধান:

& ((Split-Path $MyInvocation.InvocationName) + "\MyScript1.ps1")

এটি দুর্দান্ত, তবে & '.\MyScript1.ps'স্ক্রিপ্টটি একই ডিরেক্টরিতে থাকলে কেন নয় ?
জোপিসি

3
এটি বর্তমান ডিরেক্টরিটি স্ক্রিপ্ট ডিরেক্টরি নয় ব্যবহার করছে। নিশ্চিত যে তারা প্রায়শই একই ... তবে সর্বদা না!
নোবেলাস

9

অন্য কোনও ফাইলে যুক্তি পাঠানোর জন্য উত্তরের জন্য এটি কেবল অতিরিক্ত তথ্য

যেখানে আপনি তর্ক আশা

PrintName.ps1

Param(
    [Parameter( Mandatory = $true)]
    $printName = "Joe"    
)


Write-Host $printName

কিভাবে ফাইল কল করতে হয়

Param(
    [Parameter( Mandatory = $false)]
    $name = "Joe"    
)


& ((Split-Path $MyInvocation.InvocationName) + "\PrintName.ps1") -printName $name

আপনি যদি কোনও ইনপুট সরবরাহ না করেন তবে এটি "জো" -কে ডিফল্ট হয়ে যাবে এবং এটি প্রিন্টনাম.পিএস 1 ফাইলের মুদ্রণ নাম হিসাবে যুক্তিরূপে প্রেরণ করা হবে যা "জো" স্ট্রিংটি মুদ্রণ করবে will


4

আপনি এর উত্তর ইতিমধ্যে খুঁজে পেতে পারেন, তবে আমি যা করি তা এখানে।

আমি সাধারণত আমার ইনস্টলেশন স্ক্রিপ্টগুলির শুরুতে এই লাইনটি রাখি:

if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2).  

তারপরে আমি script পিএসএসক্রিপ্ট রুট ভেরিয়েবলটি বর্তমান স্ক্রিপ্টের (অবস্থান) অবস্থান হিসাবে ব্যবহার করতে পারি, উদাহরণস্বরূপ নমুনা:

if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2).  

Try {
If (Test-Path 'C:\Program Files (x86)') {
    $ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise64_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x64.log`""
    Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop
    $Result= [System.Environment]::ExitCode
} Else {
    $ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x86.log`""
    Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop
    $Result= [System.Environment]::ExitCode
    }

} ### End Try block


Catch  {
    $Result = [System.Environment]::Exitcode
    [System.Environment]::Exit($Result)
   }
[System.Environment]::Exit($Result)

আপনার ক্ষেত্রে, আপনি প্রতিস্থাপন করতে পারেন

শুরু প্রক্রিয়া ... সাথে লাইন

দাওয়াত-এক্সপ্রেশন $ পিএসএস স্ক্রিপ্ট রুট \ স্ক্রিপ্টনাম.পিএস 1

আপনি মাইক্রোসফ্ট সাইটে Y MYINVOCATION এবং $ PSScriptRut স্বয়ংক্রিয় ভেরিয়েবলগুলি সম্পর্কে আরও পড়তে পারেন: https ://msdn.mic Microsoft.com/en-us/powershell/references/5.1/microsoft.powershell.core/about/about_automatic_variables


4

কলার হিসাবে একই ফোল্ডারে (বা এর সাবফোল্ডার) সহজেই কোনও স্ক্রিপ্ট ফাইল কার্যকর করতে আপনি এটি ব্যবহার করতে পারেন:

# Get full path to the script:
$ScriptRoute = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, "Scriptname.ps1"))

# Execute script at location:
&"$ScriptRoute"

3

আমার এই সমস্যা ছিল। আমি $MyInvocationএটি ঠিক করতে কোনও চালাক জিনিস ব্যবহার করি নি use আপনি যদি স্ক্রিপ্ট ফাইলটিতে ডান ক্লিক করে এবং নির্বাচন editকরে আইএসইটি খোলেন তবে আইএসইর মধ্যে থেকে দ্বিতীয় স্ক্রিপ্টটি খোলার পরে আপনি কেবলমাত্র সাধারণ ব্যবহার করে অন্যের কাছ থেকে আবেদন করতে পারেন \ স্ক্রিপ্ট.পিএস সিনট্যাক্স। আমার অনুমান যে ISE একটি বর্তমান ফোল্ডার ধারণা এবং এটি খোলার মত এটি বর্তমান ফোল্ডারটি স্ক্রিপ্টযুক্ত ফোল্ডারে সেট করে। আমি যখন অন্য ব্যবহারের থেকে অন্য স্ক্রিপ্টটি সাধারণ ব্যবহারে প্রার্থনা করি তখনই আমি ব্যবহার করি \। স্ক্রিপ্ট.পিএস 1 , আইএমও স্ক্রিপ্টটি ঠিকমতো আইএসইতে কাজ করার জন্য এটি পরিবর্তন করা ভুল ...


2

আমারও অনুরূপ সমস্যা হয়েছিল এবং এটি এইভাবে সমাধান করা হয়েছে।

আমার ওয়ার্কিং ডিরেক্টরিটি একটি সাধারণ স্ক্রিপ্ট ফোল্ডার এবং একই মূলের সার্ভারাল নির্দিষ্ট স্ক্রিপ্ট ফোল্ডার, আমাকে নির্দিষ্ট স্ক্রিপ্ট ফোল্ডারটি কল করতে হবে (যা নির্দিষ্ট সমস্যার প্যারামিটার দিয়ে সাধারণ স্ক্রিপ্ট বলে)। ওয়ার্কিং ডিরেক্টরি যেমন হয়

\Nico\Scripts\Script1.ps1
             \Script2.ps1
      \Problem1\Solution1.ps1
               \ParameterForSolution1.config
      \Problem2\Solution2.ps1
               \ParameterForSolution2.config

সলিউশন 1 এবং সলিউশন 2 প্যারামিটারফোর্ডসুলেশনে থাকা প্যারামিটার লোড করে স্ক্রিপ্টস ফোল্ডারে PS1 কে কল করে। পাওয়ারশেল ISE তে আমি এই কমান্ডটি চালাচ্ছি

.\Nico\Problem1\Solution1.PS1

এবং সলিউশন 1.পিএস 1 এর মধ্যে কোডটি হ'ল:

# This is the path where my script is running
$path = split-path -parent $MyInvocation.MyCommand.Definition

# Change to root dir
cd "$path\..\.."

$script = ".\Script\Script1.PS1"

$parametro = "Problem1\ParameterForSolution1.config"
# Another set of parameter Script1.PS1 can receive for debuggin porpuose
$parametro +=' -verbose'

Invoke-Expression "$script $parametro"

2

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

[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string[]]
$Computername,

[Parameter(Mandatory = $true)]
[DateTime]
$StartTime,

[Parameter(Mandatory = $true)]
[DateTime]
$EndTime
)

$ZAEventLogDataSplat = @{
    "Computername" = $Computername
    "StartTime"    = $StartTime
    "EndTime"      = $EndTime
}

& "$PSScriptRoot\Get-ZAEventLogData.ps1" @ZAEventLogDataSplat

উপরেরটি একটি নিয়ামক স্ক্রিপ্ট যা 3 টি পরামিতি গ্রহণ করে। এগুলি পরম ব্লকে সংজ্ঞায়িত করা হয়েছে। এরপরে নিয়ামক স্ক্রিপ্টটি get-ZAEventLogData.ps1 নামের স্ক্রিপ্টটিকে কল করে। উদাহরণস্বরূপ, এই স্ক্রিপ্টটি একই 3 টি পরামিতি গ্রহণ করে। যখন কন্ট্রোলার স্ক্রিপ্ট কাজ করে এমন স্ক্রিপ্টে কল করে, তখন এটি কল করে প্যারামিটারগুলি পাস করতে হবে। উপরেরটি দেখায় যে আমি কীভাবে স্প্ল্যাটিং করে এটি করি।


1

কীভাবে আপনি আপনার স্ক্রিপ্টগুলির অভ্যন্তরে পাওয়ারশেল বিল্ট-ইন স্ক্রিপ্টগুলি চালাবেন?

আপনি কীভাবে অন্তর্নির্মিত স্ক্রিপ্টগুলি ব্যবহার করেন

Get-Location
pwd
ls
dir
split-path
::etc...

এগুলি আপনার কম্পিউটার দ্বারা চালিত হয়, স্বয়ংক্রিয়ভাবে স্ক্রিপ্টের পথটি পরীক্ষা করে।

একইভাবে, আমি কেবল স্ক্রিপ্ট-ব্লকে স্ক্রিপ্টের নাম রেখে আমার কাস্টম স্ক্রিপ্টগুলি চালাতে পারি

::sid.ps1 is a PS script I made to find the SID of any user
::it takes one argument, that argument would be the username
echo $(sid.ps1 jowers)


(returns something like)> S-X-X-XXXXXXXX-XXXXXXXXXX-XXX-XXXX


$(sid.ps1 jowers).Replace("S","X")

(returns same as above but with X instead of S)

পাওয়ারশেল কমান্ড লাইনে যান এবং টাইপ করুন

> $profile

এটি এমন কোনও ফাইলে ফিরে আসবে যা আমাদের পাওয়ারশেল কমান্ড লাইনটি আপনি যখনই অ্যাপ্লিকেশনটি খোলেন ততক্ষণে কার্যকর হবে।

এটি দেখতে এটি দেখতে হবে

C:\Users\jowers\OneDrive\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

নথিগুলিতে যান এবং দেখুন আপনার ইতিমধ্যে একটি উইন্ডোজপাওয়ারশেল ডিরেক্টরি রয়েছে কিনা। আমি তাই করিনি

> cd \Users\jowers\Documents
> mkdir WindowsPowerShell
> cd WindowsPowerShell
> type file > Microsoft.PowerShellISE_profile.ps1

আমরা এখন স্ক্রিপ্ট তৈরি করেছি যা প্রতিবার পাওয়ারশেল অ্যাপ্লিকেশনটি খোলার সময় চালু হবে।

আমরা এর কারণটি হ'ল যাতে আমরা আমাদের নিজস্ব ফোল্ডার যুক্ত করতে পারি যা আমাদের সমস্ত কাস্টম স্ক্রিপ্টগুলিকে ধারণ করে। আসুন আমরা সেই ফোল্ডারটি তৈরি করব এবং ম্যাক / লিনাক্সের স্ক্রিপ্টগুলি যে ডিরেক্টরিতে রয়েছে সেগুলির পরে আমি এটি "বিন" নামকরণ করব।

> mkdir \Users\jowers\Bin

এখন আমরা $env:pathঅ্যাপ্লিকেশনটি খোলার সময় ডিরেক্টরিটি আমাদের চলকটিতে যুক্ত করা চাই তাই ডিরেক্টরিতে ফিরে যান WindowsPowerShellএবং

> start Microsoft.PowerShellISE_profile.ps1

তারপরে এটি যুক্ত করুন

$env:path += ";\Users\jowers\Bin"

এখন পর্যন্ত শেলটি স্বয়ংক্রিয়ভাবে আপনার আদেশগুলি সন্ধান করবে, যতক্ষণ না আপনি "স্ক্রিপ্টগুলি" "বিন" ডিরেক্টরিতে সংরক্ষণ করেন save

পাওয়ারশেলটি পুনরায় চালু করুন এবং এটি কার্যকর হওয়া প্রথম স্ক্রিপ্টগুলির মধ্যে একটি হওয়া উচিত।

আপনার পাথ ভেরিয়েবলটিতে আপনার নতুন ডিরেক্টরিটি দেখতে পুনরায় লোড করার পরে কমান্ড লাইনে এটি চালান:

> $env:Path

এখন আমরা আমাদের স্ক্রিপ্টগুলি কমান্ড লাইন থেকে বা অন্য স্ক্রিপ্টের মধ্যে থেকে কেবল এইভাবে কল করতে পারি:

$(customScript.ps1 arg1 arg2 ...)

আপনি দেখতে পাচ্ছেন .ps1যতক্ষণ না আমরা তাদের জন্য এলিয়াস না করি ততক্ষণে তাদের অবশ্যই অবশ্যই আপনাকে বর্ধনের সাথে কল করব। আমরা অভিনব পেতে চাই।


বাহ, এই জন্য ধন্যবাদ, এখানে অনেক আছে। তবে ইতিমধ্যে এখানে আরও 9 টি উত্তর রয়েছে। এটি কীভাবে আলাদা? এটি অতিরিক্ত কোন তথ্য সরবরাহ করছে?
স্টিফেন রাউচ

এটি করার ফলে আমাদের অন্যান্য স্ক্রিপ্টগুলির অভ্যন্তরে আমাদের কাস্টম-স্ক্রিপ্টগুলি ব্যবহার করতে দেয় built একইভাবে যেভাবে আমাদের স্ক্রিপ্টগুলির অভ্যন্তর অন্তর্নির্মিত স্ক্রিপ্টগুলি ব্যবহৃত হয়। এটি করুন এবং যতক্ষণ আপনি আপনার স্ক্রিপ্টগুলি আপনার পথে রেখেছেন সেই ডিরেক্টরিতে যতক্ষণ সংরক্ষণ করবেন, কম্পিউটার আপনি কমান্ড-স্ক্রিপ্টের
সন্ধানটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.