我有从HR一个CSV文件与aprox的1000行(雇员),我馈送到AD与Powershell的 - 通过线或另一种方式/功能处理线。 这有效,但如果我以正确的方式做这件事,我有点不确定。清洁AD从进口-CSV - 改进代码
这是我的主要问题:
- 我设置在一个时间的因素之一。我应该把“变化”放入某种数组/可触及/对象中,并在脚本的最后一次完成所有操作?但是如何? “新对象”?
- 我应该使用函数吗?但是,我怎么能返回值(并继续根据函数的结果)?
所有的编程提示,更正将不胜感激。我真的很了解这个知识渊博的人群,所以让我拥有它吧。如果你有时间,请告诉我,我怎么能做到这一点越好..
这是我的代码:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction silentlycontinue
Add-PSSnapin quest.activeroles.admanagement -ErrorAction silentlycontinue
$file = "\Scripts\employees.csv" # Location of the input file
$file2 = "\Scripts\employees2.csv" # Temp file
$logfile = "\Scripts\logfile.txt" # log file
remove-item $logfile -Force -ErrorAction SilentlyContinue
Get-Content $file | Out-File -Encoding UTF8 $file2 # Convert to UTF8 (we don't touch the original inputfile)
$ListEmployees = Import-Csv $file2 -Delimiter ";" # Import the file to CSV
foreach ($ListEmployee in $ListEmployees) {
$ListDisplayName = $ListEmployee.firstname + " " + $ListEmployee.lastname
if($ADemployee = Get-QADUser -displayname $ListDisplayName -IncludedProperties employeeid)
{
## CHECK NAME
if($($ADEmployee.displayname) -eq $($ListDisplayName))
{
echo "MATCH: $($ADEmployee.displayname)"
}
## CHECK COMPANY
if($($ADEmployee.company) -ne $($ListEmployee.company))
{
echo " CHANGE - Company: '$($ADEmployee.company)' to '$($ListEmployee.company)'"
Set-QADUser -identity $($ADEmployee.samaccountname) -Company $($ListEmployee.company) -WhatIf
}
else
{
echo " OK - Company : no change '$($ListEmployee.company)'"
}
## CHECK OFFICE
if($($ADEmployee.office) -ne $($ListEmployee.office))
{
echo " CHANGE - Office '$($ADEmployee.office)' to '$($ListEmployee.office)'"
Set-QADUser -identity $($ADEmployee.samaccountname) -Office $($ListEmployee.Office) -WhatIf
}
else
{
echo " OK - Office : no change '$($ListEmployee.office)'"
}
## CHECK MOBILE
if($listemployee.mobile -match '\S')
{
if($($ADEmployee.mobile) -ne $($ListEmployee.mobile))
{
echo " CHANGE - Mobile : '$($ADEmployee.mobile)' to '$($ListEmployee.mobile)'"
Set-QADUser -identity $($ADEmployee.samaccountname) -Mobile $($ListEmployee.mobile) -WhatIf
}
else
{
echo " OK - Mobile : no change '$($ListEmployee.mobile)'"
}
}
## CHECK EMPLOYEEID
if($($ADEmployee.employeeid) -ne $($ListEmployee.employeeid))
{
echo " CHANGE - EmployeeID: '$($ADEmployee.employeeid)' to '$($ListEmployee.employeeid)'"
Set-QADUser -identity $($ADEmployee.samaccountname) -ObjectAttributes @{employeeID = $($ListEmployee.employeeid)} -WhatIf
}
else
{
echo " OK - EmployeeID : no change '$($ListEmployee.employeeid)'"
}
$match++
}
else
{
if($EXContact = Get-Contact $ListDisplayName -ErrorAction SilentlyContinue)
{
echo "MATCH CONTACT: $ListDisplayName (contact)"
## CHECK MOBILE
if($listemployee.mobile -match '\S')
{
if($($EXContact.Mobilephone) -ne $($ListEmployee.mobile))
{
echo " CHANGE - Mobile : '$($EXContact.Mobilephone)' to '$($ListEmployee.mobile)'"
}
else
{
echo " OK - Mobile ; No change ($($ListEmployee.mobile))"
}
}
## CHECK COMPANY
if($($EXContact.company) -ne $($ListEmployee.company))
{
echo " CHANGE - Company: '$($EXContact.company)' to '$($ListEmployee.company)'"
}
else
{
echo " OK - Company : No change($($ListEmployee.company))"
}
## CHECK OFFICE
if($($EXContact.office) -ne $($ListEmployee.office))
{
echo " CHANGE - Office '$($EXContact.office)' to '$($ListEmployee.office)'"
}
else
{
echo " OK - Office : No Change($($ListEmployee.office))"
}
$contactmatch++
}
else
{
echo "$ListDisplayName" | Out-File $logfile -Append
echo "NO MATCH: $ListDisplayName"
$nomatch++
}
}
$i++
}
echo " "
echo "List contains $i accounts"
echo "Accounts: $match matches"
echo "Contacts: $contactmatch"
echo "No Match: $nomatch"
;及如果你认为这是cr * p,告诉我!我宁愿听你讲,也不愿意保持沉默,只是为了礼貌!我是“相当”的新本,所以我应得的:)
提示 - 你使用的子表达太多。只有在某些情况下需要语法'$(expression)',例如当您试图使用双引号字符串'“$($ variable.property)”'访问变量属性时。如果您只是访问属性,则不需要使用它,例如,您可以执行$ ADEmployee.office -eq $ ListEmployee.office。 – 2012-02-11 00:24:24
非常感谢Andy!我全面使用它的原因是,当我回显输出时,我似乎不能直接使用它。这是否是一个正确的假设? – Sune 2012-02-11 00:39:38
这将输出办公室属性'Write-Host $ ADEmployee.Office'的值。但是,如果您想添加文本,一种方法是使用子表达式“Write-Host”Office:$($ ADEmployee.Office)“'或者可以使用字符串格式化Write-Host(”Office:{0 }“-f $ ADEmployee.Office)'。但是,如果你没有访问属性,你可以这样做:'Write-Host'Office:$ ADEmployee'',PowerShell将在对象上调用'ToString'方法,该方法可能会或可能不会返回所需的数据。 – 2012-02-11 00:47:09