Команда Powershell для извлечения всех путей к файлам для всех желаемых расширений файлов - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу найти все диски с помощью PowerShell на компьютере с Windows, чтобы получить список всех файлов вместе с их расширениями -

  1. На основании желаемого расширения мы передаем его как - *.mp3 или
  2. Получить все файлы с несколькими расширениями, такими как - *.txt, *.mp3 и т. Д.

Я попробовал приведенный ниже скрипт, но он дает только информацию, откуда мы его запускаем. Но я хочу сканировать всю машину.

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

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Использование -Include на Get-ChildItem позволит вам указать список расширений.-ErrorAction приведет к пропуску дисководов, которые недоступны, таких как отключенный дисковод компакт-дисков.

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"
1 голос
/ 22 апреля 2019

Оформить заказ на командлет Get-PSDrive.Он возвращает список дисков, и вы можете указать только диски с параметром -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 }
}

Не проверял, но вы поняли.

0 голосов
/ 22 апреля 2019

Это больше, чем первоначальный вопрос, но если вы собираетесь решить проблему с перечислением всех ваших файлов, я предлагаю также получить хэш, чтобы вы могли определить, есть ли у вас дубликаты. Простой поиск по имени файла не обнаружит, если тот же файл был сохранен с другим именем. Добавление к тому, что @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
    }

Добавление хэша файла позволит вам увидеть, есть ли у вас дубликаты, а полное имя позволит вам увидеть, где они находятся.

...