किसी फ़ंक्शन में पैरामीटर कैसे पास करें?


11

मुझे PS स्क्रिप्ट में एक SVN वर्किंग कॉपी संसाधित करने की आवश्यकता है, लेकिन मुझे कार्यों के लिए तर्क देने में परेशानी होती है। यहाँ मेरे पास क्या है:

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)"
}

मुझे अब तक मिले तीन उत्तरों में से कोई भी स्वीकार हो सकता है, लेकिन मैं इसे चुनूंगा, क्योंकि इससे पता चलता है कि मैंने क्या किया।
sbi

10

कारण है कि $ args [0] foreach-object में कुछ भी वापस नहीं कर रहा है, $ args एक स्वचालित चर है जो एक कमांड में अनाम, बेजोड़ पैरामीटर लेता है और foreach-object एक नया कमांड है। प्रक्रिया ब्लॉक के लिए कोई बेजोड़ पैरामीटर नहीं हैं, इसलिए $ args [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 $_}

जैसा कि आप अपने मापदंडों से अधिक कार्यक्षमता चाहते हैं, तो आप एक ब्लॉग पोस्ट की जांच कर सकते हैं जो मैंने $ args से वर्तमान उन्नत मापदंडों के मापदंडों को आगे बढ़ाया है जिसे हम अभी उपयोग कर सकते हैं।


ब्ला। इस तरह से कारण है कि मैं अच्छे ol 'कच्चे फ़ॉरेस्ट पाशन निर्माण का उपयोग करने के पक्ष में Foreach-Object जैसे बिल्ट-इन से बचता हूं।
ट्रेवर सुलिवन

आह अच्छा। यह मैं अब समझ गया हूं। लानत है, कि हालांकि काफी उल्टा लगता है!
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
ट्रेवर सुलिवन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.