Страница 3 из 4

Добавлено: Пн ноя 21, 2005 16:32
MStin
Можно. Только вопрос - эти папки лежат непосредственно в твоей "PageStory" или могут быть в подкаталогах этой папки? Или пропускать по маске названия в любом месте?
Ну да. Просто там должны лежать несколько папок (типа TEMP), в которые падают файлы, бекапы и просто мусор. И их переименовывать не надо.

Добавлено: Пн ноя 21, 2005 16:37
MStin
Неа :(
Все равно меняет!

Добавлено: Пн ноя 21, 2005 17:14
Batya
Все равно меняет!
Да не можеь быть! Может у тебя висит в памяти старый скрипт, вот он и меняет?
На всякий случай привожу скрипт полностью:

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

'======================================================================
' Переименование файлов в указанном каталоге с заданной периодичностью
' К имени файла добавляется приставка - имя родительского каталога
' Поодерживается двойное вложение подкаталогов
'======================================================================

Dim Mydir, Mysleep, Delimiter, MyKey
'========== Изменяемые параметры ======================================
Mydir     = "E:\PAGE STORE\"  'Сканируемый каталог
Delimiter = "_"               'Разделитель после приставки
Mysleep   = 10000             'Пауза между сканированием в милисекундах
MyKey     = "HKCU\Environment\RunningMyScript" 'Ключ в реестре
'======================================================================
Dim FSO, WshShell, MyFolder, MyFolder1
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set MyFolder = FSO.GetFolder(Mydir)

Dim MykeyValue, MyDirName, ScanFile, ScanFileName, NameLen, MySubFolders
MykeyValue = True
WshShell.RegWrite MyKey, MykeyValue

Do While MykeyValue
  MySubFolders = ""
  For Each ScanFolder in MyFolder.SubFolders
    MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder).Path
    For Each ScanFolder1 in ScanFolder.SubFolders
      MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder1).Path
    Next
  Next
  MySubFolders = Split(Mid(MySubFolders, 2), chr(13))
  For Each ScanFolder in MySubFolders
    Set MyFolder1 = FSO.GetFolder(ScanFolder)
    MyDirName = MyFolder1.Name
    NameLen   = Len(MyDirName)
    For Each ScanFile in MyFolder1.Files
      ScanFileName = FSO.GetFile(ScanFile).Name
      If Left(ScanFileName, NameLen) <> MyDirName Then
        FSO.MoveFile ScanFile, MyFolder1.Path & "\" & MyDirName & Delimiter & ScanFileName
      End If
    Next
  Next
  MykeyValue = WshShell.RegRead(MyKey)
  Wscript.Sleep Mysleep
Loop
WshShell.RegDelete MyKey
Set FSO       = Nothing
Set WshShell  = Nothing
Set MyFolder  = Nothing
Set MyFolder1 = Nothing
WScript.Quit
Ну да. Просто там должны лежать несколько папок (типа TEMP), в которые падают файлы, бекапы и просто мусор. И их переименовывать не надо.
Что значит "ну да"? Я же дважды написал "или". Какой из вариантов нужен?
Напиши более четко. Варианты:
1. Пропускать папки, которые лежат непосредственно в PageStory и имеют имена Temp1 и Temp2.
2. Пропускать папки, которые лежат где-то во вложенных папках в PageStory и имеют маску Temp*.

Добавлено: Пн ноя 21, 2005 17:36
MStin
Все! Супер. Работает. Видимо ты был прав.
1. Да, но только Temp, HighRes, LowRes, Quest. Ну вроде и всё.
2. Нет, этого нет. В смысле, не надо :)

Добавлено: Пн ноя 21, 2005 18:51
Batya
Готово:

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

'================================================================================
' Переименование файлов в указанном каталоге с заданной периодичностью
' К имени файла добавляется приставка - имя родительского каталога
' Поодерживается двойное вложение подкаталогов
'================================================================================

