View previous topic :: View next topic |
Author |
Message |
_D_V_S_
Joined: 31 Jan 2009 Posts: 35
|
(Separately) Posted: Sun Jul 26, 2009 15:37 Post subject: Переименование папки с проверкой |
|
|
Приветствую всех знатоков WSH
Суть задачи такова:
Есть 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.
Вот примерно так это выглядело:
Выбор осуществлялся батником вида:
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. Можно и обойтись конечно все-в-одном батнике, но деталей за давностью не помню уже, почему я их разбивал...
Набиваю код тут по памяти, могу ошибиться в деталях Но суть такова.
Внимание, знатоки вопрос Выручайте, для меня WSH темный лес
Как подобное организовать в WSH?
...И если не затруднит, то не для 2 папок, а для N? Почему-то подозреваю, что для N>2 несколько по другому будет. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Mon Jul 27, 2009 10:31 Post subject: |
|
|
_D_V_S_ wrote: | Предварительно проверив: (например выбрали 11 -> 1) - какая из них ранее была уже переименована, и если именно 11, то ничего не делать, а приступить к запуску файла RUN. | Не совсем понял, мы переименовываем 11 -> 1 в этом случае, или надо "ничего не делать"? Если не переименовываем, то когда создавать 11.flg?
_D_V_S_ wrote: | ...И если не затруднит, то не для 2 папок, а для N? Почему-то подозреваю, что для N>2 несколько по другому будет. | Логику данного варианта распиши. Какие папки во что переименовываются при каких флагах?
Может объяснишь на реальном примере, зачем тебе это надо? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
_D_V_S_
Joined: 31 Jan 2009 Posts: 35
|
(Separately) Posted: Mon Jul 27, 2009 12:22 Post subject: |
|
|
Batya wrote: | Не совсем понял, мы переименовываем 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... ну думаю это ты и без меня знаешь
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Mon Jul 27, 2009 13:49 Post subject: |
|
|
_D_V_S_ wrote: | 2. Во второй раз выбираем 12 |
_D_V_S_ wrote: | 3. А в третий раз ... опять выбираем каталог 12 | Не понял. А к 11 мы когда-нибудь вернемся?
И как насчет нескольких папок?
Правильно ли я понимаю, что есть перечень рабочих папок и одна резервная. В резервную по-очереди копируется та или иная рабочая папка. (При этом из резервной нужно восстановить предыдущую рабочую.) Чтобы помнить очередь, вводится файл-флаг, указывающий на ту рабочую папку, которая скопирована в резервную.
Правильно описал? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
_D_V_S_
Joined: 31 Jan 2009 Posts: 35
|
(Separately) Posted: Mon Jul 27, 2009 15:21 Post subject: |
|
|
Batya wrote: | _D_V_S_ wrote: | 2. Во второй раз выбираем 12 |
_D_V_S_ wrote: | 3. А в третий раз ... опять выбираем каталог 12 | Не понял. А к 11 мы когда-нибудь вернемся? |
Так 11 - она ж после второй операции имеет первоначальное имя - 11 Её мы выберем, когда она нам потребуется (при ее выборе, папка 12, имеющая вид - 1, вернет свое первоначальное имя - 12).
Какой ужас все это описывать словами))) Не пробовал батник, код которого я дал? ИМХО гораздо проще увидеть, как это работает, чем представить из словесного описания
Batya wrote: |
И как насчет нескольких папок?
|
Есть куча (N) папок с именами 1,2....N надо ОДНУ из них (выбрав ее) переименовать в имя "1". Потому что некая программа для своей работы требует конкретное имя папки с ресурсами (например "1"), и не работает с параметрами из командной строки (например "run.exe -dir 11"). А Ресурсы для нее - разные, находятся соответственно в разных папках (например "11", "12"). И каждый раз вручную переименовывать папку с нужными ресурсами долго да и проще батник на самом деле написать... Чувствую, никуда мне не деться от choice.exe
Batya wrote: |
Правильно ли я понимаю, что есть перечень рабочих папок и одна резервная. В резервную по-очереди копируется та или иная рабочая папка. (При этом из резервной нужно восстановить предыдущую рабочую.) Чтобы помнить очередь, вводится файл-флаг, указывающий на ту рабочую папку, которая скопирована в резервную.
Правильно описал? |
Да, правильно. Можно конечно и так - создать папку 1, и в нее копировать из выбранной папки (11 или 12 в данном случае) файлы *.* , но во-первых, операция копирования занимает время (количество файлов в папке и их размер не маленький), во-вторых - дисковое пространство, гораздо проще переименовать папку в нужный вид. Это происходит практически моментально.
PS Спасибо за интерес к моей проблеме |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Mon Jul 27, 2009 16:48 Post subject: |
|
|
_D_V_S_ wrote: | Есть два каталога. Из них надо выбрать один и переименовать его. | Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать?
Если происходит переименование, а не копирование, то зачем флаги? Разве отсутствие рабочей папки не может служить признаком того, что именно она переименована в "1"? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
_D_V_S_
Joined: 31 Jan 2009 Posts: 35
|
(Separately) Posted: Mon Jul 27, 2009 17:03 Post subject: |
|
|
Batya wrote: | _D_V_S_ wrote: | Есть два каталога. Из них надо выбрать один и переименовать его. | Я не понял, выбор должен быть автоматический, или пользователь вручную должен выбрать |
Конечно вручную. Ну ведь в батнике choice только для этого и служит.. Не запускал его?
_D_V_S_ wrote: | Если происходит переименование, а не копирование, то зачем флаги? Разве отсутствие рабочей папки не может служить признаком того, что именно она переименована в "1"? |
Вот папка 12 перед этим была например переименована в 1, и после этого пользователь опять выбирает - переименовать её-же... а её нет! она под именем 1 - и как в таком случае действовать? Не знаю, может и файл-флаг "решение-через-одно-место", но - работает |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Mon Jul 27, 2009 17:35 Post subject: |
|
|
_D_V_S_ wrote: | после этого пользователь опять выбирает - переименовать её-же... а её нет! | Ну, правильно. Раз нет папки, значит её то как раз и выбирали прошлый раз.
Т.е., какая папка не существует, та и является выбранной последний раз. Разве не так?
_D_V_S_ wrote: | Не запускал его? | Не запускал. Даже не смотрел код батника Не хочу переделывать чужую логику. Хочу придумать своё. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2221 Location: Москва, Россия
|
(Separately) Posted: Mon Jul 27, 2009 18:42 Post subject: |
|
|
_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 |
|
|
_D_V_S_
Joined: 31 Jan 2009 Posts: 35
|
(Separately) Posted: Mon Jul 27, 2009 20:50 Post subject: |
|
|
Batya wrote: | _D_V_S_ wrote: | Как подобное организовать в WSH? | Вообщем, на vbs примерно так |
Гениально! Именно такая задача и стояла. Снимаю шляпу. Спасибо огромное!
PS Я честно говоря не верил, что мне тут помогут и причем так быстро... Спасибо еще раз! |
|
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
|