Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата nugzari:
Мне нужна ваша помощь. Решил добавить в контекстное меню папки команду Streams для отображения и удаления Zone.Identifier (Альтернативные потоки NTFS). Вручную не очень удобно к тому же он у тех файлов которых я скопировал с HDD друга(у меня отключено Zone.Identifier) »
Самый простой способ, создать раздел FAT32 и использовать его как буфер... никаких альтпотоков не останется.
Если, всё же, нет желания удалять ADS, то можно вместо сторонних программ, воспользоваться встроенным powershell+cmd:
Скрипт для получения ADS имен файлов и каталогов
Код: Выделить весь код
<#
	.SYNOPSIS 
		Отображение альтернативных потоков файлов и каталогов

	.Description
		Скрипт предназначен для получения имен альтернативных потоков файлов и каталогов.
		Присваиваются отдельные идентификаторы для элементов и их альт. потоков,
		а также размер.

	.Parameter Elements
		Обязательный: Необходимо указать путь к каталогу, либо к отдельному файлу.
		Указанный каталог в выборку не включается, содержимым будут подкаталоги и файлы, 
		находящиеся в этом каталоге. При рекурсии это поведение не изменится.

	.Parameter Root
		Переключатель: Используется для дополнительного включения в выборку 
		указанного(ых), корневого(ых) каталога(ов)
	
	.Parameter Attributes
		Необязательный: Получает файлы и папки с указанными атрибутами. Этот параметр
		поддерживает все атрибуты и позволяет указывать сложные комбинации атрибутов.
		Соответствует параметру Attributes командлета Get-Childitem.

	.Parameter Hidden
		Переключатель: Для выбора файлов или каталогов с атрибутом Hidden

	.Parameter ReadOnly
		Переключатель: Для выбора файлов или каталогов с атрибутом ReadOnly

	.Parameter System
		Переключатель: Для выбора файлов или каталогов с атрибутом System

	.Parameter Force
		Переключатель: Для выбора всех файлов или каталогов с любым атрибутом

	.Parameter Recurse
		Переключатель: Для рекурсивного выбора файлов или каталогов

	.Example
		.\script.ps1 'd:\TEST' -force -rec|ogv

		Это пример рекурсивной выборки всех файлов и каталогов, с любым атрибутом,
		из корневого каталога d:\TEST и вывода результата в таблицу out-gridview

	.Example
		.\script.ps1 . -attr D+H,S -rec|ft

		Это пример рекурсивной выборки только каталогов с атрибутом Hidden или же
		выборки файлов и каталогов с атрибутом System из корневого каталога d:\TEST
		и вывода результата в таблицу out-gridview
		
	.Notes
		Created By YuS

		Version: 1.00
		Date: 11/03/2019
		Purpose/Change:	Первая версия
		Version: 1.01
		Date: 11/03/2019
		Purpose/Change:	Добавлен параметр -Root
		Version: 1.02
		Date: 14/03/2019
		Purpose/Change:	Добавлен параметр -Attributes для более гибкого отбора

	.Link
		<здесь была ссылка на форум, где скрипт опубликован ранее>
		
  #>

[CmdletBinding()] Param (
	[parameter(Mandatory=$true)]
	[string[]]$elements,[switch]$hidden,[switch]$readonly,$attributes,
	[switch]$system,[switch]$force,[switch]$recurse,[switch]$root
)

function testpth {[CmdletBinding()] Param (
		[parameter(Mandatory=$true)]
		[string[]]$elem,$attr,[switch]$hid,[switch]$read,
		[switch]$sys,[switch]$for,[switch]$rec
	)
	$dpar = @{};$dpar.literalpath = $elem;if ($attr){$dpar.attributes = $attr}
	if ($hid){$dpar.hidden = $true};if ($read){$dpar.readonly = $true}
	if ($for){$dpar.force = $true};if ($rec){$dpar.recurse = $true}
	if ($sys){$dpar.system = $true}
	
	if(test-path $elem -pathtype container){
		if($root){gi -lit $elem -force}
		dir @dpar
	} elseif (test-path $elem -pathtype leaf){
		gi -lit $elem -force
	} else {
		write-host Path no correct -for red
		sleep -s 5
		break
	}
}

function testitem($x){
	if(test-path $x.fullname -patht container){
		$fld = $x.fullname
		((cmd /c "dir /ad/r ""$fld""").trim()|
		sls -patt '\d+ +\.:[^:]+:\$data').line|%{if(($a = $_ -split ':')[-2]){
				new-object psobject -prop @{
					Stream = $a[-2]; Length = [int]$($a[0] `
					-replace '^(\d+)*?(\d*)[^\n]*','$1$2')
				}
			}
		}
	} elseif (test-path $x.fullname -patht leaf){
		gi -lit $x.fullname -stream *|? stream -ne ':$data'
	}
}

function get-namestream ($item){
	[array]$arr = testitem $item
	for ($i=0;$i -lt $arr.count;$i++){
		[pscustomobject]@{
			'IDItem' = $script:k
			'IDStream' = $i
			'NameStream' = $arr[$i].stream
			'Size' = $arr[$i].length
			'Container' = if ($item.psiscontainer){$true}else{$false}
			'Path' = $item.fullname
		}
	};if ($arr){$script:k++}
}
$k=0
$tpar=@{}; $tpar.elem = $elements;if($attributes){$tpar.attr = $attributes}
if ($hidden){$tpar.hid = $hidden};if ($readonly){$tpar.read = $readonly}
if ($force){$tpar.for = $force};if ($recurse){$tpar.rec = $recurse}
if ($system){$tpar.sys = $system}

$p = testpth @tpar|%{get-namestream $_} |group -prop iditem -ashash -asstr
0..($p.count)|%{$p."$_"}

В итоге, получим примерно такую картинку:
картинка

Использовать можно как для просмотра, так и для удаления...

ЗЫ Сразу отвечу на вопрос, который, вероятно, возникнет: "зачем +cmd?" Затем, что, увы, powershell не выводит альтернативные потоки каталогов...

-------
scio me nihil scire. Ѫ


Отправлено: 13:28, 14-08-2019 | #3