如何通过 UNC 加速 Powershell Get-Childitem

2024-04-19

DIR or GCI在 Powershell 中很慢,但在 CMD 中很快。有什么办法可以加快这个速度吗?

在 CMD.exe 中,经过亚秒级延迟后,其响应速度与 CMD 窗口可以跟上的速度一样快

dir \\remote-server.domain.com\share\folder\file*.*

在 Powershell (v2) 中,经过 40 秒以上的延迟后,响应速度明显变慢(可能每秒 3-4 行)

gci \\remote-server.domain.com\share\folder\file*.*

我正在尝试扫描远程服务器上的日志,所以也许有更快的方法。

get-childitem \\$s\logs -include $filemask -recurse | select-string -pattern $regex

好吧,我就是这样做的,而且看起来很有效。

$files = cmd /c "$GETFILESBAT \\$server\logs\$filemask"
foreach( $f in $files ) {
    if( $f.length -gt 0 ) {
        select-string -Path $f -pattern $regex | foreach-object { $_ }
    }
}

然后 $GETFILESBAT 指向这个:

@dir /a-d /b /s %1
@exit

我正在从 PowerShell 脚本中编写和删除这个 BAT 文件,所以我猜这是一个仅限 PowerShell 的解决方案,但它不仅仅使用 PowerShell。

我的初步性能指标显示速度快了一万倍。

我测试了 gci 与 cmd dir 与来自 @Shawn Melton 引用的 FileIO.FileSystem.GetFileslink http://blogs.msdn.com/b/powershell/archive/2009/11/04/why-is-get-childitem-so-slow.aspx.

最重要的是,对于本地驱动器上的日常使用,GetFiles是最快的。By far. CMD DIR是值得尊敬的。一旦您为许多文件引入较慢的网络连接,CMD DIR略快于GetFiles. Then Get-ChildItem...哇,这范围从不太糟糕到可怕,具体取决于所涉及的文件数量和连接速度。

一些测试运行。我在测试中移动了 GCI,以确保结果一致。

10次​​迭代扫描c:\windows\temp对于 *.tmp 文件

.\test.ps1 "c:\windows\temp" "*.tmp" 10
GetFiles ... 00:00:00.0570057
CMD dir  ... 00:00:00.5360536
GCI      ... 00:00:01.1391139

GetFiles 比 CMD dir 快 10 倍,而 CMD dir 本身比 GCI 快 2 倍以上。

10次​​迭代扫描c:\windows\temp对于带有递归的 *.tmp 文件

.\test.ps1 "c:\windows\temp" "*.tmp" 10 -recurse
GetFiles ... 00:00:00.7020180
CMD dir  ... 00:00:00.7644196
GCI      ... 00:00:04.7737224

GetFiles 比 CMD dir 快一点,两者几乎都比 GCI 快 7 倍。

扫描另一个域上的现场服务器以获取应用程序日志文件的 10 次迭代

.\test.ps1 "\\closeserver\logs\subdir" "appname*.*" 10
GetFiles ... 00:00:00.3590359
CMD dir  ... 00:00:00.6270627
GCI      ... 00:00:06.0796079

GetFiles 比 CMD dir 快大约 2 倍,本身比 GCI 快 10 倍。

扫描另一个域上的远程服务器以查找应用程序日志文件的一次迭代,涉及许多文件

.\test.ps1 "\\distantserver.company.com\logs\subdir" "appname.2011082*.*"
CMD dir  ... 00:00:00.3340334
GetFiles ... 00:00:00.4360436
GCI      ... 00:11:09.5525579

CMD dir 是到达包含许多文件的远程服务器最快的,但 GetFiles 相当接近。另一方面,GCI 的速度要慢几千倍。

扫描另一个域上的远程服务器以查找应用程序日志文件(包含许多文件)的两次迭代

.\test.ps1 "\\distantserver.company.com\logs\subdir" "appname.20110822*.*" 2
CMD dir  ... 00:00:00.9360240
GetFiles ... 00:00:01.4976384
GCI      ... 00:22:17.3068616

随着测试迭代的增加或多或少呈线性增加。

扫描另一个域上的远程服务器以查找应用程序日志文件的一次迭代,文件较少

.\test.ps1 "\\distantserver.company.com\logs\othersubdir" "appname.2011082*.*" 10
GetFiles ... 00:00:00.5304170
CMD dir  ... 00:00:00.6240200
GCI      ... 00:00:01.9656630

