【问题标题】:Powershell command to fetch all file path for all desired files extensions用于获取所有所需文件扩展名的所有文件路径的 Powershell 命令
【发布时间】:2019-09-11 15:05:08
【问题描述】:

我想在 Windows 机器上使用 PowerShell 搜索所有驱动器以获取所有文件及其扩展名的列表 -

  1. 根据所需的扩展名,我们将其传入 - *.mp3
  2. 获取具有多个扩展名的所有文件,例如 - *.txt, *.mp3 等。

我尝试了下面的脚本,但它只提供了我们运行它的位置的信息。但我想扫描整台机器。

Get-ChildItem -Path .\ -Filter ***.doc** -Recurse -File| Sort-Object Length -Descending | ForEach-Object { $_.BaseName }

【问题讨论】:

  • 查看如何获取本地驱动器号。一旦你有了它,你就可以遍历结果列表。 [grin] 像 powershell list drive letters 这样的东西会让你开始。
  • 欢迎成为 SO 的新用户。请使用tour 并阅读How to Ask。在不知道文件位置的情况下,BaseName 按文件长度值排序的输出是什么?
  • 如果您要麻烦列出所有文件,我建议您也获取文件哈希,以便确定是否有重复文件。一个简单的文件名搜索不会检测到同一个文件是否以不同的名称保存。

标签: windows powershell directory subdirectory


【解决方案1】:

这比最初的问题要多,但是如果您要麻烦列出所有文件,我建议您也获取文件哈希,以便确定是否有重复文件。简单的文件名搜索将不会检测相同的文件是否以不同的名称保存。添加到 @lit (https://stackoverflow.com/users/447901/lit) 发布的内容:

$ExtensionList = @('.txt', '.doc', '.docx', '.mp3')
Get-PSDrive -PSProvider FileSystem |
    ForEach-Object  {
        Get-ChildItem -Path $_.Root -Recurse -ErrorAction SilentlyContinue |
            Where-Object { $ExtensionList -eq $_.Extension } |
            ## ForEach-Object { $_.Name, $_.FullName, $_.GetHashCode() }
            Select-Object @{Name="Name";Expression={$_.Name}}, @{Name="Hash";Expression={$_.GetHashCode()}}, @{Name="FullName";Expression={$_.FullName}} | 
            Export-Csv -Path C:\Temp\testing.csv -NoTypeInformation -Append
    }

添加文件哈希可以让您查看是否有重复项,而全名可以让您查看它们的位置。

【讨论】:

  • 谢谢,您的脚本显示了更多相关信息,但请您帮我输入诸如 - 文件名 |文件路径 |文件哈希并将其转换为文本文件输出,以便在 excel 中轻松操作
  • 我编辑了上面的代码,它将在 C:\Temp 中创建一个 CSV,以便您可以在 Excel 中打开它。上面的两个答案都回答了您最初的问题,因此请务必用绿色复选标记其中一个!
  • 感谢它工作得很好,但是在新脚本中我猜你已经删除了放置所需扩展的功能,如果我想更改并添加扩展,我可以放置它们。
  • 对不起,我错过了复制/粘贴中的第一行,答案已在上面进行了编辑。我仍然没有看到上述任何一个答案的绿色复选标记,我只添加到@lit 答案。
  • 我通过删除 .txt 运行了您的脚本,但即使删除后我仍然得到 .txt 文件的结果,为什么会这样? $ExtensionList = @('.doc', '.docx', '.mp3') 如果我在该列表中添加更多所需的扩展名怎么办?
【解决方案2】:

Get-ChildItem 上使用-Include 将允许您指定扩展列表。 -ErrorAction 将导致它跳过不可用的驱动器,例如未安装的 CD 驱动器。

Get-PSDrive -PSProvider FileSystem |
    ForEach-Object  {
        Get-ChildItem -Path $_.Root -Recurse -Include '*.doc*', '*.txt' -ErrorAction SilentlyContinue |
            ForEach-Object { $_.Name }
    } |
        ForEach-Object {[PSCustomObject]@{HashCode = $_.GetHashCode(); FullName = $_.FullName}}
} |
Export-Csv -Path $TempFile -NoTypeInformation -Encoding ASCII

更新:

这是一个更好的方法。它将防止未知的扩展加入,例如“Microsoft.NET.Sdk.Publish.Docker.targets”。

$ExtensionList = @('.txt', '.doc', '.docx', '.mp3')
$TempFile = Join-Path -path $Env:TEMP -ChildPath "$($pid.ToString()).tmp"

Get-PSDrive -PSProvider FileSystem |
    ForEach-Object  {
        Get-ChildItem -Path $_.Root -Recurse -ErrorAction SilentlyContinue |
            Where-Object { $ExtensionList -contains $_.Extension } |
        ForEach-Object {
            [PSCustomObject]@{
                HashCode = $_.GetHashCode();
                DirectoryName = $_.DirectoryName
                Name = $_.Name
            }
        }
    } |
    Export-Csv -Path $TempFile -Delimiter ';' -NoTypeInformation -Encoding ASCII
Write-Host "The temp file is $TempFile"

【讨论】:

  • 它工作得很好但是连同文件和他们的扩展名,我也想得到他们的完整路径,我们可以添加一些“|”要么 ”;”在文件名和它们的路径之间,以便它也可以分为 excel 以获得更好的可见性并将输出放在单个 txt 文件中。
  • @Vijaykhurava - 答案已被编辑为分别发出目录名和文件名。使用Join-Path 将它们重新组合在一起。使用Export-Csv 上的-Delimiter 参数指定所需的字段分隔符。
  • 谢谢,但真的很抱歉,我不擅长使用 powershell :-) 当我按原样运行脚本时,它不会在 temp 或 export-csv 搜索整台计算机下生成任何输出,但是当我在删除 $temp 文件和 export-csv 的最后一行,它生成输出但输出不除以 ;或 |签名。
  • @Vijaykhurava - 我之前提到过使用-Delimiter 参数。临时文件的名称在最后写入控制台。您可以使用 PowerShell。
  • 非常感谢@lit,我尝试将两者都标记为已解决,但我想只允许一个,但非常感谢您在这里帮助我的及时和支持方式:-)
【解决方案3】:

签出Get-PSDrive cmdlet。它返回一个驱动器列表,您可以使用-PSProvider FileSystem 参数仅指定磁盘驱动器:

foreach ( $drive in $(Get-PSDrive -PSProvider FileSystem) ) {
Get-ChildItem -Path $drive.Root -Filter ***.doc** -Recurse -File |
Sort-Object Length -Descending | 
ForEach-Object { $_.BaseName }
}

没有测试,但你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多