Dim Mydir, Mysleep, Delimiter, MyKey
'========== Изменяемые параметры ================================================
Mydir     = "E:\PAGE STORE\"  'Сканируемый каталог
Delimiter = "_"               'Разделитель после приставки
Mysleep   = 10000             'Пауза между сканированием в милисекундах
MyKey     = "HKCU\Environment\RunningMyScript" 'Ключ в реестре
NotInProc = Array("Temp", "HighRes", "LowRes", "Quest") 'Папки не обрабатываются
'================================================================================
Dim FSO, WshShell, MyFolder, MyFolder1
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set MyFolder = FSO.GetFolder(Mydir)

Dim MykeyValue, MyDirName, ScanFile, ScanFileName, NameLen, MySubFolders, Scan4Not, Pos4Not
MykeyValue = True
WshShell.RegWrite MyKey, MykeyValue

Do While MykeyValue
  MySubFolders = ""
  For Each ScanFolder in MyFolder.SubFolders
    MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder).Path
    For Each ScanFolder1 in ScanFolder.SubFolders
      MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder1).Path
    Next
  Next
  For Each Scan4Not in NotInProc
    Pos4Not = InStr(MySubFolders & chr(13), "\" & Scan4Not & chr(13))
    If Pos4Not > 0 Then
      MySubFolders = Mid(MySubFolders, 1, Pos4Not - Len(Mydir) - 1) & Mid(MySubFolders, Pos4Not + Len(Scan4Not) + 1)
    End If
  Next
  MySubFolders = Split(Mid(MySubFolders, 2), chr(13))
  For Each ScanFolder in MySubFolders
    Set MyFolder1 = FSO.GetFolder(ScanFolder)
    MyDirName = MyFolder1.Name
    NameLen   = Len(MyDirName)
    For Each ScanFile in MyFolder1.Files
      ScanFileName = FSO.GetFile(ScanFile).Name
      If Left(ScanFileName, NameLen) <> MyDirName Then
        FSO.MoveFile ScanFile, MyFolder1.Path & "\" & MyDirName & Delimiter & ScanFileName
      End If
    Next
  Next
  MykeyValue = WshShell.RegRead(MyKey)
  Wscript.Sleep Mysleep
Loop
WshShell.RegDelete MyKey
Set FSO       = Nothing
Set WshShell  = Nothing
Set MyFolder  = Nothing
Set MyFolder1 = Nothing
WScript.Quit

Добавлено: Пн ноя 21, 2005 19:11
MStin
Мощь!!!! Просто невозможную работу ты сделал!!
А имена каталогов в Array можно менять? "Ах какой полезный приборчик!"© :)
Большое человеческое спасибо. Чувствую, пора изучать VB :)

Добавлено: Пн ноя 21, 2005 19:58
MStin
Единственно, в этих 4-х папках (которые не троаются) файлы не должны переименовываться и во-вложенных каталогах. (Там они будут присутствовать). Извини, что не предупредил :)

Добавлено: Вт ноя 22, 2005 10:17
Batya
А имена каталогов в Array можно менять?
Можно. Для этого и сделал массивом.
Единственно, в этих 4-х папках (которые не троаются) файлы не должны переименовываться и во-вложенных каталогах. (Там они будут присутствовать).
Поправил:

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

'================================================================================
' Переименование файлов в указанном каталоге с заданной периодичностью
' К имени файла добавляется приставка - имя родительского каталога
' Поодерживается двойное вложение подкаталогов
'================================================================================

Dim Mydir, Mysleep, Delimiter, MyKey
'========== Изменяемые параметры ================================================
Mydir     = "E:\PAGE STORE\"  'Сканируемый каталог
Delimiter = "_"               'Разделитель после приставки
Mysleep   = 10000             'Пауза между сканированием в милисекундах
MyKey     = "HKCU\Environment\RunningMyScript" 'Ключ в реестре
NotInProc = Array("Temp", "HighRes", "LowRes", "Quest") 'Папки не обрабатываются
'================================================================================
Dim FSO, WshShell, MyFolder, MyFolder1
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set MyFolder = FSO.GetFolder(Mydir)

Dim MykeyValue, MyDirName, ScanFile, ScanFileName, NameLen, MySubFolders
Dim Scan4Not, Pos4Not, Pos4Not1, SearchStr
MykeyValue = True
WshShell.RegWrite MyKey, MykeyValue

