Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Переименование папки с проверкой

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
_D_V_S_



Joined: 31 Jan 2009
Posts: 35

Post (Separately) Posted: Sun Jul 26, 2009 15:37    Post subject: Переименование папки с проверкой Reply with quote

Приветствую всех знатоков WSH Wink
Суть задачи такова:

Есть 2 папки вида "11" и "12". Надо выбрать одну из них и переименовать ее в "1". Предварительно проверив: (например выбрали 11 -> 1) - какая из них ранее была уже переименована, и если именно 11, то ничего не делать, а приступить к запуску файла RUN. Если была переименована не 11, а 12, то 1 переименовываем обратно в 12, а 11 -> 1. Страхуемся так сказать. Словами написать, чтобы было понятно, не так просто Smile, ниже приводится код батников, сразу разберетесь Smile

В батнике я делал так: сначала проверял на существование файл-флага, создаваемого при переименовании, например как только переименовали 11 -> 1, создается файлик 11.flg, и если он существует, просто запускается RUN. Если нет, тоесть каталог 1 (в данном случае) это - переименованный ранее каталог 12, то я переименовывал 1 -> 12 и потом 11 -> 1.
Вот примерно так это выглядело:

Выбор осуществлялся батником вида:
Code:
@echo off
cls

:start
cls
echo.   1. 11                                                                                         
echo.   2. 12

choice /c:12 /t:1,60
if errorlevel 2 goto 12.bat
if errorlevel 1 goto 11.bat
goto end

:end


Батник 11.bat:
Code:
if exist 11.flg goto end

:start
del *.flg
if exist 1 ren 1 12
ren 11 1
echo 11>11.flg

:end                       
RUN.bat
exit


Соответственно имелся второй аналогичный батник для 12. Можно и обойтись конечно все-в-одном батнике, но деталей за давностью не помню уже, почему я их разбивал...

Набиваю код тут по памяти, могу ошибиться в деталях Smile Но суть такова.

Внимание, знатоки вопрос Smile Выручайте, для меня WSH темный лес Smile
Как подобное организовать в WSH?
...И если не затруднит, то не для 2 папок, а для N? Почему-то подозреваю, что для N>2 несколько по другому будет.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Jul 27, 2009 10:31    Post subject: Reply with quote

_D_V_S_ wrote:
Предварительно проверив: (например выбрали 11 -> 1) - какая из них ранее была уже переименована, и если именно 11, то ничего не делать, а приступить к запуску файла RUN.
Не совсем понял, мы переименовываем 11 -> 1 в этом случае, или надо "ничего не делать"? Если не переименовываем, то когда создавать 11.flg?
_D_V_S_ wrote:
...И если не затруднит, то не для 2 папок, а для N? Почему-то подозреваю, что для N>2 несколько по другому будет.
Логику данного варианта распиши. Какие папки во что переименовываются при каких флагах?

Может объяснишь на реальном примере, зачем тебе это надо?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
_D_V_S_



Joined: 31 Jan 2009
Posts: 35

Post (Separately) Posted: Mon Jul 27, 2009 12:22    Post subject: Reply with quote

Batya wrote:
Не совсем понял, мы переименовываем 11 -> 1 в этом случае, или надо "ничего не делать"? Если не переименовываем, то когда создавать 11.flg?
Логику данного варианта распиши. Какие папки во что переименовываются при каких флагах?

Может объяснишь на реальном примере, зачем тебе это надо?


Вот смотри Smile Есть два каталога. Из них надо выбрать один и переименовать его. Например, есть каталоги 11 и 12 и один из них (по выбору) надо переименовать в 1.
1. Выбираем 11 и переименовываем в 1.
2. Во второй раз выбираем 12 и переименовываем в 1, но сначала естественно ранее переименованный 11-й, который щас под именем 1 переименовываем обратно - в 11.
3. А в третий раз (мы ж не помним, да нам и не надо запоминать) опять выбираем каталог 12. А он же у нас уже переименован (находится уже в том виде, который нам нужен)... Для этого и придумал я флаги Smile
Флаг создается просто для страховки... По нему батник видит - что выбранный каталог уже переименован.

Суть задачи: выбрать один из каталогов и переименовать его в конкретное имя. И как необходимость - ранее переименованный каталог переименовать в первоначальное имя. Ну как мысль донести - словами не так просто Smile
Вот соорудил батник все-в-одном, просто запусти его на исполнение - я его вроде отладил, работает как часы. Только одно "но" - он для возможности выбора пользует команду choice - в составе Windows XP ее нет, надо кинуть файлик choice.exe в windows\system32... ну думаю это ты и без меня знаешь Smile

Code:
@echo off
cls
if not exist *.flg  goto create

:start
cls
echo.   1. 11
echo.   2. 12
echo.   3. EXIT

choice /c:123 /t:1,60
if errorlevel 3 goto exit
if errorlevel 2 goto 12_1
if errorlevel 1 goto 11_1

:11_1
if exist 11.flg goto run

