Страница 1 из 1

Создание/восстановление временного бэкапа в текущей папке

Добавлено: Чт окт 16, 2014 16:13
helb
Давно завел практику по-быстрому создавать временные копии (или переименовывать) файлов и папок добавляя расширение “.t”. Примерно таким образом: Shift+F5(F6) → End → .t → Enter и назад Shift+F5(F6) → End → Backspace×2 → Enter. Маска “*.t?” у меня подсвечена сиреневым, так что такие копии сразу заметны.

Надоело аж целых шесть нажатий по всей клавиатуре делать, сделал скрипт и повесил на F12 и Ctrl+F12 :)
Добавляет к имени каждого выделенного объекта указанный в начале скрипта суффикс (.t) или совершает обратное действие, если он уже есть. По умолчанию будет копировать, с опцией /r — переименовывать, опция /f для перезаписи без запроса.
Использование: [/r] [/f] <файл-список в UTF-16 (%WL)>
toggle-backup.vbs:

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

'==========================================================
' Toggle backup (by helb)
'Добавляет к имени каждого выделенного объекта указанный в начале скрипта суффикс (.t) или совершает обратное действие, если он уже есть.
'По умолчанию будет копировать, с опцией /r — переименовывать, опция /f для перезаписи без запроса.
'Использование: [/r] [/f] <файл-список в UTF-16 (%WL)>
'==========================================================
Option Explicit
dim ext : ext = ".t" 'edit this variable for your own suffix
dim FSO, fobj, name, list, F, confirmed, rename
set FSO = CreateObject("Scripting.FileSystemObject")

if WScript.Arguments.length = 0 then
	WScript.Echo("No parameters specified")
	WScript.Quit
end if
for each F in WScript.Arguments
	if F = "/r" then
		rename = true
	elseif F = "/f" then
		confirmed = vbYes
	elseif FSO.FileExists(F) then
		List = F
	end if
next

for each F in Split(FSO.OpenTextFile(List, 1, false, -1).ReadAll, vbNewLine)
	if F <> "" then
		set fobj = getObj(F)
		if not fobj is nothing then
			name = getNewName(fobj.Path)
			if objExists(name) > 0 and confirmed = Empty then
				confirmed = MsgBox("Name conflict. Overwrite all? (“No” to skip all)", vbExclamation + vbYesNoCancel, "Confirm")
				if confirmed = vbCancel then exit for
			end if
			if objExists(name) > 0 and confirmed = vbYes or objExists(name) = 0 then
				if rename then
					if objExists(name) > 0 then getObj(name).Delete
					fobj.Move(name)
				else
					fobj.Copy(name)
				end if
			end if
		end if
	end if
next


function getObj(fl)
	if FSO.FileExists(fl) then
		set getObj = FSO.GetFile(fl)
	elseif FSO.FolderExists(fl) then
		set getObj = FSO.GetFolder(fl)
	else
		set getObj = nothing
	end if
end function

'0=not exists, 1=is file, 2=is folder
function objExists(name)
	if FSO.FileExists(name) then 
		objExists = 1
	elseif FSO.FolderExists(name) then
		objExists = 2
	else
		objExists = 0
	end if
end function

function getNewName(name)
	if Right(name, Len(ext)) = ext then getNewName = Left(name, Len(name) - Len(ext)) else getNewName = name & ext
end function

Добавлено: Чт окт 16, 2014 16:19
Avada
helb
Тут уже в своё время намекали (и я с этим совершенно согласен), что при выкладывании скриптов в общий доступ пояснения в шапке лучше давать по-русски.

Добавлено: Чт окт 16, 2014 16:43
helb
Ок. Могу вообще ее не копировать из оригинального файла — скриптов вообще без шапки и пояснений внутри на форуме полно :)

Добавлено: Чт окт 16, 2014 17:21
Flasher
Не полно, но есть, где это не является ключевым моментом, где, например, нет параметров. Как правило, это маленькие скрипты. Во всех остальных случаях мы придерживаемся условий и рекомендаций из памятки подфорума.

Добавлено: Вт ноя 11, 2014 14:22
helb
То же на powershell, только вдобавок сохраняет даты модификации у папок при копировании.
Запускать командой вида “powershell <имя.ps1> <параметры>”. PS должен быть установлен (актуально только для Win XP), и должно быть разрешено выполнение скриптов (единовременная команда “Set-ExecutionPolicy RemoteSigned” в среде PS)

toggle-backup.ps1:

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

<#	Toggle backup (by helb)
	If entry in the list has no ‘ext’ suffix(extension) copy adding it
	if entry already ends on ‘ext’ copy removing it
	e.g. file.txt > file.txt.t
	
	Parameters: /r /f listfile
	/r - rename instead of copy, /f - force overwrite (both optional), listfile - UTF-8 encoded
	Total Commander list parameter: %UL

	Добавляет к имени каждого выделенного объекта указанный в начале скрипта суффикс (.t) или совершает обратное действие, если он уже есть. 
	По умолчанию будет копировать, с опцией /r — переименовывать, опция /f для перезаписи без запроса. 
	Использование: [/r] [/f] <файл-список в UTF-8 (%UL)>
#>
$ext = ".t"
[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 ($a in $args) {
	if ($a -eq "/r") { $rename = $true }
	elseif ($a -eq "/f") { $confirmed = "Yes" }
	else { $list = [environment]::ExpandEnvironmentVariables($a) }
}

if (!(test-path -literalPath $list)) { msgBx "List file not found." "Warning"; return }
else {
	$filelist = get-content $list
	foreach ($name in $filelist) {
		if ($name.substring($name.length-1, 1) -eq "\") { $name = $name.substring(0, $name.length-1) }
		if (test-path -literalPath $name) {
			if ($name.substring($name.length-$ext.length, $ext.length) -eq $ext) {
				$newname = $name.substring(0, $name.length-$ext.length)
			}
			else { $newname = $name + $ext }

			if ((test-path -literalPath $newname) -and !($confirmed)) {
				$confirmed = msgBx "Name conflict. Overwrite all? (‘No’ to skip all)" "Confirm" YesNoCancel
				if ($confirmed -eq "Cancel") { break }
			}
			if ((test-path -literalPath $newname) -and $confirmed -eq "Yes" -or !(test-path -literalPath $newname)) {
				if (test-path -literalPath $newname) { remove-item $newname -recurse }
				if ($rename) {
					move-item -literalPath $name -destination $newname
				}
				else {
					$newfiles = copy-item -literalPath $name -destination $newname -passThru -recurse
					if ($newfiles) {
						$newfiles | where { $_.PSIsContainer } | foreach {
							$fname = $_.FullName.replace($newname, $name)
							$_.LastWriteTime = (get-item -literalPath $fname -force).LastWriteTime
						}
					}
				}
			}
		}
	}
}