将文件名作为参数传递时的 powershell 通配符

powershell wildcards in passing filenames as argument(s)

我 运行 Python 3 在 Windows 机器上使用 PowerShell。我正在尝试执行一个 Python 文件,然后使用通配符将多个文件(file1.html、file2.html 等)作为参数传递。我可以让它工作,执行如下几个步骤:

PS $files = Get-Item .\file*.html

PS python mypythonfile.py $files

我的问题是,是否可以在不使用 Get-Item 并将结果分配给变量的情况下完成此操作?我尝试 运行 与此 python mypythonfile.py .\file*.html 相同的文件,但这会导致 Python 解释器出错,因为 PowerShell 不会解析通配符并传递带有通配符的字符串。

执行 $files | get-Member 以查看 Get-Item 不是 return 字符串而是包含多个条目的 System.IO.FileInfo 对象。
如果文件名中没有空格,可以这样做:

 $files = (Get-Item .\file*.html) -join(' ')

否则

$files =  '"'+((Get-Item .\file*.html) -join('" "'))+'"'

您似乎在交互式控制台中。您不需要将 get-item 的结果分配给变量,如果这就是您想要实现的全部。试试这个:

python mypythonfile.py (get-item .\file*.html)

虽然这可行,但您确实应该通过使用 get-item:

生成的结果对象的 .FullName 属性 正确传递文件名 Python
python mypythonfile.py (get-item .\file*.html).FullName

虽然 Windows shell(即 PowerShell 和 CMD)确实支持 glob patterns,但它们本身并不扩展模式(与 Unix shell 不同)。相反,应该支持 globbing 的命令必须自己实现通配符扩展。

Python 为此提供 glob 模块:

import sys
import glob

for arg in glob.glob(sys.args[1]):
    print(arg)

这允许您的脚本在调用时使用通配符处理参数,例如像这样:

python script.py .\file*.html

否则,您需要使用为您扩展通配符模式的 PowerShell cmdlet 和 returns 路径列表,例如Get-ChildItem。将列表收集到变量中:

$files = Get-ChildItem .\file*.html | Select-Object -Expand FullName
python script.py $files

或运行 expression:

中的PowerShell语句
python script.py (Get-ChildItem .\file*.html | Select-Object -Expand FullName)

或者您可以使用 Python 脚本 read from stdin:

import fileinput

for line in fileinput.input():
    print(line.replace('\n',''))

并将文件列表通过管道传输到您的脚本中:

Get-ChildItem .\file*.html | Select-Object -Expand FullName | python script.py