পাওয়ারশেল PS1 ফাইলে কমান্ড-লাইন আর্গুমেন্টগুলি কীভাবে পাস করবেন


90

কয়েক বছর ধরে, আমি cmd/DOS/Windowsব্যাচ ফাইলগুলিতে শেল এবং কমান্ড-লাইন আর্গুমেন্ট ব্যবহার করেছি। উদাহরণস্বরূপ, আমি একটি ফাইল আছে, zuzu.batএবং এটি, আমি এক্সেস %1, %2ইত্যাদি এখন আমি যখন আমি একটি কল একই কাজ করতে চান PowerShellস্ক্রিপ্ট when I am in a Cmd.exe shell। আমার একটি স্ক্রিপ্ট রয়েছে, xuxu.ps1(এবং আমি আমার প্যাথএক্সট ভেরিয়েবল এবং পাওয়ারশেলের সাথে সম্পর্কিত পিএস 1 ফাইলগুলিতে PS1 যুক্ত করেছি)। তবে আমি যাই করি না কেন, আমি $argsভেরিয়েবলের কাছ থেকে কিছুই পেতে পারি না বলে মনে হয়। এর সর্বদা দৈর্ঘ্য 0 থাকে।

আমি যদি PowerShellশেলটিতে থাকি , পরিবর্তে cmd.exe, এটি কাজ করে (অবশ্যই)। তবে আমি পাওয়ারশেলের পরিবেশে পুরোটা সময় বেঁচে থাকার পক্ষে যথেষ্ট স্বাচ্ছন্দ্য বোধ করি না। আমি টাইপ করতে না চান powershell.exe -command xuxu.ps1 p1 p2 p3 p4। আমি টাইপ করতে চাই xuxu p1 p2 p3 p4

এটি কি সম্ভব, এবং যদি তা হয় তবে কীভাবে?

আমি যে নমুনাটি কাজ করতে পারি না তা হ'ল নগণ্য, foo.ps1:

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
    Write-Host "Arg: $arg";
}

ফলাফল সর্বদা এর মতো:

C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>

উত্তর:


34

এই নিবন্ধটি সাহায্য করে। বিশেষত, এই বিভাগ:

-ফাইলে

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

অর্থাত্

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

মানে ফাইল চালাও myfile.ps1 এবং arg1 arg2 & arg3 পাওয়ারশেল স্ক্রিপ্টের প্যারামিটার।


4
এটি অপ্ট যা চায় তার সাথে এখনও সহায়তা করে না ("আমি টাইপ করতে চাই xuxu p1 p2 p3 p4")।
thdoan

19

পাওয়ারশেল ডকুমেন্টেশনটি খননের পরে, আমি এই সমস্যাটি সম্পর্কে কিছু দরকারী তথ্য আবিষ্কার করেছি। আপনি $argsযদি param(...)আপনার ফাইলের শুরুতে এটি ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারবেন না ; পরিবর্তে আপনি ব্যবহার করতে হবে $PSBoundParameters। আমি আপনার কোডটিকে পাওয়ারশেল স্ক্রিপ্টে অনুলিপি / আটকানো করেছি এবং এটি পাওয়ারশেলের সংস্করণ 2-তে আপনি যেমন প্রত্যাশা করেছিলেন তেমনভাবে কাজ করেছে (আমি নিশ্চিত নই যে আপনি যখন এই সমস্যাটিতে এসেছিলেন তখন আপনি কোন সংস্করণে ছিলেন)।

যদি আপনি ব্যবহার করছেন $PSBoundParameters(এবং এটি param(...)আপনার স্ক্রিপ্টের শুরুতে ব্যবহার করা হয় তবে এটি কেবলমাত্র কাজ করে ) তবে এটি কোনও অ্যারে নয়, এটি একটি হ্যাশ টেবিল, সুতরাং কী / মান জোড় ব্যবহার করে আপনাকে এটি উল্লেখ করতে হবে।

param($p1, $p2, $p3, $p4)
$Script:args=""
write-host "Num Args: " $PSBoundParameters.Keys.Count
foreach ($key in $PSBoundParameters.keys) {
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + "  "
}
write-host $Script:args

