Python子进程导致PowerShell CSV处理问题

时间:2019-06-18 22:38:45

标签: python-3.x powershell subprocess stdout

这里真的很奇怪。我有一个分为两部分的脚本,一个脚本用Python进行数据收集,另一个脚本用PowerShell进行所有AD工作。不必运行一个然后再运行另一个,而是使用Python中的子进程和stdout运行PowerShell脚本。

进一步开发后,我意识到在某些情况下,我需要先更改CSV文件的一部分,然后再对Python的最后一部分进行处理。简单使用Export-Csv,可以在PowerShell中运行它,没问题。

整体运行脚本,如果CSV是由PowerShell通过子进程和stdout编辑的,则出于某种奇怪的原因,PowerShell认为CSV中有多余的一行,并尝试将其作为新用户进行处理。

同样,如果满足代码和相同的条件,并且仅通过PowerShell运行,则不会出现多余的行(已检查文件,并且所有数据看起来均应正确,没有多余的行)。

令人反感的代码行是:

#Find out if its in use
while ($Exit -eq $false)
{
    $Return = UserExists $Username $Description

    if($Return -eq 'User does not exist')
    {
        $Exit = $true
        $Return = $Username
    }
    elseif($Return -eq 'User already exists')
    {
        $Exit = $true
    }
    elseif($Return -eq 'User does not exist but username does')
    {
        [STRING]$StringToAppend = $IntegerToAppend
        $UserName = $userinfo['username']+ $StringToAppend
        $sAMAccountName = $UserName
        [INT]$IntegerToAppend = [INT]$IntegerToAppend + 1

        $oldUN = $userinfo['username']
        $LC = $userinfo['learnerCode']

        $file = 'C:/XXX/XXX/XXXstudents.csv'
        $csv = Import-Csv $file

        foreach($row in $csv) 
        {
        if ($row.UserName -eq $oldUN -And $row.LearnerCode -eq $LC) {
        $row.UserName = $UserName
        $row.EmailAddress = $UserName + '@XXXXX.org.uk'
        }}
        $csv | Export-Csv  $file -NoTypeInformation;
    }
}
return $Return
}

子流程代码为:

# Launch next part of script - Powershell create users
p = subprocess.Popen(["powershell.exe", 
              'C:/Provisioning/ProvisionStudents.ps1'], 
              stdout=sys.stdout)
p.communicate()

现在,我觉得PowerShell脚本正在编辑正在迭代的CSV文件这一事实很重要,应该注意。但是,我有这个几乎相同的脚本在另一个站点上也做同样的事情,并且没有这个问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于@Lee_Dailey建议将其导出到单独的CSV文件似乎可以解决问题,因此不确定为什么仅通过子进程运行时才会引起问题

如果有人愿意解释为什么会这样,我将永远感激