1

我有一个脚本,其中一部分需要运行三个不同的时间,所以我想我会尝试通过使用函数调用相同的代码而不是一次又一次地复制和粘贴来扩展我有限的 PowerShell 知识,并制作更长的时间-不必要的脚本。

我想在函数中重用的代码:

$users = Get-Content users.txt
foreach ($user in $users){
    # Get some information from Exchange about the user
    $dn = (Get-MailboxStatistics -id $user).displayname
    $ic = (Get-MailboxStatistics -id $user).itemcount

    # Make a hash table where user=itemcount
    $firstrun += @{"$dn"="$ic"} # Each time the script runs, we
                                # need a different hash table

    # Kick off some Exchange maintenance on the user. (Removed
    # to keep the post shorter)
    # Item count should lower after a few seconds.
}

当代码第二次和第三次重复时,我希望创建一个新的哈希表(“secondrun”和“thirdrun”)。我的第一个问题是每次更改函数中的哈希表名称 - 可以这样做吗?

我也开始怀疑哈希表是否甚至是适合这项工作的工具,或者是否有更好的工具?对于更多背景知识,在我有了第二个哈希表之后,我想做一个比较:

foreach ($user in $users){
    $c1 = $firstrun.get_item($user)
    $c2 = $secondrun.get_item($user)

    # If the item count hasn't substantially dropped
    if ($c2 -ge $c1){
        # Do some different Exchange tasks on the user (removed
        # to keep the post shorter)
    }
}

最后将进行第三次运行,它将简单地创建第三个哈希表(同样,user=itemcount)。然后,我将使用每个哈希表中的值将某种报告输出到文本文件。

我想在这个阶段我有两个主要问题 - 在函数中更改哈希表的变量名,而且在函数运行后我很难维护哈希表 - 尝试像全局变量一样声明它们不会似乎工作。我愿意接受有关如何更好地完成这一切的想法。

4

3 回答 3

2

如果我明白你在说什么,那么你正在执行以下操作:

  1. 填充将用户集映射到他们的项目计数的哈希表。
  2. 做一些修剪物品的事情
  3. 重新生成哈希表
  4. 比较步骤 1 和 3 中生成的哈希表;再次对名单采取行动。
  5. 重新生成哈希表
  6. 根据所有三个表格生成报告

从上面的列表中可以看出,您确实想要生成一个生成哈希表并返回它的函数:

function Get-UsersItemCount
{
    $ht = @{}
    $users = Get-Content users.txt
    foreach ($user in $users){
        # Get some information from Exchange about the user
        $dn = (Get-MailboxStatistics -id $user).displayname
        $ic = (Get-MailboxStatistics -id $user).itemcount

        # Make a hash table where user=itemcount
        $ht += @{"$dn"="$ic"}
    }

    $ht # Returns the hashtable
}

现在你可以调用这个函数三次:

$firstrun = Get-UsersItemCount

# Do first run stuff
$secondrun = Get-UsersItemCount

# Do second run stuff
$thirdrun = Get-UsersItemCount

# Generate your report
于 2013-03-12T00:34:00.570 回答
1

您可以只使用一个哈希表,使值成为一个数组,每次传递一个元素:

$ht = @{}

$users = Get-Content users.txt
foreach ($user in $users){
    # Get some information from Exchange about the user
    $stats = Get-MailboxStatistics $user |
               select -expand itemcount
    $ht[user] += @($stats)}
}

# Kick off some Exchange maintenance on the user. (Removed to
# keep post shorter)
# Item count should lower after a few seconds.

foreach ($user in $users){
    # Get some information from Exchange about the user
    $stats = Get-MailboxStatistics $user |
               select -expand itemcount
    $ht[user] += @($stats)

    # If the item count hasn't substantially dropped
    if ($ht[$user][1] -ge $ht[$user][0])
        # Do some different Exchange tasks on the user (removed
        # to keep the post shorter)
}
于 2013-03-12T00:54:16.620 回答
0

如果我是你,我会怎么做?我假设哈希表的名称无关紧要。如果是这种情况,您可以获取当前日期时间并使用它来命名您的哈希表,例如

$HashTblName = "HashTbl_$($(get-date).ToString("yyyyMMddhhmmssff"))"
于 2013-03-12T00:31:26.767 回答