如何将参数传递给函数?


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]$arg1foo,和$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

我绝对确定这是一件非常简单的事情(我刚开始做PS时仍然感到很笨拙),但是现在我已经将头撞了一个多小时,而且我什么也找不到。

Answers:


2

$arg[]数组似乎失去了ForEach-Object内部的作用域。

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

我可以接受到目前为止获得的三个答案中的任何一个,但我会选择一个,因为这表明了我最终所做的事情。
2012年

10

$ 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到当前可以使用的当前高级参数的进度。


等等。之所以这样,是因为我避免使用诸如Foreach-Object之类的内置函数,而倾向于使用良好的原始的foreach循环构造。
Trevor Sullivan

喔好吧。我现在明白了。该死,不过这似乎很违反直觉!
2012年

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
}

我确实应该添加“将强制项作为数组返回”的内容。感谢您的提示!
2012年

是的,如果只退回一个项目,则要小心-通过将其显式转换为数组,您将获得一致的结果,因此可以使用进行迭代foreach
Trevor Sullivan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.