这里真的很奇怪。我有一个分为两部分的脚本,一个脚本用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文件这一事实很重要,应该注意。但是,我有这个几乎相同的脚本在另一个站点上也做同样的事情,并且没有这个问题。
有什么想法吗?
答案 0 :(得分:0)
由于@Lee_Dailey建议将其导出到单独的CSV文件似乎可以解决问题,因此不确定为什么仅通过子进程运行时才会引起问题
如果有人愿意解释为什么会这样,我将永远感激