如何将文件列表作为参数传递给Powershell脚本

6
如何将文件列表作为参数传递给Powershell脚本?
param
(
    [String[]]$files
)

echo $files

当我试图运行它时
PS D:\> & '.\merge outputs.ps1' *.dat

它会打印

*.dat

但我期望的是类似于

file1.dat
file2.dat
...
fileN.dat

你打算一个一个地处理这些文件吗? - Stanley De Boer
不,我会将它们全部合并在一起。 - Micha Wiedenmann
3个回答

11

目前为止提供的两个解决方案(尽管其中一个被接受并且两个都有点赞)并没有真正为问题提供足够的解决方案——它们都让你需要费些周折。原先提出的问题是,如何通过在命令行中仅仅输入*.dat,来使底层代码像你预期的那样对待它。也就是说,如何使代码只需简单地做正确的事情。 在其他shell和其他cmdlet中,您只需输入*.dat,而不是这样:

foobar(fizzbuzz[--brobdingnag*!& '\''*.dat''`])

(好的,我夸大其词是为了表达一个观点:-)但有一种简单的方法来只做正确的事情——检查是否使用了通配符,然后扩展它们:

)

param
(
    [String[]]$files
)
$IsWP = [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters($files)
if($IsWP) { 
    $files = Get-ChildItem $files | % { $_.Name }
}
echo $files

为了支持“foo*”(甚至是“**”),如果脚本的其余部分支持完整路径名,请使用$files = Get-ChildItem $files | % { $_.FullName } - minnmass
不清楚您是在建议什么:(a)$IsWP检查不再需要(但是需要!必须覆盖_没有_通配符的情况),还是(b)应该使用FullName而不是Name(但这取决于您的需求;两者都可以工作)。 - Michael Sorens
没错,我需要“FullName”,因为我想将“*/*”用作参数。 - minnmass

4

您可以将完整的文件名作为字符串传递

& '.\merge outputs' -files (dir *.dat | %{ $_.FullName })

或者你可以在你的脚本中接受 FileSystemInfo 参数。

param
(
    [System.IO.FileSystemInfo[]]$files
)

Write-Host $files

并调用:

& '.\merge outputs' -files (dir *.dat)

3
$files = dir *.dat | foreach {$_.fullname}

& '.\merge outputs.ps1' -files $files

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接