subprocess mit variablen unter windows

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Hallo ich versuche eine Funktion zu schreiben die den Hostnamen ändert unter Windows 7 aber komme nicht weiter.

Mein Ansatz:

Code: Alles auswählen

def changeHost(oldH, newH):
    subprocess.check_output("wmic computersystem where name=",oldH + "call rename name=",newH, shell=True)      # Windows Funktion um Hostnamen zu ändern
ich versteh einfach die Syntax nicht wie kann ich einen langen Befehl unterbrechen und zwei variablen einsetzten die auch noch in Anführungszeichen " " sind.

Ich könnte die Variablen vorher in Anführungszeichen setzten klar aber das unterbrechen dieses langen kommandos ist der Knackpunkt was nicht funktioniert.

Könnte mir da jemand helfen ?
Auch genial wenn ich den returncode abfangen könnte und wissen könnte ob der befehl erfolgreich war oder nicht

Danke vielmals für jede Mühe
BlackJack

@Praktikant03: Du möchtest wohl eher nicht ``shell=True`` verwenden und das ganze als Liste angeben. Dann sind sämtliche Sonderzeichen für die Shell, wie beispielsweise Anführungszeichen kein Problem, weil man das eben nicht mehr unbeschaded an einer Shell vorbeischleusen muss, sondern das Programm *direkt* startet.

Edit: Ungetestet:

Code: Alles auswählen

def change_host(old_hostname, new_hostname):
    subprocess.check_call(
        [
            'wmic', 'computersystem', 'where', 'name=' + old_hostname,
            'call', 'rename', 'name=' + new_hostname,
        ]
    )
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Hi danke für die schnelle Antwort aber irgendwie kommt dann so ein fehler

Code: Alles auswählen

oH = '"ttt'"                # aktueller hostname 
nH = '"MPC"'              # neuer hostname 

def change_host(old_hostname, new_hostname):
    subprocess.check_call(
        [
            'wmic', 'computersystem', 'where', 'name=' + old_hostname,
            'call', 'rename', 'name=' + new_hostname,
        ]
    )


change_host(oH, nH)   # kommt als Fehlermeldung
>>> change_host(oH, nH)
Knoten - TTT
FEHLER:
Beschreibung = Die Anfrage ist ungültig.


Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in change_host
File "C:\Python27\lib\subprocess.py", line 511, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name="ttt"', 'call', 'rename', 'name="MPC"']' returned non-zero exit status -2147217385
BlackJack

@Praktikant03: Lass mal die " *innerhalb* der Zeichenketten weg, denn die dürften eigentlich nur für die Shell sein, die ja nun nicht mehr dazwischen steht und die heraus filtert.

Und wenn Du vernünftige Namen verwendest, bräuchtest Du keine Kommentare die erklären was diese kryptischen Abkürzungen bedeuten.
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Hm sorry wegen den kryptischen Namen,

aber egal wie ich es drehe oder wende ob mit den Anführungszeichen oder nicht immer diese komische Fehlermeldung

Code: Alles auswählen

subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name=ttt', 'call', 'rename', 'name=MPC']' returned non-zero exit status -2147217385
Das Problem selbst wenn ich wie die Windows Funktion verlangt den name= "irgendwas" in Anführungsstrichen habe kommt die gleiche Meldung

Code: Alles auswählen

>>> new_host = '"MPC"'
>>> alt_host = '"ttt"'
>>> change_host(alt_host, new_host)
Knoten - TTT
FEHLER:
Beschreibung = Die Anfrage ist ungültig.


Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in change_host
  File "C:\Python27\lib\subprocess.py", line 511, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['wmic', 'computersystem', 'where', 'name="ttt"', 'call', 'rename', 'name="MPC"']' returned non-zero exit status -2147217385
Und hier sieht man ja, dass name mit den Anführungsstrichen ist desswegen die kryptischen ' " irgendwas " ' Hochkommata um eben den String mit " " zu bekommen.

hm..
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Es muss irgendwie an der Variablen übergabe scheitern, denn wenn ich

Code: Alles auswählen

subprocess.call('wmic computersystem where name="ttt" call rename name="MPC"')
eingebe funktioniert es ohne Problem doch habe ich hier "ttt" als alten Computernamen einfach eingetragen genau wie "MPC"

# Ausgabe des Befehlts

Code: Alles auswählen

(\\TTT\ROOT\CIMV2:Win32_ComputerSystem.Name="TTT")->rename() wird ausgeführt
Methode wurde ausgeführt.
Ausgabeparameter:
instance of __PARAMETERS
{
        ReturnValue = 0;
};
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Praktikant03 hat geschrieben:

Code: Alles auswählen

subprocess.call('wmic computersystem where name="ttt" call rename name="MPC"')
Wenn das geht, dann bau das Kommando doch einfach mit Stringformatierung zusammen.

Code: Alles auswählen

new_host = 'MPC'
alt_host = 'ttt'
command = 'wmic computersystem where name="{old_name}" call rename name="{new_name}"'.format(
    old_name = alt_host,
    new_name = new_host
)
Praktikant03
User
Beiträge: 12
Registriert: Dienstag 16. Juli 2013, 09:27

Ja @/me du hast recht so funktionierts perfekt vielen dank nochmal hab gar nicht an String formatierung gedacht.

Danke nochmal !

Super Forum thread kann geschlossen werden
Antworten