如何将参数传递给函数?

sbi*_*sbi 11 powershell

我需要在 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] $_}
Run Code Online (Sandbox Code Playgroud)

我想通过$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>
Run Code Online (Sandbox Code Playgroud)

注:"blah"参数不为过$arg1

我绝对确定这是一件非常简单的事情(我才刚开始做 PS,仍然觉得很笨拙),但我已经用了一个多小时的时间来解决这个问题,我找不到任何东西。

Ste*_*ski 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 $_}
Run Code Online (Sandbox Code Playgroud)

当您开始希望从您的参数中获得更多功能时,您可能需要查看我写的一篇关于参数从 $args 到我们现在可以使用的当前高级参数的进展的博客文章。


Jus*_*ing 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)"
}
Run Code Online (Sandbox Code Playgroud)