【问题标题】:Powershell Continue where I left off in a loopPowershell 从我离开的地方继续循环
【发布时间】:2023-02-06 06:07:06
【问题描述】:

您好,我有一个脚本可以从一组办公室位置获取所有用户。然后我运行一个脚本来获取用户登录的所有服务器,并获取 Windows 事件以检查用户是否已登录到计算机。这工作正常,该脚本有时需要很长时间才能让 800 多个用户检查 100 多台服务器。所以脚本将停止。我需要一种重新启动脚本的方法,但不是从我的 $USERS 变量的顶部重新开始。我将登录 inn 的用户的值导出到一个 csv 文件中。我导入此文件并读取最后一个条目用户。然后我希望脚本从该用户条目索引继续。

所以我想有一种方法来检查用户,然后将索引设置为从用户号 3 开始,然后处理其余的 4 - 结束。

$lastuser = (import-csv -path "Path to csv file").UserName[-1]
Ray
Tod
Burt # Lets say the script terminates here, I want it to continue from here and then procsess the rest
Ali
Mohamed
Annie.....

【问题讨论】:

  • 我不会那样做的。要么收集用户列表并处理它们,要么开始工作Start-Job 执行您的操作并继续循环。
  • 您有一个数组,可以使用 SKIP(integer) 忽略已处理的项目。所以通常你会将跳过设置为零来完成整个列表。当您恢复时,您可以将跳过值设置为更大的数字
  • 你能分享你目前使用的代码吗?如上所述,可能有更好的方法来实现这一点。
  • 为什么会停止?您可以尝试工作流程。
  • 感谢您提供的所有答案 :) 正如 cmets 中提到的那样,是的,我尝试使用 start-job witch 效果更好。 js2010 很好,因为我在活动的 RDP 会话中运行它,会话断开连接..当我回来时,Powershell 脚本没有继续并且没有 CPU 负载.. ???服务器在 knight 重启,这样就发生了 :P

标签: powershell loops variables


【解决方案1】:

尝试以下获取最后一个用户的索引:

$users = @("Ray","Tod","Burt","Ali")
$lastUser = "Burt"
$userList = New-Object System.Collections.Generic.List[string]
$userList.AddRange([string[]]$users)
$userList
$index = $userList.IndexOf($lastUser)
$index

【讨论】:

  • 谢谢@jdwen 我会试试这个。我尝试了我的脚本的另一个变体,我排除了构建我的 $USERS 数组,但不包括已经处理过的数组。女巫工作 :) 但是嘿新对象 ??对我来说是新体验 :) 谢谢你的所有回答 :)
  • 它是 C# 代码。 IndexOf() 方法需要一个列表而不是数组才能工作
  • 您不需要列表:[array] 也支持 .IndexOf()(通过 PowerShell 自动显示的 IList 界面):尝试 @("Ray","Tod","Burt","Ali").IndexOf('Burt')。两种情况下的警告是查找是大小写-敏感的,而 PowerShell 通常是大小写 -麻木不仁.
【解决方案2】:

先不考虑 cmets 中提出的关于是否有方法确保不间断运行的问题:

如果您可以依赖 $USERS 的值在运行之间没有变化,并假设始终处理用户顺序地,您根本不需要执行任何查找:

数数CSV 文件中的行就是指数进入您必须恢复处理的$USERS变量:

# Get all not-yet-processed elements from the $Users array.
$Users[(Import-Csv "Path to csv file").Count..$Users.Count-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2017-09-28
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多