Python 无法分析使用PowerShell生成的CSV
有些奇怪的事情正在发生,所以我要将我的真实代码与PowerShell脚本一起粘贴,这可能很糟糕,但是嘿Python 无法分析使用PowerShell生成的CSV,python,parsing,powershell,csv,Python,Parsing,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 } funct
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运行此命令将创建可以使用此Python代码解析的CSV文件
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需要一些时间才能真正关闭并保存文件。为了解决这个问题,我在_parseCSV函数中添加了1秒pause time.sleep1。为了让PowerShell与这个问题相关,我想知道文件中的第一行是标题还是类型行。不管您的CSV看起来是否正确?您是否可以将print strex更改为raise ex并包含回溯?您确定没有执行这些行吗?。仅仅因为它没有打印您期望的内容并不意味着它们没有被执行。使用调试器或一些打印语句来确保这些行没有被执行。csv.reader在文件中返回什么?vmi.csv文件是否在其中一个目录中?谢谢你们的关注,我已经用你们问题的答案更新了我的问题。