কিভাবে একটি ফাংশন পরামিতি পাস?


11

আমার পিএস স্ক্রিপ্টে একটি এসভিএন ওয়ার্কিং কপি প্রসেস করা দরকার তবে ফাংশনে আর্গুমেন্টগুলি পাস করতে আমার সমস্যা হয়। আমার যা আছে তা এখানে:

function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $($args[0])"
echo "1: $($args[1])"
$items = get-childitem $args[1] 
$items | foreach-object -process {foo $args[0] $_}

আমি পাস করতে চান $arg[0]যেমন $arg1করতে foo, এবং $arg[1]যেমন $arg2। তবে এটি কাজ করে না, কিছু কারণে $arg1সর্বদা শূন্য থাকে:

PS C:\Users\sbi> .\test.ps1 blah .\Dropbox
0: blah
1: .\Dropbox
C:\Users\sbi\Dropbox\Photos
C:\Users\sbi\Dropbox\Public
C:\Users\sbi\Dropbox\sbi
PS C:\Users\sbi>

দ্রষ্টব্য:"blah" প্যারামিটার হিসাবে গৃহীত হয় না $arg1

আমি নিশ্চিত যে এটি হাস্যকর কিছু হ'ল (আমি কেবল পিএস করার মাধ্যমেই শুরু করেছি এবং এখনও খুব আনাড়ি অনুভব করি) তবে আমি এখন এক ঘণ্টারও বেশি সময় ধরে এর বিরুদ্ধে মাথা ঘুরিয়েছি, এবং আমি কিছুই খুঁজে পাচ্ছি না।

উত্তর:


2

$arg[]অ্যারের ভিতরে হারান সুযোগ মনে হচ্ছে foreach-বস্তুর

function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $($args[0])"
echo "1: $($args[1])"
$zero = $args[0]
$one = $args[1]
$items = get-childitem $args[1] 
$items | foreach-object {
    echo "inner 0: $($zero)"
    echo "inner 1: $($one)"
}

আমি এ পর্যন্ত তিনটি উত্তর পেয়েছি যে কোনও একটিই আমি গ্রহণ করতে পারি, তবে আমি এটি বেছে নেব, কারণ এটি দেখায় যে আমি কী করে শেষ করেছি।
এসবিআই

10

Ach আরগস [0] ফোরচ-অবজেক্টে কোনও কিছু ফেরত না দেওয়ার কারণটি হ'ল $ আরগস একটি স্বয়ংক্রিয় পরিবর্তনশীল যা কোনও কমান্ডে নামহীন, তুলনামূলক পরামিতি নেয় এবং ফোরচ-অবজেক্টটি একটি নতুন কমান্ড। প্রক্রিয়া ব্লকের জন্য কোনও তুলনামূলক প্যারামিটার নেই, সুতরাং gs আরগস [0] নাল।

একটি জিনিস যা আপনাকে সাহায্য করতে পারে তা হ'ল আপনার স্ক্রিপ্টগুলিতে ফাংশনের মতো প্যারামিটার থাকতে পারে।

param ($SomeText, $SomePath)
function foo($arg1, $arg2)
{
  echo $arg1
  echo $arg2.FullName
}

echo "0: $SomeText"
echo "1: $SomePath"
$items = get-childitem $SomePath
$items | foreach-object -process {foo $SomeText $_}

আপনার প্যারামিটারগুলি থেকে আপনি আরও কার্যকারিতা পেতে শুরু করার সাথে সাথে, আপনি এখন ব্যবহার করতে পারব advanced আরোগুলি থেকে বর্তমান উন্নত পরামিতিগুলির পরামিতিগুলির অগ্রগতিতে আমি যে ব্লগ পোস্টটি লিখেছিলাম তা পরীক্ষা করে দেখতে চাইতে পারেন


ব্লা। এর কারণগুলি হ'ল কেন আমি ভাল অল'র কাঁচা ফোর্যাচ লুপিং কনস্ট্রাক্ট ব্যবহারের পক্ষে ফোরচ-অবজেক্টের মতো বিল্ট-ইনগুলি এড়িয়ে চলে।
ট্রেভর সুলিভান

আহ, ঠিক আছে. এই আমি এখন বুঝতে। অভিশাপ, যদিও এটি বেশ বিপরীত বলে মনে হচ্ছে!
sbi

3

এরকম কিছু চেষ্টা করুন:

# Use an advanced function
function foo
{
  [CmdletBinding()]
  param (
      [string] $arg1
    , [string] $arg2
  )

  Write-Host -Object $arg1;
  Write-Host -Object $arg2;
}

# Create array of "args" to emulate passing them in from command line.
$args = @('blah', 'c:\test');

echo "0: $($args[0])"
echo "1: $($args[1])"

# Force items to be returned as an array, in case there's only 1 item returned
$items = @(Get-ChildItem -Path $args[1]);
Write-Host -Object "There are $($items.Count) in `$items";

# Iterate over items found in directory
foreach ($item in $items) {
    foo -Arg1 $args[0] -Arg2 $item.FullName
}

"জোর করে আইটেমগুলিকে অ্যারে হিসাবে ফিরিয়ে আনতে" এমন জিনিস যা আসলেই যুক্ত করা উচিত। ইঙ্গিতটির জন্য ধন্যবাদ!
sbi

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