【问题标题】:Get-ChildItem Recursive Search on Specific Child PathGet-ChildItem 在特定子路径上的递归搜索
【发布时间】:2017-07-10 21:52:43
【问题描述】:

我确定这个问题已经被问及并得到了回答,或者答案正盯着我的脸,但我不确定我是否正确地询问它以找到我正在寻找的答案。

我正在寻找使用 PowerShell 搜索用户目录以从 ini 文件中提取特定行(从旧管理员的不良记录中清除)。

我想要做些什么来减少搜索时间(需要运行很多目录)以及我想根据我正在寻找的生产和测试 ini 文件拆分我的结果集。

文件夹结构如下所示:

对于生产:

E:\Users\<username>\DIR\production.ini  

测试:

E:\Users\<username>\DIR\Test\test.ini  

所以我想运行这样的东西(在 E: 的根目录下):

Get-ChildItem -Recurse -Path ".\DIR\*.ini" | Select-String "DeviceName="
Get-ChildItem -Recurse -Path ".\DIR\Test\*.ini" | Select-String "DeviceName="

这样,它会在每个用户的文件夹中查找确切路径,而不是遍历所有子文件夹。我需要对 ini 进行通配符,因为有 2 - 3 个可能的文件取决于它们正在运行的应用程序的版本。

一如既往地感谢您的帮助。

【问题讨论】:

  • 如果您使用的是 PowerShell 版本 5 或更高版本,您可能需要考虑使用 ConvertFrom-StringData,这是为此类事情添加的新 cmdlet。
  • 您的要求并不完全清楚。如果您不想递归,就不要使用-recurse 开关?
  • 我认为您正在搜索类似Get-ChildItem E:\Users\*\*.ini

标签: powershell


【解决方案1】:

正确的格式使问题清晰易读,不隐藏 &lt;UserName&gt; 等。

根据您的 PoSh 版本,使用 -Directory|where $_.PSIsContainer 首先迭代 userFolders,然后直接检查两个可能的文件夹。

Get-ChildItem -Path E:\Users -Directory | ForEach-Object {
  Get-ChildItem -Path "$($_.FullName)\Dir"      -Filter *.ini -EA 0 |Select-String "DeviceName="
  Get-ChildItem -Path "$($_.FullName)\Dir\Test" -Filter *.ini -EA 0 |Select-String "DeviceName="
}

为了抑制错误,我包含了缩写。 -EA 0-ErrorAction SilentlyContinue

【讨论】:

  • 谢谢,这让我到达了我需要的地方。对于我关于 的问题不清楚,我深表歉意。我的意思是指出这是每个用户用户名的占位符,需要迭代。我的想法是我不想仅通过 E:\User 文件夹的根目录来递归整个用户目录。非常感谢。
【解决方案2】:

如果您知道项目名称和路径,我建议您使用 Get-Item 代替 GCI

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2010-12-31
    相关资源
    最近更新 更多