View previous topic :: View next topic |
Author |
Message |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Sun Sep 08, 2013 15:47 Post subject: Замена имен выделенных файлов копией имени исходного файла |
|
|
Можно ли сделать скрипт, чтобы скопировать имя исходного файла и заменить им имя целевого файла (или имена нескольких выделенных файлов) в пассивной панели.
В идеале, хотелось бы два варианта: один с заменой только имени, но не расширения, а второй вариант с заменой имени+расширения (естественно, во втором случае целевой файл может быть только один, так как в противном случае первый переименованный будет затёрт последующими).
И, разумеется, хотелось бы исключить возможность случайного перезаписывания файлов с одинаковыми выходными именами.
Спасибо! |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Sep 08, 2013 19:49 Post subject: |
|
|
Я правильно понял, что базовое имя присваивать нескольким файлам, а цельное только одному?
Если да, то что делать в случае выбора файлов с одинаковым расширением? Счётчик? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Sun Sep 08, 2013 20:04 Post subject: |
|
|
Flasher wrote: |
Если да, то что делать в случае выбора файлов с одинаковым расширением? Счётчик? |
Теоретически предполагается, что юзер не будет выбирать в качестве целевых файлов для этой операции несколько файлов с одинаковым расширением. Но по ошибке может, конечно, выбрать
Тогда либо действительно счётчик, либо просто пропускать их, выдавая соответствующее сообщение об ошибке. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Sep 08, 2013 20:25 Post subject: |
|
|
oshizelly wrote: | выдавая соответствующее сообщение об ошибке | Зачем?
Да, забыл сказать, что активной панелью, как и в случае с атрибутами, будет панель с выбранным списком. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Sun Sep 08, 2013 21:08 Post subject: |
|
|
Flasher
Ну, чтобы привлечь внимание юзера к тому факту, что при выполнении операции возникли конфликты и поэтому на выходе может быть не совсем то (или совсем не то), что ожидалось.
В идеале такое сообщение должны выдаваться после применения счётчика, чтобы после завершения операции юзер при необходимости внес исправления вручную.
Flasher wrote: | активной панелью, как и в случае с атрибутами, будет панель с выбранным списком. |
По этому поводу я уже высказывал своё имхо http://forum.wincmd.ru/viewpost.php?p=95372 в теме про присвоение атрибутов. Но раз по-другому не получается... |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Sep 08, 2013 21:23 Post subject: |
|
|
oshizelly wrote: | и поэтому на выходе может быть не совсем то (или совсем не то), что ожидалось | Юзер и так должен осознавать принцип работы исходя из подсказки. Сообщения несколько тревожат психику. Пропуск при совпадении хуже погоду не сделает.
oshizelly wrote: | Но раз по-другому не получается. | Я там писал, как можно. Но это не оптимальный вариант. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Sun Sep 08, 2013 22:12 Post subject: |
|
|
Flasher
Flasher wrote: | Юзер и так должен осознавать принцип работы исходя из подсказки. Сообщения несколько тревожат психику. Пропуск при совпадении хуже погоду не сделает. |
Юзер-то сознаёт принцип. Я ведь написал выше:
"Теоретически предполагается, что юзер не будет выбирать в качестве целевых файлов для этой операции несколько файлов с одинаковым расширением. Но по ошибке может, конечно, выбрать"
Поэтому пусть лучше сообщения о конфликте тревожат неустойчивую психику бедного юзера, чем он пребывает в заблуждении, что всё получилось, как он рассчитывал. А потом он спохватится, что некоторые файлы так и не были переименованы, но будет уже поздно.
Flasher wrote: | Я там писал, как можно. |
Да, писал http://forum.wincmd.ru/viewpost.php?p=95373, но только для одного файла. А для нескольких альтернативного решения так и не нашлось, если не считать непонятной для меня ссылки на Helper.
Собственно, это могли бы быть два разных скрипта с немного различными кодом: одна версия для единичного целевого файла (в пассивной панели), а вторая - для нескольких выделенных (в активной панели). |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Sep 09, 2013 00:10 Post subject: |
|
|
oshizelly wrote: | чем он пребывает в заблуждении, что всё получилось, как он рассчитывал | Суть автоматизации в том, чтобы юзер вообще об этом не думал. Если есть совпавшие элементы, которые были пропущены, то и мыслить об этом не имеет смысла, так как всё и так будет на своих местах.
oshizelly wrote: | если не считать непонятной для меня ссылки на Helper | Это пока единственное, чем я могу реализовать подобный алгоритм.
Сообщения не трогаю. Предлагаю пока потестить, что есть:
Code: | '======================================================================================
' Присвоение имени элемента из пассивной панели выбранным элементам в активной
' Условие: путь запуска пустой
' Параметры: 1) %WL; 2) "%T"; 3) "%M"; 4) <полное/базовое имя: 0/1>;
' 5) <при совпадении пропускать/добавлять № счётчика: 0/1>
' Пример: %WL "%T" "%M" 0 1
'======================================================================================
With WScript.Arguments
If .Count = 0 Then WScript.Quit
List = .Item(0) : T = .Item(1) : Name = .Item(2) : OBN = .Item(3) : Add = .Item(4)
End With : Const M = 0
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, vbNewLine)
If F <> "" Then
NN = Name
If FSO.FileExists(F) Then
If OBN Then
Ext = FSO.GetExtensionName(F)
If FSO.FileExists(T & Name) Then NN = FSO.GetBaseName(Name) & "." & Ext Else _
NN = FSO.GetFileName(Name) & "." & Ext
End If : If Add Then ReName NN
If Not FSO.FileExists(NN) Then FSO.GetFile(F).Name = NN
Else
If FSO.FileExists(T & NN) Then NN = FSO.GetBaseName(NN)
If Add Then ReName NN
If Not FSO.FolderExists(NN) Then FSO.GetFolder(F).Name = FSO.GetFileName(NN)
End If
End If
Next : Set FSO = Nothing
Sub Rename(FName)
FN = FName : n = 0
Do While FSO.FileExists(FName) Or FSO.FolderExists(FName)
n = n + 1 : If n < 10^M Then PFix = Right(String(M, "0") & n, M) Else PFix = n
If FSO.FileExists(FN) Then
FName = FSO.GetBaseName(FN) & " (" & PFix & ")." & FSO.GetExtensionName(FN)
Else FName = FSO.GetFileName(FN) & " (" & PFix & ")"
End If
Loop
End Sub |
_________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Mon Sep 09, 2013 14:52 Post subject: |
|
|
Flasher
Quote: | Предлагаю пока потестить, что есть: |
Попробовал запустить с параметрами, предложенными в качестве примера:
а также
и
В всех трёх случаях выдаётся сообщение об ошибке, что файл уже существует (Line 25, Char 39). Что он имеет в виду? Что исходнрый файл существует в своей папке? Ну, естественно, он существует, тут не поспоришь
Что-то не так я делаю. Но что?
Как этим вообще пользоваться? Мы тут несколько разных вариантов обсуждали: копирование имени на один целевой или на несколько, в той же панели или в другой...
Flasher wrote: | Суть автоматизации в том, чтобы юзер вообще об этом не думал. Если есть совпавшие элементы, которые были пропущены, то и мыслить об этом не имеет смысла, так как всё и так будет на своих местах. |
Попробую пояснить ситуацию на упрощённом примере. Допустим, есть папка с 20-30 файлами в разных форматах:
07.09.2013 tramparam.doc
02.09.2013 tramparam.doc
08.09.2013 uguaga.xls
01.09.2013 hrasbum.ppt
03.09.2013 tralala.docx
....
В общем, случайные имена, которые были временно присвоены файлам в ходе работы над проектом. Теперь юзер хочет их переименовать, чтобы в имени файла как-то отражалось содержимое документа. Он использует для этого имя последней редакции файла в другой папке: NASA steals the Moonlight.doc. Отлично, запускаем скрипт, переименовываем файлы в целевой папке. На выходе получаем:
NASA steals the Moonlight.doc
NASA steals the Moonlight.xls
NASA steals the Moonlight.ppt
NASA steals the Moonlight.docx
NASA steals the Moonlight.002.doc
....
То есть, оказалось, что в целевой папке случайно оказалось два файла с одинаковым расширением .doc. Один из них - лишний. Но какой именно?? Посмотреть по времени создания/модификации? Не факт, зависит от алгоритма работы с документами. Это можно было посмотреть по дате в исходном имени, но это имя уже пребывает в раю для погибших имён файлов. А от циферки [02] в этом смысле никакой пользы.
А вот если бы юзера предупредили заранее о совпадении имён, то он мог бы отменить операцию и ещё раз посмотреть, что там за дубликаты и какой из них правильный. Вот как-то так, не знаю, сумел ли достаточно объяснить... |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Sep 09, 2013 15:15 Post subject: |
|
|
oshizelly wrote: | Как этим вообще пользоваться? | Для начала прочесть его название.
oshizelly wrote: | Один из них - лишний. Но какой именно? | Человек выделяет что-то конкретное, если один лишний, то он должен знать об этом заранее. Почему? Потому что если он не обращает внимание на последовательность в списке, то мало смысла в том, чтобы он узнавал, что обработан файл, который не следовало обрабатывать, поскольку скрипт в цикле будет спотыкаться на следующем расширении, а не разбивать всё на группы и выдавать сообщение. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Mon Sep 09, 2013 21:56 Post subject: |
|
|
Flasher wrote: | Для начала прочесть его название. |
Это же читать надо уметь!
В общем, разобрался, действительно работает, если выделять на активной и копировать имя из пассивной.
И всё-таки нижайшая просьба: нельзя ли сделать дополнительную модификацию скрипта, чтобы он:
1) копировал в обратном направлении из активной в пассивную? Понимаю, что это возможно только для единичного целевого файла, но тем не менее иногда это - именно то, что требуется.
2) при совпадении расширений выделенных целевых файлов выдавал сообщение, давящее на психику юзера. Согласен на любую комбинацию со счётчиком: до переименования, после него или вместо... Лишь бы минимизировать вероятность ошибки из-за невнимательности юзера. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Sep 09, 2013 23:04 Post subject: |
|
|
oshizelly wrote: | Понимаю, что это возможно только для единичного целевого файла | С Хелпером можно и для списка.
2) Не очень понял конечную цель. Нужно выдавать предупреждение, что в списке есть файлы с одинаковым расширением (мол, примите меры) или спотыкач на каждом, или переименовывать первый попавшийся, а остальные скидывать в лог?
И что с папками делать? Там то логичен только счётчик.
oshizelly wrote: | комбинацию со счётчиком | В каком смысле "комбинацию"? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
oshizelly

