【问题标题】:Unable to parse CSV generated with PowerShell无法解析使用 PowerShell 生成的 CSV
【发布时间】:2015-06-27 21:08:16
【问题描述】:

发生了一些奇怪的事情,所以我要将我的 real 代码与 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

elevated 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 脚本解析......除了从 Python 以管理员身份运行 PowerShell 很棘手,所以我正在使用这个

    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

我的 Python 脚本无法解析这个怪物生成的 CSV 文件。

CSV 输出

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

【问题讨论】:

  • 如果 PowerShell 与这个问题相关,我会很好奇文件中的第一行是您的标题还是类型行。不管你的 CSV 看起来是否正确?
  • 能否将print str(ex) 更改为raise ex 并包含回溯?
  • 你确定这些行没有被执行吗?仅仅因为它没有打印您期望的内容并不意味着它们没有被执行。使用调试器或一些打印语句来确保这些行没有被执行。
  • csv.reader 在文件中返回什么? vmi.csv 文件是否在这些目录之一中?
  • 感谢大家的关注,我已经更新了我的问题并回答了您的问题。

标签: python parsing powershell csv


【解决方案1】:

代码运行良好,但 PowerShell 需要一些时间才能真正关闭(保存)文件。为了解决这个问题,我在_parseCSV()函数中添加了1秒的暂停(time.sleep(1))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2022-01-18
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多