এবং যখন সাথে ডাকা হবে ...

PS> ./foo.ps1 a b c d

ফলাফল হলো...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d

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

4
@ এরিকহানসেন আপনি কী বলতে চাইছেন তা আমি জানি না, আমি উভয় উপায়ে একই ফলাফল পেয়েছি: `পাওয়ারশেল> পাওয়ারশেল.এক্সে। \ প্যারামেস্টেস্ট.পিএস 1 ভাল 1 ভাল 2 ভ্যালু নুম আরগস: 4 $ পি 1 = ভাল 1 $ পি 2 = ভাল 2 $ পি 3 = ভাল 3 $ পি 4 = ভাল 4 `
র্যান্ডাল বর্ক

@RandallBrock আমার পক্ষে যুক্তিগুলির আচরণ পরিবর্তন হয়। আমি যদি সিএমডি / ব্যাচে থাকি এবং আমি এমন কিছু pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4করি তবে এটি সত্যই পছন্দ করে না। অন্যদিকে, আমি যদি পাওয়ারশেলের মধ্যে আছি এবং তা করি তবে এটি আমার .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4প্রত্যাশা মতো কাজ করে। আমি শুনেছি যে "সুরক্ষা কারণে" এইভাবে এটি কাজ করার উদ্দেশ্যে intended
এরিক হ্যানসেন

@ এরিকহানসেন আমি ভাবছি এটি কোনও ভার্সন জিনিস কিনা। আমার জন্য, pwsh 6.2.0 প্রবর্তন করেছে, তবে পাওয়ারশেল.এক্সই 5.1.17134.858 প্রবর্তন করেছে, উভয়ই একই ফলাফল তালিকাভুক্ত করে: Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4ফলন:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
র‌্যান্ডাল বোর্ক

4
@ টিমো আমি জানি না আপনি ঠিক কী করছেন, তবে paramএটি একটি ভাষা নির্মাণ, তবে এটি অবশ্যই ফাইলের প্রথম জিনিস be আপনি কি এর আগে কোনও পরিবর্তনশীল বা অন্য কিছু ঘোষণা করেছিলেন? এখানে আরও তথ্য: ডকস.মাইক্রোসফটকম
র্যান্ডাল

18

ঠিক আছে, সুতরাং প্রথমে এটি পাওয়ারশেলের একটি প্রাথমিক সুরক্ষা বৈশিষ্ট্যটি ভঙ্গ করছে। সেই বোঝার সাথে আপনি এখানে এটি করতে পারেন:

  1. একটি উইন্ডোজ এক্সপ্লোরার উইন্ডো খুলুন
  2. মেনু সরঞ্জাম -> ফোল্ডার বিকল্প -> ট্যাব ফাইল প্রকার
  3. PS1 ফাইলের ধরণটি সন্ধান করুন এবং উন্নত বোতামটি ক্লিক করুন
  4. নতুন বোতামটি ক্লিক করুন
  5. অ্যাকশন রাখার জন্য: ওপেন করুন
  6. অ্যাপ্লিকেশনটির জন্য: "সি: IN WINNT \ system32 \ উইন্ডোজপাওয়ারশেল \ v1.0 \ পাওয়ারশেল.এক্সে" "-ফাইলে" "% 1"% *

-NoProfileআপনার প্রোফাইল কী করে তার উপর নির্ভর করে আপনি সেখানে একটি যুক্তিও রাখতে চাইতে পারেন ।


4
আমি মনে করি কীটি আপনার 6 ধাপে রয়েছে যেখানে আপনি পরামিতিগুলিতে পাওয়ারশেল.এক্সে পাস করেন। ড্যানিয়েল বলেছেন যে তিনি পিএস 1 ফাইলগুলি পাওয়ারশেলের সাথে যুক্ত করেছেন তবে এটি অতিরিক্ত% 1% * চশমা ছাড়া তর্ক করে না। এছাড়াও নোট করুন যে -File পরামিতি ভি 1 এ উপলব্ধ নয়। এটি ভি 2-তে নতুন।
কিথ হিল

