Powershell — Найти все расширения в общих сетевых ресурсах

#powershell #file-extension #shared-directory

#powershell #расширение файла #общий каталог

Вопрос:

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

Я думаю, что я на правильном пути с этим :

 get-childitem -Path C:test -Recurse | select extension -unique > $PSScriptRootExtensionList.txt
  

Это делает именно то, что я хочу для заданного пути и всех вложенных папок, но теперь мне нужно применить это ко всем общим папкам на компьютере.

Я смог указать весь путь к общей папке с помощью этой команды :

 $Shares=   @(Get-WmiObject Win32_Share | 
                    Select Name,Path,Type | 
                    Where-Object { $_.Type -match '0|2147483648' } | 
                    Select -ExpandProperty Path | 
                    Select -Unique)
Write-Host $Shares
  

Теперь я застрял, я полагаю, мне нужно использовать команду foreach, но я не могу найти способ заставить ее работать.

Кто-нибудь может помочь мне собрать это воедино?

Спасибо,

Ответ №1:

Вы можете попробовать Get-SMBShare командлет:

 Get-SMBShare | Foreach {
  Get-ChildItem "\$($_.name)" | Select-Object Extension -Unique
}
  

Ответ №2:

Вероятно, вы ищете что-то похожее на это:

 $Shares = @( Get-CimInstance Win32_Share | Where-Object { $_.Type -match '0|2147483648' } | Select -Unique )
ForEach ( $Share In $Shares ) { Get-ChildItem -Path $Share.Path -File -Recurse -ErrorAction Ignore | Select -Unique -ExpandProperty Extension }
  

Я оставлю вас разбивать строки в соответствии с вашим конкретным стилем и выводить в файл (я бы посоветовал вам использовать для этого Out-File вместо > ).

Ответ №3:

Спасибо вам, ребята, за вашу помощь! Я смог с этим разобраться.

Следующий скрипт соберет все расширения в общих папках, отсортирует их, удалит дубликаты и пустые строки, добавит «*» перед расширением и создаст файл list.txt с результатом.

 #get shares
$Shares = @( Get-CimInstance Win32_Share | 
Where-Object { $_.Type -match '0|2147483648' } | 
Select -Unique )

#list all extensions
ForEach ( $Share In $Shares ) { Get-ChildItem -Path $Share.Path -File -Recurse -ErrorAction Ignore | Select -Unique -ExpandProperty Extension | out-file C:extensionsList1.txt -append }

#remove empty lines
@(gc C:extensionsList1.txt) -match 'S'  | out-file C:extensionsList2.txt

#Add * before extention type
gc C:extensionsList2.txt | %{"*$_"} | out-file C:extensionsList3.txt

#Sort by name
gc C:extensionsList3.txt | sort | get-unique > C:extensionsList4.txt

#Remove duplicates
$hash = @{}      
gc C:extensionsList4.txt | 
%{if($hash.$_ -eq $null) { $_ }; $hash.$_ = 1} > C:extensionsList.txt

#Delete list1-4
Remove-Item C:extensionsList1.txt, C:extensionsList2.txt, C:extensionsList3.txt, C:extensionsList4.txt