if exist 12.flg del *.flg
if exist 1 ren 1 12
ren 11 1
echo 11>11.flg
goto run

:12_1
if exist 12.flg goto run

if exist 11.flg del *.flg
if exist 1 ren 1 11
ren 12 1
echo 12>12.flg
goto run

:create
md 11
cd 11
echo 11>test11.file
cd ..
md 12
cd 12
echo 12>test12.file
cd ..
goto start

:run
echo *****Тут запускается некий RUN.exe******

:exit
echo *****EXIT******
pause

exit
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Jul 27, 2009 13:49    Post subject: Reply with quote

_D_V_S_ wrote:
2. Во второй раз выбираем 12
_D_V_S_ wrote:
3. А в третий раз ... опять выбираем каталог 12
Не понял. А к 11 мы когда-нибудь вернемся?

И как насчет нескольких папок?

Правильно ли я понимаю, что есть перечень рабочих папок и одна резервная. В резервную по-очереди копируется та или иная рабочая папка. (При этом из резервной нужно восстановить предыдущую рабочую.) Чтобы помнить очередь, вводится файл-флаг, указывающий на ту рабочую папку, которая скопирована в резервную.
Правильно описал?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
_D_V_S_



Joined: 31 Jan 2009
Posts: 35

Post (Separately) Posted: Mon Jul 27, 2009 15:21    Post subject: Reply with quote

Batya wrote:
_D_V_S_ wrote:
2. Во второй раз выбираем 12
_D_V_S_ wrote:
3. А в третий раз ... опять выбираем каталог 12
Не понял. А к 11 мы когда-нибудь вернемся?


Так 11 - она ж после второй операции имеет первоначальное имя - 11 Smile Её мы выберем, когда она нам потребуется (при ее выборе, папка 12, имеющая вид - 1, вернет свое первоначальное имя - 12).
Very Happy Какой ужас все это описывать словами))) Не пробовал батник, код которого я дал? ИМХО гораздо проще увидеть, как это работает, чем представить из словесного описания Smile

Batya wrote:

И как насчет нескольких папок?

Есть куча (N) папок с именами 1,2....N надо ОДНУ из них (выбрав ее) переименовать в имя "1". Потому что некая программа для своей работы требует конкретное имя папки с ресурсами (например "1"), и не работает с параметрами из командной строки (например "run.exe -dir 11"). А Ресурсы для нее - разные, находятся соответственно в разных папках (например "11", "12"). И каждый раз вручную переименовывать папку с нужными ресурсами долго да и проще батник на самом деле написать... Чувствую, никуда мне не деться от choice.exe Smile

Batya wrote:

Правильно ли я понимаю, что есть перечень рабочих папок и одна резервная. В резервную по-очереди копируется та или иная рабочая папка. (При этом из резервной нужно восстановить предыдущую рабочую.) Чтобы помнить очередь, вводится файл-флаг, указывающий на ту рабочую папку, которая скопирована в резервную.
Правильно описал?


Да, правильно. Можно конечно и так - создать папку 1, и в нее копировать из выбранной папки (11 или 12 в данном случае) файлы *.* , но во-первых, операция копирования занимает время (количество файлов в папке и их размер не маленький), во-вторых - дисковое пространство, гораздо проще переименовать папку в нужный вид. Это происходит практически моментально.

PS Спасибо за интерес к моей проблеме Smile
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Jul 27, 2009 16:48    Post subject: Reply with quote

_D_V_S_ wrote:
Есть два каталога. Из них надо выбрать один и переименовать его.
Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать?

Если происходит переименование, а не копирование, то зачем флаги? Разве отсутствие рабочей папки не может служить признаком того, что именно она переименована в "1"?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
_D_V_S_



Joined: 31 Jan 2009
Posts: 35

Post (Separately) Posted: Mon Jul 27, 2009 17:03    Post subject: Reply with quote

Batya wrote:
_D_V_S_ wrote:
Есть два каталога. Из них надо выбрать один и переименовать его.
Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать


Конечно вручную. Ну ведь в батнике choice только для этого и служит.. Не запускал его?

_D_V_S_ wrote:
Если происходит переименование, а не копирование, то зачем флаги? Разве отсутствие рабочей папки не может служить признаком того, что именно она переименована в "1"?


Вот папка 12 перед этим была например переименована в 1, и после этого пользователь опять выбирает - переименовать её-же... а её нет! она под именем 1 - и как в таком случае действовать? Не знаю, может и файл-флаг "решение-через-одно-место", но - работает Smile
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Jul 27, 2009 17:35    Post subject: Reply with quote

_D_V_S_ wrote:
после этого пользователь опять выбирает - переименовать её-же... а её нет!
Ну, правильно. Раз нет папки, значит её то как раз и выбирали прошлый раз.
Т.е., какая папка не существует, та и является выбранной последний раз. Разве не так?