这里 GCI 还不错,GetFiles 快了 3 倍,CMD dir 紧随其后。

结论

GCI需要一个-raw or -fast不尝试做太多事情的选项。同时,GetFiles是一种健康的替代方案,只是偶尔比它慢一点CMD dir,并且通常更快(由于生成 CMD.exe?)。

作为参考,这里是 test.ps1 代码。

param ( [string]$path, [string]$filemask, [switch]$recurse=$false, [int]$n=1 )
[reflection.assembly]::loadwithpartialname("Microsoft.VisualBasic") | Out-Null
write-host "GetFiles... " -nonewline
$dt = get-date;
for($i=0;$i -lt $n;$i++){
  if( $recurse ){ [Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles( $path,
      [Microsoft.VisualBasic.FileIO.SearchOption]::SearchAllSubDirectories,$filemask
    )  | out-file ".\testfiles1.txt"}
  else{ [Microsoft.VisualBasic.FileIO.FileSystem]::GetFiles( $path,
      [Microsoft.VisualBasic.FileIO.SearchOption]::SearchTopLevelOnly,$filemask
    )  | out-file ".\testfiles1.txt" }}
$dt2=get-date;
write-host $dt2.subtract($dt)
write-host "CMD dir... " -nonewline
$dt = get-date;
for($i=0;$i -lt $n;$i++){
  if($recurse){
    cmd /c "dir /a-d /b /s $path\$filemask" | out-file ".\testfiles2.txt"}
  else{ cmd /c "dir /a-d /b $path\$filemask" | out-file ".\testfiles2.txt"}}
$dt2=get-date;
write-host $dt2.subtract($dt)
write-host "GCI... " -nonewline
$dt = get-date;
for($i=0;$i -lt $n;$i++){
  if( $recurse ) {
    get-childitem "$path\*" -include $filemask -recurse | out-file ".\testfiles0.txt"}
  else {get-childitem "$path\*" -include $filemask | out-file ".\testfiles0.txt"}}
$dt2=get-date;
write-host $dt2.subtract($dt)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 UNC 加速 Powershell Get-Childitem 的相关文章

  • Powershell Bash/Zsh 命令中的多个参数

    无法在 Powershell 中运行以下 Bash Zsh 命令 KeyPath Join Path Path this Plate ChildPath install tekton key kubectl create secret do
  • SMART 硬盘信息 Powershell [重复]

    这个问题在这里已经有答案了 我正在寻找一种通过可能的 powershell 来获取任何给定设备上硬盘驱动器的 SMART 数据的方法 我已经通过 CMD 和 powershell 尝试过 WMI 命令 但无法获得我正在寻找的适当数据 获取
  • PowerShell 中的触摸功能

    我最近在 PowerShell 配置文件中添加了触摸功能 PS gt notepad profile function touch Set Content Path args 0 Value null 保存并运行测试 touch myfil
  • 在结果中只显示一列?

    这是一个简单的问题 但如何在下面的代码中选择特定的列 我只想显示 时间 列 而不显示其他任何内容 我尝试输入 FORMAT TABLE TIME 但它只是多次填充 TIME 而没有实际显示时间 server event Get Conten
  • Try Catch 在 Powershell 脚本中不起作用

    我似乎无法让这个 try catch 工作 我确信这很简单 但此刻我的大脑太煎熬了 请帮忙 param String RemoteServicesVMs VmThatThrowsError function getWinServiceSta
  • Jenkins 执行 PowerShell 脚本

    我正在尝试从 Jenkins 运行 PowerShell 脚本 但它似乎完全忽略了执行策略 可以通过直接执行 powershell exe 或使用PowerShell插件 https wiki jenkins ci org display
  • Powershell 调用程序集委托

    我有一个用于过程控制应用程序的 dll 程序集 我在我的内部使用 load电源外壳 script 该DLL包含我需要使用的委托类型 委托名称是 X Y Delegate 我在该 DLL 中有另一个方法 应该这样调用 Method deleg
  • Powershell脚本命令持久化

    我开始学习 Powershell 并编写一个模块 psm1 来存储我的函数 然后我将这段代码插入到模块中 以便在修改模块时重新加载模块 function reload Remove Module init Import Module F S
  • 自动递增 EC2 实例名称

    我在 Stackoverflow 上看到很多问题 询问是否有办法自动递增实例名称 例如 foo1 foo2 fooN 我想看看是否有办法在 Powershell 中执行此操作 我正在使用 AutoLaunchConfiguration AS
  • PowerShell 中的“nohup”相当于什么?

    如何模拟 unix 命令的行为nohup在 PowerShell 中 那是nohup my other nonblocking command 我注意到Start Job命令 但是语法对我来说有点不清楚 gt Start Job my ex
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • PowerShell 和 StringBuilder

    我是 PowerShell 新手 但熟悉 NET 类 我在用System Text StringBuilder在 PowerShell 脚本中 脚本是这样的 Function MyStringFunc String line r New O
  • Powershell SQL Server数据库连接和连接超时问题

    我有一个连接到 SQL Server 2012 数据库的 powershell 脚本 该脚本运行 SQL 查询并将结果集放入数据表中 以将格式化的电子邮件发送给相关方 下面是问题所在的代码片段 CBA New Object System D
  • Powershell tail 多个文件命令

    我可以通过以下命令尾随一个文件 Get Content Path C log1 txt Tail 10 Wait 如何将其扩展到多个文件 我尝试了以下方法但没有成功 Get Content Path C log1 txt C log2 tx
  • 如何使用 .NET 4 运行时运行 PowerShell?

    我正在更新管理一些 NET 程序集的 PowerShell 脚本 该脚本是为针对 NET 2 与 PowerShell 运行的框架版本相同 构建的程序集编写的 但现在需要使用 NET 4 程序集以及 NET 2 程序集 由于 NET 4 支
  • 如何在 powershell 中显示带有 .ps1xml 文件的嵌套集合

    我有一个像这样的分层对象结构 public class Department public string Name get set public string Manager get set public Employee Employee
  • launch.json 中不允许使用属性 env [VSCode]

    我所做的就是在 VS 中初始化一个模板 Azure Functions 项目 当我尝试通过设置运行配置环境变量时launch json VS直接警告我这是不 允许的 此外 即使当我尝试运行我的 ps1无论如何 对于 env 来说 它不起作用
  • 将变量传递给 Start-Job

    我必须在这里遗漏一些非常简单的东西 这是一个非常基本的脚本来说明我正在尝试的内容 Computers comp1 comp2 ScriptBlock New Item C Temp C txt Force Foreach C in Comp
  • Pester 没有捕获抛出的错误

    当我运行以下纠缠测试时 我希望它能够捕获预期的错误 但事实并非如此 但是 当我使用不同的函数和不同的 throw 语句运行测试时 它会起作用 纠缠测试 Describe Remove GenericCredential Function T
  • 在 Powershell 4 中压缩和解压缩文件

    我使用的是 Windows Server 2012 R2 64 位 我有 powershell 版本 4 可用 我正在尝试压缩和解压缩文件 当我尝试 Write Zip 命令时 它会抛出以下错误 Write Zip 术语 Write Zip

随机推荐

  • 如何从不同列条件下的 PySpark 数据帧中提取数组元素?

    我有以下内容PySpark 输入数据框 index valuelist 1 0 10 20 30 2 0 11 21 31 0 0 14 12 15 Where 索引 双精度型 值列表 类型Vector it s 非数组 从上面的输入数据框
  • 程序加载期间添加的菜单项的 Vcl 样式问题

    我有一个 Delphi 10 4 2 程序 32 位 其中在程序加载期间添加菜单项 Application OnActivate 事件 编码为仅运行一次 如果没有 vcl 样式 新项目将正确显示 但是当应用样式时 例如屏幕截图中非常漂亮的
  • 受约束的成员函数和显式模板实例化

    G 和 Clang 一致认为以下代码片段不是有效的 C template
  • 通过观察ViewModel在RecyclerView中搜索PagedList的LiveData

    使用 android Paging 库 可以很容易地从数据库中分块加载数据 并且 ViewModel 提供自动 UI 更新和数据保存 所有这些框架模块帮助我们在 Android 平台上创建一个出色的应用程序 典型的 Android 应用程序
  • php.ini 中的浮点数范围-0 是浮点数吗?

    当我转换字符串时 0 在 float 中 它返回 float 类型 0 example x 0 y float x 结果 gt 浮动 0 why 0是浮点数吗 IEEE 754 标准是几乎所有计算机语言实现浮点数的标准 它具有 0 and
  • Django管理命令中的动态一行输出

    我有一个 Django 管理命令 它执行大量处理 因此我让它以百分比形式输出进度 我想使用答案中描述的技术here https stackoverflow com questions 5290994 python remove and re
  • MariaDB 10 CentOS 7 移动数据目录的问题

    CentOS 7 和 MariaDB 10 的全新 最小 安装 我有一个额外安装的镜像卷 我想将其用于数据目录 当 my cnf mysqld 被注释掉时 启动顺序正常并正常完成 我已经复制了数据 sudo cp R p var lib m
  • Flutter Firestore 查询中可以使用通配符吗?

    我的目标是从路径 chat chattype room roomID message 流式传输数据库中的所有消息 在该路径中我需要查询文档中包含包含 user1 的字符串的所有消息 而无需查询明确指定房间 ID 似乎无法让它与通配符一起工作
  • 访问数据库的用户列表

    我有一个 MySQL 数据库 由我的一群队友访问 有没有命令可以获取当前正在访问或已经访问并注销的用户的日志信息 从 mysql 工具运行以下命令来查看所有当前正在运行的进程 包括睡眠连接 SHOW PROCESSLIST 或者 您可以查询
  • 使用 JComboBox Java Swing 选择颜色

    我有一个 JComboBox 我想让用户在其中选择颜色 JComboBox 仅显示颜色 没有任何文本 我已经想出了这个解决方案 请告诉我这是否好或应该避免以及为什么 我对 Swing 和 Java 总体来说是新手 所以请耐心等待 publi
  • .gitattributes 中的“* text=auto eol=lf”和“* text eol=lf”有什么区别?

    这与这个问题非常相似 gitattributes 中的 text auto 和 text eol lf 有什么区别 https stackoverflow com questions 46590142 what is the differr
  • 合并(使用挤压)来自另一个分支的所有更改作为单个提交

    在 Git 中 有没有一种方法可以将一个分支的所有更改合并到另一个分支 但同时压缩为单个提交 我经常在单独的分支中开发新功能 并定期提交 推送 主要用于备份或将我正在开发的内容转移到另一台机器上 大多数这些提交都会说 Feature xxx
  • 如何更改datagridview中的行颜色

    我想更改 datagridview 中特定行的颜色 当列单元格 7 的值小于列单元格 10 的值时 该行应更改为红色 关于如何实现此目的有什么建议吗 您需要循环遍历 datagridview 中的行 然后比较每行上第 7 列和第 10 列的
  • Angular2 可观察定时器条件

    我有一个计时器 initiateTimer if this timerSub this destroyTimer let timer TimerObservable create 0 1000 this timerSub timer sub
  • 如何解决 WPF 中的“绑定表达式路径错误”?

    我将模型对象的可观察集合绑定到数据网格 但是当我将绑定设置到集合时 我收到了指向人员的路径错误 在调试此问题时 我检查了 CustomerModel 中的公共属性在 DataGrid 绑定中是否正确命名 而且返回到模型的集合不为空 我还检查
  • 为什么使用window.onload

    我尝试自己找到这个问题的答案 但只找到了有关如何使用 onload 事件的说明 我似乎没有抓住要点 我被告知 如果我希望在页面加载时发生某些事情 我应该像这样使用 window onload 但现在我自己思考 我想知道这样做的意义是什么 因
  • 将 forMine 设置为 false 进行搜索时,youtube v3 api 错误

    我正在编写一些函数Youtube API version 3 我在用python但在谷歌提供的测试控制台中确认了我的错误 我正在提出所有授权请求 只是没有在下面粘贴我的密钥 Python 客户端库自动添加forMine参数给我的Search
  • 如何在不暂存的情况下 git 添加新文件?

    为了有效地 并按预期 使用 git 我进行了小的原子提交 而我确实有更长的会话 我所做的不仅仅是一件事 因此 我大量使用git add p 不过 这不适用于全新的文件 因为我以后往往会忘记它们 我想做的是告诉git那里is一个新文件 我希望
  • 我在哪里可以学习编写词法分析器的基础知识?

    我想学习如何编写词法分析器 我的大学课程有一项作业 我们必须编写一个解析器 以及与之配套的词法分析器 但这是给我们的 没有任何指导或反馈 超出了标准 所以我并没有真正从中学到很多东西 搜索这个主题后 我只能找到相当高级的文章 这些文章重点关
  • 如何通过 UNC 加速 Powershell Get-Childitem

    DIR or GCI在 Powershell 中很慢 但在 CMD 中很快 有什么办法可以加快这个速度吗 在 CMD exe 中 经过亚秒级延迟后 其响应速度与 CMD 窗口可以跟上的速度一样快 dir remote server doma