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

时间:2017-05-10 15:45:06

标签: powershell wildcard

我使用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不会解析通配符并使用通配符传递字符串。

3 个答案:

答案 0 :(得分:7)

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

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

虽然这样可行,但你应该通过使用get-item生成的结果对象的.FullName属性来正确地传递Python文件的名称:

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

答案 1 :(得分:4)

虽然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为您扩展通配符模式并返回路径列表,例如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

答案 2 :(得分:0)

执行Get-Item以查看System.IO.FileInfo没有返回字符串,但 $files = (Get-Item .\file*.html) -join(' ') 对象包含多个条目。
如果文件名中没有空格,则可以这样做:

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

否则

std::vector