ফাইল-প্যারামিটার সম্পর্কে ভাল ধারণা আমি এটি ভুলে গিয়েছিলাম।
ইবিগ্রিন

আপনার পরামর্শটি ব্যবহার করার আগে আমাকে ভি 2 ইনস্টল করতে হবে। ধন্যবাদ আপনি যখন বলছেন এটি কোনও মৌলিক সুরক্ষা বৈশিষ্ট্যটি ভঙ্গ করছে, "এটি" আপনার অর্থ কী? Cmd.exe থেকে পাওয়ারশেল স্ক্রিপ্ট কল করা যেমন এটি একটি .com / .bat / .exe ফাইল? স্ক্রিপ্টে প্যারামিটারগুলি পাস করছেন?
ড্যানিয়েল 'ডাং' গ্রিফিথ

4
দুঃখিত আমি আরও পরিষ্কার করা উচিত ছিল। স্পষ্টভাবে পাওয়ারশেল.এক্স.কে কল না করে স্ক্রিপ্টটি কল করা। আমি বলছি না এটি ব্যক্তিগতভাবে এটি আপনার জন্য একটি গুরুত্বপূর্ণ সুরক্ষা বৈশিষ্ট্য এবং এটি অস্পষ্টতার মাধ্যমে সুরক্ষা যা আমি সর্বদা যাইহোক ভক্ত নই।
ইবিগ্রিন

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

11

আপনি ফাইলটিতে আপনার পরামিতিগুলি পরমের মতো ঘোষণা করতে পারেন:

[string]$para1
[string]$param2

এবং তারপরে পাওয়ারশেল ফাইলটিকে কল করুন .\temp.ps1 para1 para2....para10ইত্যাদি


6

হতে পারে আপনি এ জাতীয় .batফাইলগুলিতে পাওয়ারশেল আমন্ত্রণটি মোড়ানো করতে পারেন :

rem ps.bat
@echo off
powershell.exe -command "%*"

তারপরে যদি আপনি এই ফাইলটিকে কোনও ফোল্ডারের নীচে রাখেন তবে PATHআপনি পাওয়ারশেল স্ক্রিপ্টগুলিকে এভাবে কল করতে পারেন:

ps foo 1 2 3

উদ্ধৃতিটি কিছুটা অগোছালো হতে পারে যদিও:

ps write-host """hello from cmd!""" -foregroundcolor green

ট্রিপল কোটগুলি দেখানোর জন্য +1। যা আমাকে কিছুক্ষণ আটকে রেখেছিল
ডিনোক

1

মনে হচ্ছে আপনি "xuxu p1 p2 p3 p4" পেতে পারেন না। আপনি যখন পাওয়ারশেলের সাথে থাকবেন এবং সেট আপ করবেন

PS > set-executionpolicy Unrestricted -scope currentuser

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

./xuxu p1 p2 p3 p4

বা

.\xuxu p1 p2 p3 p4

বা

./xuxu.ps1 p1 p2 p3 p4

আমি আশা করি এটি আপনাকে পাওয়ারশেলের সাথে কিছুটা স্বাচ্ছন্দ্য বোধ করে।


0

আপনি যদি সিএমডি থেকে পিএস 1 স্ক্রিপ্টগুলি চালনা করতে চান এবং স্ক্রিপ্টটি পছন্দ না করে যুক্তিগুলি পাস করতে চান

powershell.exe script.ps1 -c test
script -c test ( wont work )

আপনি নিম্নলিখিত করতে পারেন

setx PATHEXT "%PATHEXT%;.PS1;" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*

এটি ধরে নিচ্ছে পাওয়ারশেল। এক্স আপনার পথে রয়েছে

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype


এটি লক্ষণীয় যে এটিকে প্রশাসক হিসাবে সিএমডি প্রম্পট চালানো দরকার। এছাড়াও, আমি এটি উইন্ডোজ 10 সংস্করণ 1903 (18362.778) এ আসলে কাজ করার জন্য লড়াই করছি - সমস্ত কমান্ড সফলভাবে চলতে পারে তবে তর্কগুলি এখনও পাস হয় না I
ডেভিড আইরাপেটিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.