我需要在 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传递$arg1
给foo
,并将$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
}