Powershell 用于循环的逻辑。最简单vs最有效
由于我不是一个专业的程序员,我应该使用哪种逻辑来编写易于理解但高效的脚本?我正在编写一个脚本,搜索所有广告用户,并基于广告属性(即office),将一些字符串写入少数其他属性(城市、邮政编码等)。我一直在使用Foreach,然后在该循环中使用set ADUser with replace或where子句。或者一堆IF,IfElse语句的非常混乱的方式。另外,我开始研究Switch(Case)语句 有什么建议吗 从小事做起,我从以下几点开始:Powershell 用于循环的逻辑。最简单vs最有效,powershell,active-directory,Powershell,Active Directory,由于我不是一个专业的程序员,我应该使用哪种逻辑来编写易于理解但高效的脚本?我正在编写一个脚本,搜索所有广告用户,并基于广告属性(即office),将一些字符串写入少数其他属性(城市、邮政编码等)。我一直在使用Foreach,然后在该循环中使用set ADUser with replace或where子句。或者一堆IF,IfElse语句的非常混乱的方式。另外,我开始研究Switch(Case)语句 有什么建议吗 从小事做起,我从以下几点开始: $Users = Get-ADUser -searc
$Users = Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" -filter {samaccountname -like "r*"} -properties * | Select samaccountname,streetaddress,l, postalcode,st,physicaldeliveryofficename
foreach ($user in $users) {
set-aduser $user -city "NoWhere" -Postalcode "B2B 2B2"| where {$_.physicaldeliveryofficename -eq "Head Office"}
}
或者换成开关:
$Users = Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" -filter {samaccountname -like "remot*"} -properties * | Select samaccountname,streetaddress,l, postalcode,st,physicaldeliveryofficename
foreach ($user in $users) {switch ($users.physicaldeliveryofficename){
"Nowhere town" { -city "NoWhere" -postalcode "A1A A1A"}
"Anywhereville" { -city "Anywhere" -postalcode "B1B B1B"}
}}
使用
|ForEach{……}
代替ForEach
语句
,(
,{
,,
,未完成的两个操作数运算符(如+
)之后开始一行新行,或者在行尾使用一个反勾来包装一长串参数Switch
是一种方法,因为当管道化时,没有完整的列表可用,所以每个元素都应该单独处理使用
|ForEach{……}
代替ForEach
语句
,(
,{
,,
,未完成的两个操作数运算符(如+
)之后开始一行新行,或者在行尾使用一个反勾来包装一长串参数Switch
是一种方法,因为当管道化时,没有完整的列表可用,所以每个元素都应该单独处理它在很多时候取决于脚本。通常可读性比原始性能重要得多。然而,PowerShell不是SQL,
Set ADUser…|其中Office='Head Office'
在PowerShell中毫无意义。它在很多时候取决于脚本。通常可读性比原始性能重要得多。然而,PowerShell是不是SQL,Set ADUser…| where Office='Head Office'
在powershell中毫无意义。为什么要在循环中嵌套一个循环?Switch(Get ADUser){{$\u.physicaldeliveryofficename-match“Nowhere”}{Set ADUser$\u-City“Nowhere”;Continue};{$\u.physicaldiveryofficename-match“Anywhere”}{Set ADUser$\u-City“Anywhere”;Continue}
。我想说一点第3点,在你发布的内容和OP拥有的内容之间有一个很好的中介,但在我看来两者都不是很好。1.没有嵌套循环,因为switch
不是一个真正的循环。例如,它没有利用管道:它首先获取整个用户列表,因此可能会有很长的停顿。在案例只有一个简单的操作需要执行,但你的方法可能会更好。2.没有必要争论#3,这只是常识和个人偏好。我也对编写OneLiner感到内疚,但这些都是用于编写一次只写的脚本。这是不正确的,它不会首先获取整个用户列表。它将获得用户,一个在收到每个结果时,根据Switch
语句对每个用户进行评估。此外,它是一个循环,这就是Continue
语句对其进行操作以移动到找到的下一个用户的原因。Switch不会根据简单可靠的测试进行管道化:Switch(gci c:\*-recurse){{$\uu.fullname-like'*}{1}
-我看到了一个很长的停顿,如果可以通过|
以外的方式调用管道,那将是非常奇怪的。至于开关作为一个循环,我承认这一点,因为你的论点是有说服力的。然而,这并没有挫败我的主要观点,即管道的使用。为什么要在循环中嵌套一个循环?开关(Get ADUser){$\.physicaldeliveryofficename-match“Anywhere”}{Set-ADUser$\-City“Anywhere”;Continue};{$\.physicaldeliveryofficename-match“Anywhere”}{Set-ADUser$\-City“Anywhere”;Continue}
。我想说一点第3点,在你发布的内容和OP拥有的内容之间有一个很好的中介,但在我看来两者都不是很好。1.没有嵌套循环,因为switch
不是一个真正的循环。例如,它没有利用管道:它首先获取整个用户列表,因此可能会有很长的停顿。在案例只有一个简单的操作需要执行,但你的方法可能会更好。2.没有必要争论#3,这只是常识和个人偏好。我也对编写OneLiner感到内疚,但这些都是用于编写一次只写的脚本。这是不正确的,它不会首先获取整个用户列表。它将获得用户,一个在收到每个结果时,根据Switch
语句对每个用户进行评估。此外,它是一个循环,这就是Continue
语句对其进行操作以移动到找到的下一个用户的原因。Switch不会根据简单可靠的测试进行管道化:Switch(gci c:\*-recurse){{$\uu.fullname-like'*}{1}
-我看到了一个很长的停顿,如果可以通过|
以外的方式调用管道,那将是非常奇怪的。至于开关作为一个循环,我承认这一点,因为你的论点是有说服力的。然而,这并没有挫败我的主要观点,即管道的使用。
Get-ADUser -searchbase "OU=users,OU=testing,DC=blah,DC=company,DC=com" `
-filter 'samaccountname -like "r*"' `
-properties * |
Select samaccountname,
streetaddress,
l,
postalcode,
st,
physicaldeliveryofficename |
ForEach {
switch ($_.physicaldeliveryofficename) {
"Nowhere town" { $city = "NoWhere"; $postalcode = "A1A A1A"; break }
"Anywhereville" { $city = "Anywhere"; $postalcode = "B1B B1B"; break }
default { $city = "?"; $postalcode = "" }
}
Set-ADUser $_ -City $city -Postalcode $postalcode
}