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

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

Добавлено: Вс июл 26, 2009 15:37
_D_V_S_
Приветствую всех знатоков WSH :wink:
Суть задачи такова:

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

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

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

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

@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:

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

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. Можно и обойтись конечно все-в-одном батнике, но деталей за давностью не помню уже, почему я их разбивал...

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

Внимание, знатоки вопрос :) Выручайте, для меня WSH темный лес :)
Как подобное организовать в WSH?
...И если не затруднит, то не для 2 папок, а для N? Почему-то подозреваю, что для N>2 несколько по другому будет.

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

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

Добавлено: Пн июл 27, 2009 12:22
_D_V_S_
Batya писал(а):Не совсем понял, мы переименовываем 11 -> 1 в этом случае, или надо "ничего не делать"? Если не переименовываем, то когда создавать 11.flg?
Логику данного варианта распиши. Какие папки во что переименовываются при каких флагах?

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

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

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

@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

Добавлено: Пн июл 27, 2009 13:49
Batya
_D_V_S_ писал(а):2. Во второй раз выбираем 12
_D_V_S_ писал(а):3. А в третий раз ... опять выбираем каталог 12
Не понял. А к 11 мы когда-нибудь вернемся?

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

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

Добавлено: Пн июл 27, 2009 15:21
_D_V_S_
Batya писал(а):
_D_V_S_ писал(а):2. Во второй раз выбираем 12
_D_V_S_ писал(а):3. А в третий раз ... опять выбираем каталог 12
Не понял. А к 11 мы когда-нибудь вернемся?
Так 11 - она ж после второй операции имеет первоначальное имя - 11 :) Её мы выберем, когда она нам потребуется (при ее выборе, папка 12, имеющая вид - 1, вернет свое первоначальное имя - 12).
:D Какой ужас все это описывать словами))) Не пробовал батник, код которого я дал? ИМХО гораздо проще увидеть, как это работает, чем представить из словесного описания :)
Batya писал(а): И как насчет нескольких папок?
Есть куча (N) папок с именами 1,2....N надо ОДНУ из них (выбрав ее) переименовать в имя "1". Потому что некая программа для своей работы требует конкретное имя папки с ресурсами (например "1"), и не работает с параметрами из командной строки (например "run.exe -dir 11"). А Ресурсы для нее - разные, находятся соответственно в разных папках (например "11", "12"). И каждый раз вручную переименовывать папку с нужными ресурсами долго да и проще батник на самом деле написать... Чувствую, никуда мне не деться от choice.exe :)
Batya писал(а): Правильно ли я понимаю, что есть перечень рабочих папок и одна резервная. В резервную по-очереди копируется та или иная рабочая папка. (При этом из резервной нужно восстановить предыдущую рабочую.) Чтобы помнить очередь, вводится файл-флаг, указывающий на ту рабочую папку, которая скопирована в резервную.
Правильно описал?
Да, правильно. Можно конечно и так - создать папку 1, и в нее копировать из выбранной папки (11 или 12 в данном случае) файлы *.* , но во-первых, операция копирования занимает время (количество файлов в папке и их размер не маленький), во-вторых - дисковое пространство, гораздо проще переименовать папку в нужный вид. Это происходит практически моментально.

PS Спасибо за интерес к моей проблеме :)

Добавлено: Пн июл 27, 2009 16:48
Batya
_D_V_S_ писал(а):Есть два каталога. Из них надо выбрать один и переименовать его.
Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать?

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

Добавлено: Пн июл 27, 2009 17:03
_D_V_S_
Batya писал(а):
_D_V_S_ писал(а):Есть два каталога. Из них надо выбрать один и переименовать его.
Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать
Конечно вручную. Ну ведь в батнике choice только для этого и служит.. Не запускал его?
_D_V_S_ писал(а):Если происходит переименование, а не копирование, то зачем флаги? Разве отсутствие рабочей папки не может служить признаком того, что именно она переименована в "1"?
Вот папка 12 перед этим была например переименована в 1, и после этого пользователь опять выбирает - переименовать её-же... а её нет! она под именем 1 - и как в таком случае действовать? Не знаю, может и файл-флаг "решение-через-одно-место", но - работает :)

Добавлено: Пн июл 27, 2009 17:35
Batya
_D_V_S_ писал(а):после этого пользователь опять выбирает - переименовать её-же... а её нет!
Ну, правильно. Раз нет папки, значит её то как раз и выбирали прошлый раз.
Т.е., какая папка не существует, та и является выбранной последний раз. Разве не так?
_D_V_S_ писал(а):Не запускал его?
Не запускал. Даже не смотрел код батника :) Не хочу переделывать чужую логику. Хочу придумать своё.

Добавлено: Пн июл 27, 2009 18:42
Batya
_D_V_S_ писал(а):Как подобное организовать в WSH?
Вообщем, на vbs примерно так:

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

'===================================================================================
' Выбор рабочей папки
'
' Входные параметры:
' 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
Вариант кнопки:

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

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


-1
Содержимое файла со списком папок FolderList.txt:

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

C:\Test\11\
C:\Test\12\
C:\Test\13\

Добавлено: Пн июл 27, 2009 20:50
_D_V_S_
Batya писал(а):
_D_V_S_ писал(а):Как подобное организовать в WSH?
Вообщем, на vbs примерно так
Гениально! Именно такая задача и стояла. Снимаю шляпу. Спасибо огромное!

PS Я честно говоря не верил, что мне тут помогут и причем так быстро... Спасибо еще раз! :)