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

dde*_*tts 3 powershell wildcard

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

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

PS python mypythonfile.py $files
Run Code Online (Sandbox Code Playgroud)

我的问题是,无需使用Get-Item并将结果分配给变量就可以做到这一点吗?我试过像这样运行相同的文件,python mypythonfile.py .\file*.html但这会导致Python解释器出错,因为PowerShell不会解析通配符,而是将字符串与通配符一起传递。

Adi*_*tan 7

看来您在交互式控制台中。如果您只是想实现此目的,则无需将get-item的结果分配给变量。尝试这个:

python mypythonfile.py (get-item .\file*.html)
Run Code Online (Sandbox Code Playgroud)

尽管这可以解决问题,但您实际上应该使用get-item生成的结果对象的.FullName属性正确地将文件名传递给Python:

python mypythonfile.py (get-item .\file*.html).FullName
Run Code Online (Sandbox Code Playgroud)


Ans*_*ers 7

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

Pythonglob为此提供了模块:

import sys
import glob

for arg in glob.glob(sys.args[1]):
    print(arg)
Run Code Online (Sandbox Code Playgroud)

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

python script.py .\file*.html
Run Code Online (Sandbox Code Playgroud)

否则,您需要使用 PowerShell cmdlet 为您扩展通配符模式并返回路径列表,例如Get-ChildItem. 要么在变量中收集列表:

$files = Get-ChildItem .\file*.html | Select-Object -Expand FullName
python script.py $files
Run Code Online (Sandbox Code Playgroud)

或在表达式中运行 PowerShell 语句:

python script.py (Get-ChildItem .\file*.html | Select-Object -Expand FullName)
Run Code Online (Sandbox Code Playgroud)

或者您可以stdin以下位置读取Python 脚本:

import fileinput

for line in fileinput.input():
    print(line.replace('\n',''))
Run Code Online (Sandbox Code Playgroud)

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

Get-ChildItem .\file*.html | Select-Object -Expand FullName | python script.py
Run Code Online (Sandbox Code Playgroud)