2017-05-10 9 views
2

Ich verwende auf einem Windows-Computer mit PowerShell. Ich versuche, eine Python-Datei auszuführen und dann eine Anzahl von Dateien (file1.html, file2.html usw.) als Argumente mit einem Platzhalterzeichen zu übergeben. Ich kann dies zu arbeiten, wie unten ein paar Schritte:Powershell-Platzhalter beim Übergeben von Dateinamen als Argument (en)

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

PS python mypythonfile.py $files 

Meine Frage kann, ist dies ohne getan werden Get-Item zu bedienen und die Ergebnisse in einer Variablen zugewiesen wird? Ich habe versucht, die gleiche Datei wie diese python mypythonfile.py .\file*.html ausführen, aber dies führt zu einem Fehler von der Python-Interpreter, weil PowerShell die Platzhalter nicht analysiert und übergibt die Zeichenfolge mit dem Platzhalter.

+0

Ich glaube nicht, dass dies tatsächlich etwas mit Python zu tun hat. – Ajean

+0

@Ajean - Ich hätte wahrscheinlich kein Python-Tag hinzufügen sollen, ich bin neu und dachte nur, dass es mit dem Kontext der Frage helfen könnte. Ich stimme zu, es ist eine PowerShell-Frage, nicht Python. – ddetts

+0

Kein Problem, ich ging voran und entfernte es - der Rest der Frage ist vollkommen in Ordnung (obwohl ich kein Powershell-Mensch bin, kann ich es nicht beantworten ...). – Ajean

Antwort

3

Es scheint, dass Sie in der interaktiven Konsole sind. Sie müssen die Ergebnisse von get-item nicht einer Variablen zuweisen, wenn dies alles ist, was Sie erreichen möchten. Versuchen Sie folgendes:

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

Obwohl dies funktionieren wird, sollten Sie wirklich Python werden dabei den Namen der Datei ordnungsgemäß unter Verwendung .FullName Eigenschaft der resultierenden Objekte erzeugt durch get-Artikel:

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

Beachten Sie, dass der zweite Vorschlag PowerShell v3 oder neuer erfordert, es sei denn, das Muster wird auf eine einzelne Datei erweitert. –

0

Machen Sie eine $files | get-Member, um zu sehen, dass Get-Item keine Zeichenfolge zurückgibt, sondern ein System.IO.FileInfo Objekt mit mehreren Einträgen.
Wenn es keine Leerzeichen in den Dateinamen sind dies tun könnte:

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

Ansonsten

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

Während Windows-Shells (nämlich PowerShell und CMD) unterstützen glob patterns, sie erweitern die Muster selbst nicht (im Gegensatz zu Unix-Shells). Stattdessen müssen Befehle, die Globbing unterstützen sollen, die Wildcard-Erweiterung selbst implementieren.

Python bietet die glob Modul dafür:

import sys 
import glob 

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

, dass Ihr Skript erlaubt Argumente mit Wildcards zu handhaben, wenn beispielsweise genannt dies wie:

python script.py .\file*.html 

Andernfalls müssen Sie ein Powershell-Cmdlets verwenden, die für Sie Wildcard-Muster erweitert und gibt eine Liste von Pfaden, z.B. Get-ChildItem. Entweder sammeln die Liste in einer Variablen:

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

oder die Powershell-Anweisung ausführen in einem expression:

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

Oder Sie könnten Ihre Python-Skript haben read from stdin:

import fileinput 

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

und Rohr der Dateiliste in Ihr Skript:

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