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



这里真的很奇怪。我有一个由两部分组成的脚本,一个在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文件这一事实很重要,应该注意。但是,我有这个几乎相同的脚本对另一个站点执行相同的操作,并且没有此问题。

有什么想法吗?

正如@Lee_Dailey建议的那样,导出到单独的CSV文件似乎可以解决问题,但不确定为什么它只在通过子进程运行时引起问题

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

最新更新