Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 用于循环的逻辑。最简单vs最有效_Powershell_Active Directory - Fatal编程技术网

Powershell 用于循环的逻辑。最简单vs最有效

Powershell 用于循环的逻辑。最简单vs最有效,powershell,active-directory,Powershell,Active Directory,由于我不是一个专业的程序员,我应该使用哪种逻辑来编写易于理解但高效的脚本?我正在编写一个脚本,搜索所有广告用户,并基于广告属性(即office),将一些字符串写入少数其他属性(城市、邮政编码等)。我一直在使用Foreach,然后在该循环中使用set ADUser with replace或where子句。或者一堆IF,IfElse语句的非常混乱的方式。另外,我开始研究Switch(Case)语句 有什么建议吗 从小事做起,我从以下几点开始: $Users = Get-ADUser -searc

由于我不是一个专业的程序员,我应该使用哪种逻辑来编写易于理解但高效的脚本?我正在编写一个脚本,搜索所有广告用户,并基于广告属性(即office),将一些字符串写入少数其他属性(城市、邮政编码等)。我一直在使用Foreach,然后在该循环中使用set ADUser with replace或where子句。或者一堆IF,IfElse语句的非常混乱的方式。另外,我开始研究Switch(Case)语句

有什么建议吗

从小事做起,我从以下几点开始:

 $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"}
}}
  • 优化查询,因为查询复杂的外部资源通常需要99%的运行时间
  • 使用管道,以便在不累积整个列表的情况下立即开始处理:
    使用
    |ForEach{……}
    代替
    ForEach
    语句
  • 停止编写单行程序:您可以在
    {
    ,未完成的两个操作数运算符(如
    +
    )之后开始一行新行,或者在行尾使用一个反勾来包装一长串参数
  • Switch
    是一种方法,因为当管道化时,没有完整的列表可用,所以每个元素都应该单独处理
  • 优化查询,因为查询复杂的外部资源通常需要99%的运行时间
  • 使用管道,以便在不累积整个列表的情况下立即开始处理:
    使用
    |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
        }