2015-04-20 5 views
1

Что-то странное происходит, так что я собираюсь вставить мой real код вместе со сценарием PowerShell (который, вероятно, плохо, но эй ...)Невозможно разобрать CSV генерируется с помощью PowerShell

import-module hyper-v 

$vms = get-vm | select name 
$allvms = @() 

function getRAM 
{ 
param([string]$vmname) 
$ram = get-vm -name $vmname | select -ExpandProperty memorystartup 
return $ram 
} 

function getState 
{ 
param([string]$vmname) 
$state = get-vm -name $vmname | select -ExpandProperty state 
return $state 
} 

function getUptime 
{ 
param([string]$vmname) 
$uptime = get-vm -name $vmname | select -ExpandProperty uptime 
return $uptime 
} 

function getCPUS 
{ 
param([string]$vmname) 
$cpus = get-vmprocessor -vmname $vmname | select -ExpandProperty count 
return $cpus 
} 

foreach ($vm in $vms) 
    { 
    $tempvm = New-Object PSObject 
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name cpus -Value "" 
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name state -Value "" 
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name name -Value $vm.name 
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name ram -Value "" 
    Add-Member -InputObject $tempvm -MemberType NoteProperty -Name uptime -Value "" 

    $tempvm.ram = getRAM($vm.name) 
    $tempvm.state = getState($vm.name) 
    $tempvm.cpus = getCPUS($vm.name) 
    $tempvm.uptime = getUptime($vm.name) 

    $allvms += $tempvm 
    } 

$allvms | export-csv c:/users/my_username/appdata/local/temp/vmi.csv -NoTypeInformation 

Запуск этого от повышено PowerShell создает CSV-файл, который может быть проанализирован с помощью этого кода Python.

def _parseCSV(self): 
     pwd = os.getcwd() 
     os.chdir(tempfile.gettempdir()) 
     print 'currently in dir', os.getcwd() 
     try: 
      csvfile = open('vmi.csv', 'r') 

      reader = csv.reader(csvfile) 
      print type(reader), reader 
      for row in reader: 
        print row 
      os.chdir(pwd) 
      print 'currently in dir', pwd 
     except Exception as ex: 
      raise ex 
     finally: 
      csvfile.close() 

Запуск его с использованием обычного PowerShell создает пустой файл, возможно, с ошибкой модуля Hyper-V.

Идеальный сценарий является то, что мой код Python выполняет выше сценарий PowerShell, который записывает на CSV позже разобрано же сценарий Python ... кроме это сложно запустить PowerShell, как администратор из Python, поэтому я использую этот

def _runPowershell(self): 
     sp.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe', 
           '-ExecutionPolicy', 
           'Unrestricted', 
           'Start-Process', 
           'powershell', 
           '-WindowStyle Hidden', 
           '-verb', 
           'runas', 
           '-argumentlist', 
           '"-file '+self.PSPath+'"']) 
    #self.PSPath is c:/users/my_username/appdata/local/temp/vmi.ps1 

Файл CSV, созданный этим монстром, не может быть проанализирован моим скриптом Python.

выход CSV

"cpus","state","name","ram","uptime" 
"1","Running","vm1","268435456","00:35:46" 
"2","Off","vm2","536870912","00:00:00" 
+0

Для PowerShell, связанных с этим вопросом, мне было бы любопытно, если первая строка в файле - это ваш заголовок или строка типа. Независимо от того, ваш CSV выглядит правильно? – Matt

+0

Не могли бы вы изменить 'print str (ex)' на 'raise ex' и включить трассировку? – jedwards

+0

Вы уверены, что эти строки не исполняются ?. Просто потому, что он не печатает то, что вы ожидаете, это не значит, что они не исполняются. Используйте отладчик или некоторые операторы печати, чтобы убедиться, что эти строки не выполняются. –

ответ

0

код работает просто отлично, но PowerShell нужно некоторое время, чтобы фактически закрыть (сохранить) файл. Чтобы решить эту проблему, я добавил 1 секунду паузы (time.sleep(1)) функции _parseCSV().