【问题标题】:powershell wildcards in passing filenames as argument(s)将文件名作为参数传递的 powershell 通配符
【发布时间】:2017-05-10 15:45:06
【问题描述】:

我在使用PowerShell 的Windows 机器上运行Python 3。我正在尝试执行一个 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 不会解析通配符并使用通配符传递字符串。

【问题讨论】:

  • 我认为这实际上与 Python 无关。
  • @Ajean - 我可能不应该添加 Python 标签,我是新手,只是认为它可能有助于解决问题的上下文。我同意,这是一个 PowerShell 问题,而不是 Python。
  • 没问题,我继续删除它 - 其余问题都很好(虽然我不是 Powershell 人,但我无法回答......)。

标签: powershell wildcard


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意,第二个建议需要 PowerShell v3 或更高版本,除非该模式扩展为单个文件。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    否则

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

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多