_D_V_S_ wrote:
Не запускал его?
Не запускал. Даже не смотрел код батника Smile Не хочу переделывать чужую логику. Хочу придумать своё.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Jul 27, 2009 18:42    Post subject: Reply with quote

_D_V_S_ wrote:
Как подобное организовать в WSH?
Вообщем, на vbs примерно так:
Code:
'===================================================================================
' Выбор рабочей папки
'
' Входные параметры:
' 1 - файл со списком рабочих папок;
' 2 - обрабатываемая папка;
' 3 и далее - выполняемая программа и её параметры.
'===================================================================================
Option Explicit
Dim Mess, FSO, WSH, FolderList, ProcFolder, Command, Folders, Text, i, UseFolder, M, F
Dim Choice
SetMess
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")
CheckParams
Text = FSO.OpenTextFile(FolderList, 1, False).ReadAll
Folders = Split(Text, vbNewLine)
UseFolder = ""
i = 0
For Each F In Folders
  If F <> "" Then
    i = i + 1
    F = GetPath(F)
    If Not FSO.FolderExists(F) Then UseFolder = F
    M = M & vbNewLine & CStr(i) & " - " & F
  End If
Next
If UseFolder <> "" And Not FSO.FolderExists(ProcFolder) Then
  MsgBox Mess(6) & UseFolder, vbCritical + vbOKOnly, Mess(0)
  Quit
End If
'If UseFolder = "" And FSO.FolderExists(ProcFolder) Then
'  MsgBox Mess(8), vbCritical + vbOKOnly, Mess(0)
'  Quit
'End If
M = Mid(M, Len(vbNewLine) + 1)
Do
  Choice = InputBox(Mess(7) & vbNewLine & vbNewLine & M, Mess(0))
  If Choice = "" Then Quit 0
  If Not IsNumeric(Choice) Then
    Choice = ""
  Else
    Choice = CInt(Choice)
    If Choice < 1 Or Choice > i Then Choice = ""
  End If
  If Choice = "" Then MsgBox Mess(8), vbExclamation + vbOKOnly, Mess(0)
Loop While Choice = ""
F = GetPath(Folders(Choice - 1))
If UseFolder <> "" Then
  If UseFolder <> F Then
    FSO.MoveFolder ProcFolder, UseFolder
    FSO.MoveFolder F, ProcFolder
  End If
Else
  If FSO.FolderExists(ProcFolder) Then FSO.DeleteFolder ProcFolder
  FSO.MoveFolder F, ProcFolder
End If

WSH.Run Command, 7, False
Quit 0

Sub SetMess
  Set Mess = CreateObject("Scripting.Dictionary")
  With Mess
    .Add 0,  "Выбор рабочей папки"
    .Add 1,  "Не указаны параметры!"
    .Add 2,  "Не указана обрабатываемая папка!"
    .Add 3,  "Не указана выполняемая команда!"
    .Add 4,  "Файл-список "
    .Add 5,  " не существует!"
    .Add 6,  "Обрабатываемая папка не существует." &_
             "Не существует рабочая папка - "
    .Add 7,  "Укажите вариант выбора папки:"
    .Add 8,  "Указанное значение некорректно!"
  End With
End Sub

'Проверка входных параметров
Sub CheckParams
  Dim l
  With WScript
    If .Arguments.Count = 0 Then
      MsgBox Mess(1), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    If .Arguments.Count < 2 Then
      MsgBox Mess(2), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    If .Arguments.Count < 3 Then
      MsgBox Mess(3), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    FolderList = GetPath(.Arguments(0))
    If Not FSO.FileExists(FolderList) Then
      MsgBox Mess(4) & FolderList & Mess(5), vbCritical + vbOKOnly, Mess(0)
      Quit
    End If
    ProcFolder = GetPath(.Arguments(1))
    For l = 2 To .Arguments.Count - 1
      Command = Command & " " & .Arguments(l)
    Next
    Command = Mid(Command, 2)
  End With
End Sub

Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

Sub Quit(pExitCode)
  Set WSH  = Nothing
  Set FSO  = Nothing
  Set Mess = Nothing
  WScript.Quit pExitCode
End Sub

Вариант кнопки:
Code:
TOTALCMD#BAR#DATA
C:\WHS\FolderChoice.vbs
C:\Test\FolderList.txt C:\Test\1 net send admin Привет
shell32.dll,87
Выбор рабочей папки


-1

Содержимое файла со списком папок FolderList.txt:
Code:
C:\Test\11\
C:\Test\12\
C:\Test\13\

_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
_D_V_S_



Joined: 31 Jan 2009
Posts: 35

Post (Separately) Posted: Mon Jul 27, 2009 20:50    Post subject: Reply with quote

Batya wrote:
_D_V_S_ wrote:
Как подобное организовать в WSH?
Вообщем, на vbs примерно так


Гениально! Именно такая задача и стояла. Снимаю шляпу. Спасибо огромное!

PS Я честно говоря не верил, что мне тут помогут и причем так быстро... Спасибо еще раз! Smile
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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