helb
|
Posted: Tue Nov 11, 2014 15:22 Post subject: |
|
|
То же на powershell, только вдобавок сохраняет даты модификации у папок при копировании.
Запускать командой вида “powershell <имя.ps1> <параметры>”. PS должен быть установлен (актуально только для Win XP), и должно быть разрешено выполнение скриптов (единовременная команда “Set-ExecutionPolicy RemoteSigned” в среде PS)
toggle-backup.ps1:
Code: | <# 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
}
}
}
}
}
}
}
|
|
|