PowershellでADにフィードするaprox 1000行(従業員)のHRからCSVファイルを取得しました。 これはうまくいきますが、これを正しく実行しているかどうかは少し不明です。私は一度に属性1を設定していますimport-CSVからADをクリーニングする - 行ごとに処理する方法または機能 - 改善コード
- :
これは私の主な関心事です。私は "変更"を何らかの配列/ hasthable/objectに入れ、スクリプトの最後に一度に行うべきですか?しかし、どのように? "New-Object"?
- 機能を使用する必要がありますか?しかし、どのようにして値を返すことができますか(そして関数の結果に基づいて続けますか)?
すべてのプログラミングのヒントは、訂正が大いに評価されます。私は知っている人のこのすばらしいコミュニティを本当に理解するので、私にそれを持たせてください。あなたは時間があればこれは私のコードです..私はこれより良いを行うことができますどのよう
を教えてください:
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'を実行するだけです。 –
ありがとう、アンディ!私がそれを全部使っているのは、出力をエコーしているときに直接使うことができないように思えるからです。これは正しい仮定ですか? – Sune
これはオフィスのプロパティ 'Write-Host $ ADEmployee.Office'の値を出力します。しかし、テキストを追加したい場合は、 'Write-Host" Office:$($ ADEmployee.Office) "の部分式を使用するか、文字列フォーマット' Write-Host( "Office:{0 } "-f $ ADEmployee.Office)'。しかし、プロパティにアクセスしていない場合は、この 'Write-Host 'Office:$ ADEmployee" 'を実行するだけで、PowerShellはオブジェクトに対して' ToString'メソッドを呼び出して、必要なデータを返すことができます。 –