Joined: 04 Sep 2012 Posts: 52
|
(Separately) Posted: Mon Sep 09, 2013 23:15 Post subject: |
|
|
Flasher wrote: | С Хелпером можно и для списка. |
Если можно, то хорошо бы сделать...
Quote: | Нужно выдавать предупреждение, что в списке есть файлы с одинаковым расширением (мол, примите меры) |
Да, имел в виду именно это.
Quote: | а остальные скидывать в лог? |
Если можно сохрнаить в логе исходные имена переименованных файлов, то это в любом случае было бы здорово.
Quote: | И что с папками делать? Там то логичен только счётчик. |
С папками - да. Там ведь нет расширений.
Quote: | В каком смысле "комбинацию"? |
"Комбинацию" в том смысле, что использование счётчика не исключает необходимости выдачи предупреждения. Обе опции могут использоваться совместно. |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Sep 11, 2013 20:52 Post subject: |
|
|
Нашёл таки время.
oshizelly wrote: | Если можно сохрнаить в логе исходные имена переименованных файлов, то это в любом случае было бы здорово. | Я писал про остальные. Судя по тому, что имелось в виду, это уже отпадает. А список выделенного сохранить и так не проблема.
oshizelly wrote: | Обе опции могут использоваться совместно. | Нет, обе опции могут использоваться по отдельности.
 Вот что получилось на скорую руку: Code: | '=====================================================================================
