Windows 如何在powershell中搜索文件和显示进度条

Windows 如何在powershell中搜索文件和显示进度条,windows,file,powershell,get-childitem,Windows,File,Powershell,Get Childitem,我目前正在Powershell中编码,我正在寻找一种在搜索系统文档时显示进度条的方法。我使用的是getchilditem而不是循环,因为它比循环快得多,效率也更高。我已经了解了如何使用Get-ChildItemcmdlet,但是我需要帮助了解如何在其中实现进度条。以下是我正在使用的代码示例,因此更容易理解: Set-Variable $Loading 0 Write-Progress -Activity "Collecting Files For Removal..." -CurrentOper

我目前正在Powershell中编码,我正在寻找一种在搜索系统文档时显示进度条的方法。我使用的是
getchilditem
而不是循环,因为它比循环快得多,效率也更高。我已经了解了如何使用
Get-ChildItem
cmdlet,但是我需要帮助了解如何在其中实现进度条。以下是我正在使用的代码示例,因此更容易理解:

Set-Variable $Loading 0
Write-Progress -Activity "Collecting Files For Removal..." -CurrentOperation "Collecting User Files..." -PercentComplete $Loading
Get-ChildItem C:\Users\firea\ -Filter *.D11 -ErrorAction SilentlyContinue -Force

所以,听起来像是你想向用户显示一个进度条,显示X%已完成,但是直到你运行
Get ChildItem
你才知道总共有多少个项目,所以你无法真正判断你离完成有多近。让我换一种说法

比如说你出去远足。你在网上快速搜索当地的小径,找到一条,然后出发!你知道小道从哪里开始,你知道小道的尽头有一个玉米狗摊,你期待着取样。在你徒步旅行的12分钟后,你的女朋友打电话给你,要求你也给她带回一只玉米狗!当然,没问题,当它到达她的时候可能会很冷,但你可以做到。然后她问你要花多长时间,你意识到你不知道。你只需要12分钟,但在你到达玉米狗摊之前,你不知道是再往前走3分钟,还是35分钟,因为你不知道这条路有多长

好的,同样的场景,但这次你看到的是穿过小道的拉链线,然后先把它拿走。当然,你不知道这条小径的所有细节是什么,但是你对它的长度有了一个很好的了解,并且对这条小径有了一个大致的了解。这一次,当你的女朋友打电话给你时,你可以告诉她大约需要20分钟,因为你大约需要12分钟,到看台大约需要4分钟,然后再花16分钟回到她所在的地方

同样的想法也适用于你的剧本。为了给用户一个粗略的进度估计,你必须对你正在看的东西有一个粗略的概念。您正在搜索1个文件夹吗?好吧,确实没有什么好方法可以粗略估计一个文件夹,但是你不需要花那么长时间就需要一个进度条。现在,如果您正在搜索整个驱动器,您可以使用
Get ChildItem
-directory
参数,找出有多少文件夹,并根据您搜索的文件夹数量给出用户进度

例如:

#Get directory list, silently continue on errors in case script isn't run as an admin and there are system folders
$folders = Get-ChildItem C:\Users -Recurse -Directory -ErrorAction SilentlyContinue
#Loop through folders, checking each for files
$files = For($i = 0; $i -lt $folders.count; $i++)
{
    #Update progress bar for current folder
    Write-Progress -Activity "Collecting Files For Removal..." -CurrentOperation "Collecting User Files..." -PercentComplete (($i+1) / $folders.count * 100) -Status ("Folder {0} of {1}" -f ($i + 1), $folders.count)
    Get-ChildItem $folders[$i].FullName -Filter *.D11 -ea 4
}

此示例获取C:\Users文件夹下的所有文件夹。然后它遍历这些文件夹,检查每个文件夹中是否有所需的文件。对于每个文件夹,它都会更新进度条。现在这将是一个粗略的估计,因为并非所有文件夹都有相同数量的文件,因此有些文件夹会比其他文件夹完成得更快,但它至少让用户对正在取得的进展有了一些了解。

写进度
并不是真正用来衡量像
Get ChildItem
这样的命令的运行时间的。您更可能将其用作完成情况的比较,例如,如果您有一组文件,并且您正在移动它们,您可以在
ForEach
循环中利用
Write Progress
,在每个副本或类似性质的内容之后进行更新。@Theincorgible1好吧,我最近一直在尝试停止循环,因为它们相当复杂(我昨天刚开始使用Powershell),我尽量保持简单。不过,你说得有道理。。。一旦我接触到更高级的东西,我可能会在另一个项目中尝试这种方法。你有没有其他可行的想法?你会如何显示搜索进度条?在完成之前,系统不知道它的上限
Get ChildItem
是一个cmdlet,在完成之前不能在同一线程中运行任何其他内容,此时显示进度条是没有意义的。如果你想要一个进度条,系统需要事先获取数据,这意味着你必须先进行扫描。而且你必须使用你一直努力避免的非常“可怕”的循环。正如Rohin所建议的那样,你不能显示进度条,因为在完成之前,系统不知道要查看多少总文件。除此之外,PowerShell一次只做一件事,没有一些相当先进的技术,因此搜索硬盘并同时显示/更新进度条并不是一个简单的要求。如果你真的想了解如何去做,那就去看看吧。如果你是一个新手,准备好让你的大脑融化一点。只是一个技术性的问题,但我想用你的术语来帮助你避免混淆
Get ChildItem
是cmdlet,而不是脚本。脚本是在编写一系列命令以完成一个或多个任务时得到的。当提到循环时,它只是一个循环,而不是一个循环程序。一个程序意味着PowerShell之外的东西,比如Word或Internet Explorer。我想我明白了——但请记住,我的自闭症使我的大脑处理事情的方式不同,其中一些让我有点困惑。如果您提供一个我可以使用的脚本示例,我会理解得更好。不过,谢谢你的尝试;我很感激人们至少在这里帮助我。如果您决定提供一个脚本,请尝试使脚本尽可能简单,因为循环脚本在Powershell中有点奇怪。(由于这个原因,我更喜欢Python风格而不是Powershell)