Powershell Get ChildItem脚本由于对象较大而挂起?

Powershell Get ChildItem脚本由于对象较大而挂起?,powershell,powershell-2.0,Powershell,Powershell 2.0,好的-我是全新的PowerShell。我两周前才开始使用它。我在网上搜索了一些脚本,现在我正在尝试一些似乎有点先进的东西,我不确定我应该如何解决这个问题 我正在创建一个审核脚本,以确定两个备份存储库之间有哪些不同的文件,以确保它们已正确同步(同步脚本使用robocopy,并且它们多次失败而未产生错误)。文件夹非常广泛,有时,我发现脚本只是挂在某些文件夹上(总是挂在最大的文件夹上),因此它永远不会完成 起初,我在完整的源代码路径上使用Get ChildItem,但这造成了内存问题,脚本将永远无法完

好的-我是全新的PowerShell。我两周前才开始使用它。我在网上搜索了一些脚本,现在我正在尝试一些似乎有点先进的东西,我不确定我应该如何解决这个问题

我正在创建一个审核脚本,以确定两个备份存储库之间有哪些不同的文件,以确保它们已正确同步(同步脚本使用robocopy,并且它们多次失败而未产生错误)。文件夹非常广泛,有时,我发现脚本只是挂在某些文件夹上(总是挂在最大的文件夹上),因此它永远不会完成

起初,我在完整的源代码路径上使用Get ChildItem,但这造成了内存问题,脚本将永远无法完成。所以,我想我应该枚举子目录并对每个子目录进行比较。。。但根据文件夹的不同,情况也会变糟

以下是脚本(使用Powershell 2):

当以交互方式运行时,我发现我将得到一个“当前正在处理FolderName”,如果该对象“太大”(不管是什么),脚本将在该点上停留,不显示任何错误,但它不会继续(我已经等待了数小时)。有时我可以交互地点击Ctrl-C,而不是退出脚本,它将中断作为当前进程的取消,并移动到下一项


问题是,我需要安排每天都这样做,以确保备份保持同步。任何帮助或见解都将不胜感激。是的,这可能是原始的和不雅的,但现在我只是想解决如何绕过挂在我身上的脚本。

不确定您使用的是什么版本的PS,但get Childitem在扩展到大目录时遇到了已知的问题:

如果只是比较文件名,则可以使用legacy dir命令在大型目录结构中获得更好的结果。/b(裸)开关仅返回可与Powershell的比较运算符一起使用的全名字符串

$sourcedir = 'c:\testfiles'
$source_regex = [regex]::escape($sourcedir)

(cmd /c dir $Sourcedir /b /s) -replace "$source_regex\\(.+)$",'$1'

这将使用正则表达式和-replace运算符从dir返回的全名中删除soruce目录。-replace操作符将处理数组,因此您可以在一个操作中完成所有操作,而无需foreach循环。

不确定您使用的PS版本,但Get Childitem在扩展到大目录时存在已知问题:

如果只是比较文件名,则可以使用legacy dir命令在大型目录结构中获得更好的结果。/b(裸)开关仅返回可与Powershell的比较运算符一起使用的全名字符串

$sourcedir = 'c:\testfiles'
$source_regex = [regex]::escape($sourcedir)

(cmd /c dir $Sourcedir /b /s) -replace "$source_regex\\(.+)$",'$1'

这将使用正则表达式和-replace运算符从dir返回的全名中删除soruce目录。-replace操作符将处理数组,因此您可以在一个操作中完成所有操作,而无需foreach循环。

您只是检查文件名,还是同时检查长度匹配?只是检查文件名以确保它们存在。每天都有足够多的文件在变化,这就是所需的全部内容。您只是在检查文件名,还是也在检查长度匹配?只是检查文件名以确保它们存在。每天都有足够多的文件在变化,这就是所需的全部。使用Powershell 2.0-抱歉。我应该把那个贴出来。。。它在标签上,但几乎看不见。我的错。我会去看看。。。我没有意识到我可以在递归场景中使用它。对不起,我错过了标记。我相信这篇文章中的gci性能问题确实适用于V2。首先,感谢您花时间提供帮助。我很感激。所以,这绝对是一个进步,问题是因为我在比较两个完全不同的目录结构,/b开关给了我完整的路径。。。所以Compare对象总是生成一个完整的列表(因为由于完整路径,没有匹配项)。在Compare对象中,我可以做些什么让它忽略基本路径,还是有办法让dir命令输出除基本路径以外的所有内容?可以,但只使用/b开关,然后使用字符串操作处理结果会更快。我将用一个例子更新脚本。非常感谢先生!那是为了我。大目录现在已经证明不是问题了。标记为答案,但我没有足够的声誉来投票。使用Powershell 2.0-抱歉。我应该把那个贴出来。。。它在标签上,但几乎看不见。我的错。我会去看看。。。我没有意识到我可以在递归场景中使用它。对不起,我错过了标记。我相信这篇文章中的gci性能问题确实适用于V2。首先,感谢您花时间提供帮助。我很感激。所以,这绝对是一个进步,问题是因为我在比较两个完全不同的目录结构,/b开关给了我完整的路径。。。所以Compare对象总是生成一个完整的列表(因为由于完整路径,没有匹配项)。在Compare对象中,我可以做些什么让它忽略基本路径,还是有办法让dir命令输出除基本路径以外的所有内容?可以,但只使用/b开关,然后使用字符串操作处理结果会更快。我将用一个例子更新脚本。非常感谢先生!那是为了我。大目录现在已经证明不是问题了。标记为答案,但我还没有足够的声誉来投票支持它。