在powershell中传递命令行$ args,从函数到函数

23 powershell command-line arguments nested

这是我面临的一个令人讨厌的问题.如果它有一个简单的解决方案,那就不会感到惊讶.

我有2个批处理文件,我必须转换为powershell脚本.

file1.bat
---------

echo %1
echo %2
echo %3
file2.bat %*

file2.bat
--------
echo %1
echo %2
echo %3
Run Code Online (Sandbox Code Playgroud)

在命令行上,我调用此作为C:> file1.bat一二三我看到的输出是预期的一二三一二三

(这是粗略的代码示例)

当我转换为Powershell时,我有

file1.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]
. ./file2.ps1 $args

file2.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]

When I invoke this on powershell command line, I get
$> & file1.ps1 one two three
args[0] one
args[1] two
args[2] three
args[0] one two three 
args[1] 
args[2] 
Run Code Online (Sandbox Code Playgroud)

我理解这是因为file1.ps中使用的$ args是System.Object []而不是3个字符串.

我需要一种方法将file1.ps1收到的$ args传递给file2.ps1,这与.bat文件中%*实现的方式非常相似.

我担心,即使它是一个跨函数调用,现有的方式也会破坏,就像我的例子中的跨文件调用一样.

尝试过几种组合,但没有任何效果.

请帮助.非常感谢它.

小智 34

PowerShell V2中,使用splatting是微不足道的.酒吧变成:

function bar { foo @args }
Run Code Online (Sandbox Code Playgroud)

Splatting会将数组成员视为单个参数,而不是将其作为单个数组参数传递.

PowerShell V1中,它很复杂,有一种方法可以用于位置参数.给定函数foo:

function foo { write-host args0 $args[0] args1 $args[1] args2 $args[2]   }
Run Code Online (Sandbox Code Playgroud)

现在使用Invoke()foo函数的scriptblock上的方法从bar调用它

function bar { $OFS=',';  "bar args: $args";  $function:foo.Invoke($args) }
Run Code Online (Sandbox Code Playgroud)

看起来像

PS (STA) (16) > bar 1 2 3

bar args: 1,2,3

args0 1 args1 2 args2 3

当你使用它.


Ric*_*erg 9

# use the pipe, Luke!

file1.ps1
---------
$args | write-host
$args | .\file2.ps1    

file2.ps1
---------
process { write-host $_ }
Run Code Online (Sandbox Code Playgroud)