' Переименовывать имена элементов пассивной панели в имя элемента активной
' Внимание!: используется компонент Script Helper ActiveX for TC
' Параметры: 1) %V; 2) <полное/базовое имя: 0/1>;
' 3) при наличии совпавших расширений в выбранном списке:
' а) выдавать сообщение: 0
' б) добавлять № счётчика: 1
' Пример: %V 0 1
'=====================================================================================
With WScript.Arguments
If .Count = 0 Then WScript.Quit
File = .Item(0) : OBN = .Item(1) : Add = .Item(2)
End With : Const M = 0
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
With CreateObject("TCScript.Helper")
.LockTC True : List = .GetTrgSelectedFiles(1) : .LockTC False
End With : L = vbNewLine
If Add = 0 Then
S = "" : i = 0
For Each F in List
If F <> "" Then
If FSO.FileExists(F) Then
Ext = FSO.GetExtensionName(F) : FN = FSO.GetFileName(F)
If Not Dict.Exists(Ext) Then
Dict.Add Ext, FN : i = i + 1
Else
FF = Dict.Item(Ext) : If InStr(S, FF) = 0 Then S = S & L & FF
S = S & L & FN
End If
End If
End If
Next : If S <> "" Then
MsgBox "В выбранном списке есть файлы с одним расширением:" & L & _
S, 48, Space(30) & "Вынужденное завершение" : Dict.RemoveAll : Quit
End If : Dict.RemoveAll
End If
For Each F in List
If F <> "" Then
NN = FSO.GetFileName(File) : PF = FSO.GetParentFolderName(F) & "\"
If FSO.FileExists(F) Then
If OBN Then
Ext = FSO.GetExtensionName(F)
If FSO.FileExists(File) Then NN = FSO.GetBaseName(NN) & "." & Ext Else _
NN = FSO.GetFileName(File) & "." & Ext
End If : If Add = 1 And Not FSO.FileExists(PF & NN) Then ReName NN
If Not FSO.FileExists(PF & NN) Then FSO.GetFile(F).Name = NN
Else
If FSO.FileExists(File) Then NN = FSO.GetBaseName(NN)
ReName NN
If Not FSO.FolderExists(PF & NN) Then FSO.GetFolder(F).Name = FSO.GetFileName(NN)
End If
End If
Next : Quit
Sub Rename(FName)
FNm = FName : n = 0
Do While FSO.FileExists(FName) Or FSO.FolderExists(FName)
n = n + 1 : If n < 10^M Then PFix = Right(String(M, "0") & n, M) Else PFix = n
If FSO.FileExists(FNm) Then
FName = FSO.GetBaseName(FNm) & " (" & PFix & ")." & FSO.GetExtensionName(FNm)
Else FName = FSO.GetFileName(FNm) & " (" & PFix & ")"
End If
Loop
End Sub : Sub Quit : Set FSO = Nothing : Set Dict = Nothing : WScript.Quit : End Sub |
Если возникнут баги, прошу в студию. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|