Do While MykeyValue
  MySubFolders = ""
  For Each ScanFolder in MyFolder.SubFolders
    MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder).Path
    For Each ScanFolder1 in ScanFolder.SubFolders
      MySubFolders = MySubFolders & chr(13) & FSO.GetFolder(ScanFolder1).Path
    Next
  Next
  For Each Scan4Not in NotInProc
    SearchStr = chr(13) & Mydir & Scan4Not
    Pos4Not  = InStr(MySubFolders, SearchStr)
    Do While Pos4Not > 0
      Pos4Not1 = InStr(Pos4Not + 1, MySubFolders & chr(13), chr(13))
      MySubFolders = Mid(MySubFolders, 1, Pos4Not - 1) & Mid(MySubFolders, Pos4Not + Pos4Not1 - 1)
      Pos4Not  = InStr(MySubFolders, SearchStr)
    Loop
  Next
  MySubFolders = Split(Mid(MySubFolders, 2), chr(13))
  For Each ScanFolder in MySubFolders
    Set MyFolder1 = FSO.GetFolder(ScanFolder)
    MyDirName = MyFolder1.Name
    NameLen   = Len(MyDirName)
    For Each ScanFile in MyFolder1.Files
      ScanFileName = FSO.GetFile(ScanFile).Name
      If Left(ScanFileName, NameLen) <> MyDirName Then
        FSO.MoveFile ScanFile, MyFolder1.Path & "\" & MyDirName & Delimiter & ScanFileName
      End If
    Next
  Next
  MykeyValue = WshShell.RegRead(MyKey)
  Wscript.Sleep Mysleep
Loop
WshShell.RegDelete MyKey
Set FSO       = Nothing
Set WshShell  = Nothing
Set MyFolder  = Nothing
Set MyFolder1 = Nothing
WScript.Quit

Добавлено: Вт ноя 22, 2005 11:20
MStin
Чччерт. Выдает ошибку.
Line: 44
Char: 5
Error: Path not found
Code: 800A004C
Source: Microsoft VBScript runtime error

Видимо пробел в имени "Page Story" не нравиться
Если в
"Mydir = "E:\PAGE STORE\" 'Сканируемый каталог "
сделать
"Mydir = "E:\PAGE STORE" 'Сканируемый каталог "

То вроде все нормально

Добавлено: Вт ноя 22, 2005 11:24
MStin
Вылезла другая засада. В момент копирования в Page Story скрипт видимо пытается переименовать файлы и из-за этого выдает следующее:
Line 50
Char: 9
Error: Permission denied
и далее тоже самое, что и раньше

:(

Добавлено: Вт ноя 22, 2005 11:25
MStin
Но если запустить скрипт после коп-ния, то все ОК

Добавлено: Вт ноя 22, 2005 11:30
Batya
MStin
Хм...
У меня, вроде, все нормально. Пришли мне, пожалуйста, архив каталога Page Story (файлы можно сделать нулевыми) по почте - мыло я бросил тебе в личку. И давай теперь общаться по почте, т.к. вряд ли кого-то еще интересует этот скрипт.

Добавлено: Вт ноя 22, 2005 11:37
MStin
OK
Неужели это никому не интересно???
Такая важная ветка :)

Добавлено: Ср ноя 23, 2005 16:15
Ciber SLasH
Batya писал(а):т.к. вряд ли кого-то еще интересует этот скрипт.
Останьтесь, очень даже интересует. Мне интересен сам принцип, т.к. я в VB очень слабо шурупаю, а в JScript поболее. Поэтому стараюсь примеры на VB переводить в JScript.

Продолжайте обсуждение... :)

Добавлено: Ср ноя 23, 2005 16:23
Batya
После вышеприведенного было добавлено обрамление строки, где выполняется переименование на случай возникновения ошибки:

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

        On Error Resume Next
        FSO.MoveFile ScanFile, MyFolder1.Path & "\" & MyDirName & Delimiter & ScanFileName
        On Error GoTo 0
Т.е. если еще идет процесс копирования файла, а скрипт пытается его переименовать, то пропускаем. Далее попытка переименования будет при следующем сканировании каталогов.
На Jscript для этого надо смотреть в сторону try...catch…finally.