5

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

param
(
    [String[]]$files
)

echo $files

当我尝试运行它时

PS D:\> & '.\merge outputs.ps1' *.dat

它打印

*.dat

但我期待类似的东西

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

3 回答 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
于 2013-06-27T04:12:48.367 回答
4

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

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

或者您可以在脚本中接受 FileSystemInfo 参数

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

Write-Host $files

并调用:

& '.\merge outputs' -files (dir *.dat)
于 2013-05-29T13:40:42.060 回答
3
$files = dir *.dat | foreach {$_.fullname}

& '.\merge outputs.ps1' -files $files
于 2013-05-29T10:37:04.940 回答