Копирование/вставка (Copy & Paste) атрибутов/времен файлов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
helb
Сообщения: 57
Зарегистрирован: Ср окт 08, 2014 21:46

Копирование/вставка (Copy & Paste) атрибутов/времен файлов

Сообщение helb »

Скрипт для копирования и вставки атрибутов файлов. Вешается на два хоткея (например Ctrl+Shift+D - Copy, Ctrl+Shift+F - Paste — по-близости от Ctrl+C/Ctrl+V). При копировании сохраняет только атрибуты (включая время) без имен файлов в файл в TEMP, которые впоследствии можно восстановить, и не обязательно на оригинальный(ые) файл(ы). Paste — при несоответствии числа выделенных файлов числу сохраненных предложит восстановить либо атрибуты одного файла на все выделенные, либо начальных из списка на все выделенные, если вторых меньше.

Запускать командой вида “powershell <имя.ps1> <параметры>”. PS должен быть установлен (актуально только для Win XP), и должно быть разрешено выполнение скриптов (единовременная команда “Set-ExecutionPolicy RemoteSigned” в среде PS)

copy-paste-attributes.ps1

Код: Выделить всё

<#	Copy-paste attributes [by helb] v2015-12-07
	Сохраняет атрибуты указанных файлов и папок (без соответствия имен) в CSV-файл (copy) или устанавливает из него (paste).
	Использование: “<list file (UTF-8)> [/r] [/p]” (p=вставить, r=рекурсивно)
	Saves attributes of listed files and folders (without name relation) to a CSV file (copy) or sets from previously saved ones (paste).
	Usage: “<list file (UTF-8)> [/r] [/p]” (p=paste, r=recursively)
	Total Commander list parameter: %UL
#>
$attributeFile = "%TEMP%\attributes-11e0d9f8-3a10-48be-a9f0-4e8984a2a7ca.tmp"
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

function msgBx($text, $title, $btns = 0) {
	return [System.Windows.Forms.MessageBox]::Show($text, $title, $btns)
}

if ($args.length -lt 1) { msgBx "No parameters." "Error"; return }
foreach ($arg in $args) {
	if ($arg -eq "/p") {$restore = $true}
	elseif ($arg -eq "/r") {$recurse = $true}
	else {$list = [environment]::ExpandEnvironmentVariables($arg)}
}

if (!(test-path -literalPath $list)) { msgBx "List file not found." "Warning"; return }
else {
	$attributeFile = [environment]::ExpandEnvironmentVariables($attributeFile)
	$files = @()
	[array]$filelist = get-content $list
	foreach ($name in $filelist) {
		if (test-path -literalPath $name) {
			$files += get-item -literalPath $name -force
			if ($recurse) {
				$tmpfiles = get-childItem -literalPath $name -recurse -force #| sort-object FullName
				if (!($tmpfiles.FullName -and $tmpfiles.FullName -eq $name)) {$files += $tmpfiles}
			}
		}
	}
	if ($restore){
		if (!(test-path -literalPath $attributeFile)) { msgBx "No attribute file." "Error"; return }
		[array]$attributes = import-csv $attributeFile -delimiter "`t"
		$i = 0
		if ($files.length -le $attributes.length) {
			if ($files.length -lt $attributes.length){
				$re = msgBx "Number of listed files is lower than stored attributes. Proceed anyway?" "Warning" 4
				if ($re -ne "Yes") {
					return
				}
			}
			foreach ($file in $files) {
				if (test-path -literalPath $file.FullName) {
					$file.IsReadOnly = $false
					$file.CreationTime = $attributes[$i].CreationTime
					$file.LastWriteTime = $attributes[$i].LastWriteTime
					$file.LastAccessTime = $attributes[$i].LastAccessTime
					$file.Attributes = $attributes[$i].Attributes
				}
				$i++
			}
		}
		else {
			$re = msgBx "Number of listed files is greater than stored attributes. Paste first entry to everything?" "Warning" 4
			if ($re -eq "Yes") {
				foreach ($file in $files) {
					if (test-path -literalPath $file.FullName) {
						$file.IsReadOnly = $false
						$file.CreationTime = $attributes[0].CreationTime
						$file.LastWriteTime = $attributes[0].LastWriteTime
						$file.LastAccessTime = $attributes[0].LastAccessTime
						$file.Attributes = $attributes[0].Attributes
					}
				}
			}
		}
	}
	else {
		$files | select FullName, CreationTime, LastWriteTime, LastAccessTime, Attributes | export-csv $attributeFile -force -delimiter "`t" -encoding "UTF8"
	}
}
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Куда проще (и в чем-то безопаснее) не трогать политику, а просто добавлять аргумент -ExecutionPolicy Bypass при запуске PowerShell. Кстати, аргумент -NoProfile тоже лишним не будет.
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

Непонятно... Есть задача скопировать файл и папки на флешку с теми же атрибутами (время, дата, ...), с каким они были на жёстком диске. Этот скрипт подойдёт или это можно сделать по другому (быстрее и безопаснее)?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

KatMuse
Тут речь про копирование атрибутов, а не файлов/папок.

[cut="OFF"]Если папка флешки открыта в др. панели, то в этой кнопке добавляем красное в последний параметр: "%T%%~~nx#"
Фраза без последнего расширения в именах меняется на в другой панели.
Правда, это будет касаться только файлов.
А чем функционал ТС не устраивает? Атрибуты сохраняются, как переносить даты тоже известно.
Плагин CopyTree умеет всё то же самое.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

Правильно я понимаю, что это решение проблемы с помощью CopyTree?
Изображение
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

[cut="2KatMuse"]Я же в спойлере дал ссылку "известно" по обсуждаемой задаче. Это всё ТС и так делает. Опции для временных меток диалога плагина на виду. При необходимости сохранять структуру - да, это альтернативное решение.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
KatMuse
Сообщения: 82
Зарегистрирован: Сб июл 26, 2014 15:39

Сообщение KatMuse »

Не нашёл встроенную опцию :(
Изображение
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

KatMuse
Встроенная опция — не обязательно диалоговая, это и синоним для ключа. Ссылка на тему с упоминанием CopyAllTimes и пр. для чего давалась? (А скрин демонстрирует разве что неумение/нежелание настроить оптимальный шрифт для диалогов TC и их размер.)
Даже самая богатая фантазия
Не представит себе наши безобразия.
Ответить