如何向函数传递参数?

如何向函数传递参数?

我需要在 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]as传递$arg1foo,并将$arg[1]as 传递给$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

我非常确定这是一件非常简单的事情(我才刚刚开始做 PS,仍然觉得很笨拙),但我已经为此绞尽脑汁一个多小时了,却什么也没找到。

答案1

数组$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)"
}

答案2

$args[0] 在 foreach 对象中不返回任何内容的原因是 $args 是一个自动变量,它将未命名、不匹配的参数传递给命令,而 foreach 对象是一个新命令。进程块中没有任何不匹配的参数,因此 $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 到我们现在可以使用的高级参数的进展。

答案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
}

相关内容