这里真的很奇怪。我有一个由两部分组成的脚本,一个在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文件似乎可以解决问题,但不确定为什么它只在通过子进程运行时引起问题
如果有人愿意解释为什么会这样,我将永远感激不尽