将文件名作为参数传递时的 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
我 运行 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 属性 正确传递文件名 Pythonpython 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