Powershell Foreach,While和其他循环的工作方式

学习编程的关键的第一步是使用循环。值得庆幸的是,PowerShell会随着您的技能不断发展。

您可以在循环中构造每天使用的现有命令,以节省时间和精力。在阅读有关PCPC.me的更多文章的重要工作时,脚本会费劲!

Powershell ForEach循环:高级数据处理之门

ForEach是ForEach的别名-宾语。 (别名只是PowerShell中命令的快捷方式。)这是讨论PowerShell处理数据方式的好时机。

与大多数现代编程语言一样,PowerShell是面向对象的。该属性就是为什么您可以将搜索设置为变量并以结果数组结尾的原因。

$yourVar = Get-ChildItem *foreach ($file in $yourVar){  Your Steps}

在某些语言中,处理该数组将是一个多步骤过程。首先,获取长度,然后计算每个步骤。

在PowerShell中,您将遍历数组并使用ForEach对每个数组执行操作。这样可以节省几行代码,如果脚本较长,这将很有帮助。例如,以下是一个小脚本,它将使用几个Powershell ForEach循环。它会为您30天内未打开的所有文件创建一个ZIP存档。

使用ForEach循环构建文件存档系统

让我们分步介绍。您使用 Get-ChildItem 获取“文档"文件夹中的所有文件。环境变量 $ env:USERPROFILE 使用当前配置文件运行脚本。该变量比硬编码路径更可移植。该搜索的结果将分配给变量 $ MyDocs 。然后,让我们逐步遍历$ MyDocs中的每个 $ Doc ,从而创建ForEach循环。

$oldDocs = @()$MyDocs = Get-ChildItem -Path "$($env:USERPROFILE)\Documents" -Recurseforeach ($doc in $MyDocs){  if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){    $oldDocs += $doc  }}$ArchiveFolder = New-Item -Path "$($env:USERPROFILE)\Documents\$((Get-Date -Format MMddyy).toString())" -ItemType Directoryforeach ($doc in $oldDocs){  Move-Item -Path $doc.FullName -Destination "$($ArchiveFolder.FullName)\$($doc.Name)" -Confirm $false}$source = $ArchiveFolder.FullName$destination = "$($env:USERPROFILE)\Documents\$($ArchiveFolder.Name).zip"Add-Type -AssemblyName "system.io.compression.filesystem"[io.compression.zipfile]::CreateFromDirectory($source, $destination)if(test-path $destination){  Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false}

在循环内部,我们检查是否每个文件的 LastAccessTime 属性已超过30天。我们使用 Get-Date cmdlet并使用负数为30的 AddDays 函数来获得此结果。如果是这样,我们将文件添加到 $ myOldDocs 数组中。文件排序完成后,我们将使用完成的数组并创建一个zip文件。这个过程稍微复杂一点,因为它涉及到一些.NET。如果您不太了解它,请不要担心-您可以从TechNet帮助文档中窃取代码。

要了解此处发生的情况:我们会将所有旧文件移至新目录以今天的日期命名(超过30天)。建立该文件夹后,我们必须创建相同名称的ZIP存档。我们将进行测试,以确保归档成功完成并存在.ZIP文件,然后删除新文件夹。将其设置为每月运行一次的计划任务。您将节省一些空间并保持Documents文件夹的清洁。

同时执行以下操作:在条件上循环

如果您只想在特定条件下运行循环遇到时,您使用While循环。如果您使用变量来跟踪计数,请先进行设置。

i=0while(i<10){  Your Steps  i+=1}

问题是,如果您不使用计数器,那么即使您希望代码至少运行一次,即使测试是真的。下面的示例脚本就是这种情况。因此,在这些情况下,您想使用Do-While循环。语法略有不同。

do{  Your Steps}while(Conditional Statement)

对于新手程序员而言,使用它们并不那么明显。做典型的日常脚本编写,您可能不会经常遇到它们。它们特别有用的地方是使用一个临时计时器来测试过程的成功。

我们将构建一个快速脚本来重新启动远程计算机,并在远程计算机没有回来时发出警报。在15分钟内完成。这种情况假设它是一台家用服务器或其他不经常重启的机器。如果您的计算机通常运行更快,请随时调整时间。

重新启动并检查:使用Do-While循环

此脚本要简单一些。首先,使用 Restart-Computer 命令重新启动远程计算机。 (我们在此处将虚拟IP用于重新启动命令,请确保使用您计算机的DNS / IP覆盖它)。然后创建计数器变量 i 并将其设置为0。接下来,使用Start-Sleep使Do循环将脚本停止300秒(五分钟)。第二个命令将一个添加到计数器。

Restart-Computer -ComputerName 127.0.0.1i=0do{  Start-Sleep -Seconds 300  $i += 1}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)if($i -gt 3){  Write-Ouput "Remote Machine not responding, please check."}else{  Write-Output "Reboot Succeeded"}

然后,我们有了While条件。我们使用“或"测试来确保失败会生成警报。另一种选择是脚本循环不断地等待远程计算机。要检查计算机,我们使用 Test-Connection cmdlet。为简单起见,这是Ping for PowerShell。我们添加参数 -Quiet ,强制其返回True或False,而不是数据包的结果。 Or语句的第二部分检查计数器是否大于三个。

循环完成后,我们要创建输出。这意味着我们需要检查我们的柜台。这是一个快速的if / else语句。如果大于三,则脚本输出远程计算机无响应。如果不是,则输出重启成功。

其他循环

PowerShell中提供了两种其他循环。它们在某种程度上与前两个循环相关,只是它们并不常用。 For循环的作用类似于While示例。您可以在评估中设置所有条件,然后设置您的cmdlet。

for($i = 0;$i -lt 10;$i++){  Your Steps}

Do直到循环就像Do While循环一样,您只需将While语句更改为直到。在示例脚本中,行为方面是相同的。这是一种样式选择,但是“在其他情况下使用“做时空"的用途更为广泛。因此,如果您只记得其中一个,则“ Do While"更为有用。

PowerShell还可为上述每个循环提供帮助。您可以通过在Get-Help中的循环名称前添加 about 来获得帮助。然后,您可以查看每种类型的示例和其他提示。如果您遇到困难,这些应该会有所帮助。

继续与您一起成长

在这一点上,您具备开始构建可靠脚本的大多数技能。是否使您的家用钻机自动化。

您使用循环创建的巧妙的PowerShell脚本是什么?在评论中与我们分享。

标签: PowerShell 脚本