Python 子进程导致 PowerShell CSV 处理出现问题
Python subprocess causing issues with PowerShell CSV handling
这里真的很奇怪。我有一个分为两部分的脚本,一个在 Python 中收集数据,另一个在 PowerShell 中完成所有 AD 工作。我不必 运行 一个然后另一个,而是在 Python 中使用子进程和标准输出到 运行 PowerShell 脚本。
经过进一步开发,我意识到在某些情况下我需要更改 CSV 文件的某些部分,然后再为 Python 中的最后部分再次处理它。在 PowerShell 中简单使用 Export-Csv
、运行,没问题。
运行 整个脚本,如果 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 文件似乎可以解决问题,但不确定为什么它仅在 运行 通过子进程
时才引起问题
如果有人愿意解释为什么会这样,我将永远感激
这里真的很奇怪。我有一个分为两部分的脚本,一个在 Python 中收集数据,另一个在 PowerShell 中完成所有 AD 工作。我不必 运行 一个然后另一个,而是在 Python 中使用子进程和标准输出到 运行 PowerShell 脚本。
经过进一步开发,我意识到在某些情况下我需要更改 CSV 文件的某些部分,然后再为 Python 中的最后部分再次处理它。在 PowerShell 中简单使用 Export-Csv
、运行,没问题。
运行 整个脚本,如果 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 文件似乎可以解决问题,但不确定为什么它仅在 运行 通过子进程
时才引起问题如果有人愿意解释为什么会这样,我将永远感激