【发布时间】:2017-05-26 11:01:03
【问题描述】:
首先,我绝不是 PS 专家,完全是新手 - 入场已完成。为了让脚本做我想做的事,我已经在互联网上搜索了我需要的东西,但我已经到了一个我正在挣扎并且需要帮助的地步。
基本上,我使用 ISE 创建了一个脚本,该脚本抓取 AD OU 中的用户,通过禁用帐户、重命名帐户、剥离组并将它们移动到另一个文件夹来处理它们。为了使用户的停用过程自动化。但是我现在需要在每次运行时创建一个日志文件,以显示 a) 是否在原始 OU (ToBeProcessed) 中找到任何用户和 b) 运行了哪些进程以及它们是否成功。这是代码。
$OUToBeProcessed = "OU=ToBeProcessed,OU=Users,OU=World,DC=local"
$OURetired = "OU=RetiredUsers,OU=Users,OU=World,DC=local"
$Users = Get-ADUser -SearchBase $OUToBeProcessed -Filter 'name -Like "*"' -Properties MemberOf
ForEach($User in $Users){
$SAN = $User.SamAccountName
#Disable user account
Disable-ADAccount -Identity $SAN
#Remove membership from groups for user
$User.Memberof | Remove-ADGroupMember -Member $User -Confirm:$False
$NewDN = "zzz_" + $User.Name
#Change display name
set-aduser $User -Displayname $newDN -ErrorAction SilentlyContinue
#Change distinguished name
Get-ADUser $SAN | Rename-ADObject -Newname $NewDN
Write-Host "$SAN may already exist."
#Move account to RetiredUsers
Get-Aduser $SAN | Move-ADObject -TargetPath $OURetired
}
我假设我需要使用 Write-Output 或 Log-File cmdlet,尽管有人也建议使用 Transcript,但我认为这不是我需要的。
我尝试了多种方法将 Write-Output 合并到脚本中,它运行没有错误,但没有生成文本文件。但我将它放在循环中,这可能是问题所在。我把它放在循环之外,但我认为因为它没有被传递任何东西,它正在创建一个没有任何内容的文件。如果那是正确的 cmdlet,将非常感谢有关 Write-Output 可能需要去哪里的帮助。
【问题讨论】:
-
将所需的输出字符串通过管道传送到
Out-File -Path path\to\log.file -Append -
@MathiasR.Jessen - 可以,但是如果性能是一个问题,在循环中使用
Out-File不是一个好主意;由于每次通过循环打开和关闭文件,都会产生很多开销。不太安全但更高效的方法可能是在循环中累积一组条目,并在循环退出时在一次操作中写出整个数组。 -
@JeffZeitlin 如果脚本失败会怎样?您将丢失所有的日志记录事件
-
@4c74356b41 - 这就是我在评论中说“不太安全”的原因。如果性能不是问题,那么
Out-File完全没问题。
标签: powershell powershell-ise cmdlet