Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - ASP и VBScript

Страница: 1 |

 

  Вопрос: как переименовать файл по определенному правилу Добавлено: 12.02.10 22:46  

Автор вопроса:  Alexander
Ситуация в следующем, есть файлы с именами

abcdef-1.txt
abcdef-3.txt
abcdef-2.txt
ghhgh-2.txt
ghhgh-3.txt
ghhgh-1.txt

1) как написать скрипт для приведения имени файла в вид abcdef.txt ( как сохранить файл с новым именем без двух последних символов, при этом исходное количество символов в имени файла может меняться )

2) Каким образом объединить содержимое текстовых файлов с выше приведенными именами в порядке присвоенного им индекса -1,-2,-3 с учетом имени перед индексом , с окончательным именем файла без приставки -*.

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 Just



Вопросов: 4
Ответов: 330
 Профиль | | #1 Добавлено: 13.02.10 11:10
вот пример моего скрипта. думаю подойдет...
кинуть в папку sendto и потом из контекстного меню вызывать
  1.  
  2. Option Explicit
  3. Dim objFSO, LogFile, FilesOrFold, SubFold, DelLeftLen, DelRightLen, strMaskBefore, strMaskAfter, LeftCount, RightCount, strMaskFind, strMaskReplace, strMaskExten, TextCompareReplace, strFolderPath, Sel, objArgs, I, Old_New_Name, objOldName
  4. Set objFSO = CreateObject("Scripting.FileSystemObject")
  5.  
  6. Dim FilesArray()
  7. Dim FilesArrayCount
  8. FilesArrayCount = 0
  9.  
  10. Set objArgs = WScript.Arguments
  11. For I = 0 to objArgs.Count - 1 'цикл вывода всех проиндексиванных аргументов
  12. strFolderPath = objArgs(I)
  13. Next
  14.  
  15.  
  16.  
  17.  
  18. if objFSO.FolderExists(strFolderPath) = 0 then
  19. msgbox "Ошибка получения пути к папке!", 16, "Переименование..."
  20. WscriptQuit()
  21. End If
  22.  
  23. Sel = MsgBox("Переименовать имена файлов и папок?" & Chr(13) & Chr(10) & "В папке: " & strFolderPath, 4 + 32, "Переименование...")
  24. If Sel <> 6 Then
  25. WscriptQuit()
  26. End If
  27.  
  28.  
  29.  
  30.  
  31. 'FilesOrFold = 1   '<файлы - 1, папки - 2, файлы и папки - 3>
  32. 'SubFold = 0   '<подпапки - 1, без подпапок - 0>
  33. 'DelLeftLen = 0   'удалить слева символы
  34. 'DelRightLen = 0   'удалить справа символы
  35. 'strMaskFind = ""   'строка поиска для замены
  36. 'strMaskReplace = ""   'строка замены (если строка поиска присутствует в имени файла)
  37. 'TextCompareReplace = 1   'без учета регистра
  38. 'strMaskBefore = ""   'добавить строку в начале файла
  39. 'strMaskAfter = ""   'добавить строку в конце файла
  40. 'LeftCount = ""   '<0 - добавить счетчик (начать отсчет с 0) в начало файла, "" - не добавлять счетчик в начало файла>
  41. 'RightCount = ""   '<0 - добавить счетчик (начать отсчет с 0) в конец файла, "" - не добавлять счетчик в конец файла>
  42. 'strMaskExten = ""   '<".txt" - переименовывать только один тип файлов без папок, "" - переименовывать все типы файлов и папки, если указаны>
  43. 'strFolderPath = "C:\Temp"   'папка в которой переименовывать
  44.  
  45.  
  46.  
  47.  
  48. FilesOrFold = InputBox("По умолчанию включен режим переименования только файлов!" & Chr(13) & Chr(10) & "Изменить?" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "1 - переименование только файлов" & Chr(13) & Chr(10) & "2 - переименование только папок" & Chr(13) & Chr(10) & "3 - переименование файлов и папок", "Переименование...", "1")
  49. If FilesOrFold <> 1 and FilesOrFold <> 2 and FilesOrFold <> 3 Then FilesOrFold = 1
  50.  
  51. SubFold = InputBox("По умолчанию включен режим переименования без подпапок!" & Chr(13) & Chr(10) & "Изменить?" & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "1 - переименовывать в подпапках тоже" & Chr(13) & Chr(10) & "0 - не учитывать подпапки", "Переименование...", "0")
  52. If SubFold <> 0 and SubFold <> 1 Then SubFold = 0
  53.  
  54. Sel = MsgBox("Удалить по краям имен символы?", 4 + 32, "Переименование...")
  55. If Sel = 6 Then
  56.   DelLeftLen = InputBox("Укажите количество удаляемых символов слева." & Chr(13) & Chr(10) & "Если количество удаляемых символов превысит количество символов файла, то файл будет пропущен!", "Переименование...", "0")
  57.   If DelLeftLen < 0 and DelLeftLen = "" Then DelLeftLen = 0
  58.   DelRightLen = InputBox("Укажите количество удаляемых символов справа." & Chr(13) & Chr(10) & "Если количество удаляемых символов превысит количество символов файла, то файл будет пропущен!", "Переименование...", "0")
  59.   If DelRightLen < 0 and DelRightLen = "" Then DelRightLen = 0
  60. End If
  61.  
  62. Sel = MsgBox("Заменить символы в имени?", 4 + 32, "Переименование...")
  63. If Sel = 6 Then
  64.   strMaskFind = InputBox("Укажите строку поиска!", "Переименование...", "")
  65.   strMaskReplace = InputBox("Укажите строку замены!", "Переименование...", "")
  66. Sel = MsgBox("Учитывать регистр при поиске?", 4 + 32, "Переименование...")
  67. If Sel = 6 Then
  68. TextCompareReplace = 0
  69. else
  70. TextCompareReplace = 1
  71. End If
  72. End If
  73.  
  74. Sel = MsgBox("Добавить строку в имя?", 4 + 32, "Переименование...")
  75. If Sel = 6 Then
  76.   strMaskBefore = InputBox("добавить строку в начале имени!", "Переименование...", "")
  77.   strMaskAfter = InputBox("добавить строку в конце имени!", "Переименование...", "")
  78. End If
  79.  
  80. Sel = MsgBox("Добавить счетчик с увеличением в имя?", 4 + 32, "Переименование...")
  81. If Sel = 6 Then
  82. LeftCount = InputBox("Укажите начальное значение счетчика в начале имени!", "Переименование...", "")
  83.     do until IsNumeric(LeftCount)
  84. msgbox "Неправельное значение счетчика!" & Chr(13) & Chr(10) & "Счетчик указывается целыми числами!", 16, "Переименование..."
  85. LeftCount = InputBox("Укажите начальное значение счетчика в начале имени!", "Переименование...", "")
  86.     loop
  87. if LeftCount <> "" then LeftCount = CLng(LeftCount)
  88.  
  89. RightCount = InputBox("Укажите начальное значение счетчика в конце имени!", "Переименование...", "")
  90.     do until IsNumeric(RightCount)
  91. msgbox "Неправельное значение счетчика!" & Chr(13) & Chr(10) & "Счетчик указывается целыми числами!", 16, "Переименование..."
  92. RightCount = InputBox("Укажите начальное значение счетчика в конце имени!", "Переименование...", "")
  93.     loop
  94. if RightCount <> "" then RightCount = CLng(RightCount)
  95. End If
  96.  
  97. strMaskExten = InputBox("Переименовывать только один тип файлов с введеным расширением?" & Chr(13) & Chr(10) & "Если будет указан тип файлов поиска, то папки не будут учитываться при переименовании!", "Переименование...", ".txt")
  98.  
  99.  
  100.  
  101. Sel = MsgBox("Начать переименование?", 4 + 32, "Переименование...")
  102. If Sel = 6 Then
  103.  
  104. msgbox "Для корректного переименования необходимо выйти из указанной папки до окончания работы программы!", 16, "Переименование..."
  105.  
  106. RenameByMask()   'вызов функции переименовывания
  107.  
  108.   Sel = MsgBox("Отменить переименование файлов?", 4 + 32, "Переименование...")
  109.   If Sel = 6 Then
  110. If objFSO.fileexists("C:\WINDOWS\Temp\RenameByMask.log") Then
  111.   Set LogFile = objFSO.OpenTextFile ("C:\WINDOWS\Temp\RenameByMask.log", 1, True)   'открыть только для чтения, если нет файла - создать
  112.   Do While LogFile.AtEndOfStream <> True
  113. 'Msgbox LogFile.ReadLine
  114.  
  115. FilesArrayCount = FilesArrayCount + 1
  116. ReDim Preserve FilesArray(FilesArrayCount)
  117. FilesArray(FilesArrayCount) = LogFile.ReadLine
  118. 'Msgbox FilesArrayCount
  119. 'Msgbox FilesArray(FilesArrayCount)
  120.  
  121.   Loop
  122.   LogFile.Close
  123. elseIf objFSO.fileexists("C:\RenameByMask.log") Then
  124.   Set LogFile = objFSO.OpenTextFile ("C:\RenameByMask.log", 1, True)
  125. else
  126.   MsgBox "Отмена переименования не выполнена!", 64, "Переименование..."
  127. End If
  128.  
  129. Do Until FilesArrayCount < 0   'перебор значений массива в обратном порядке
  130. 'Msgbox FilesArrayCount
  131. 'Msgbox FilesArray(FilesArrayCount)

  132.     Old_New_Name = Split(FilesArray(FilesArrayCount), "  --->  ", 2)
  133.     if UBound(Old_New_Name) = 1 then
  134.     'Msgbox Old_New_Name(0)
  135.     'Msgbox Old_New_Name(1)
  136. On Error Resume Next
  137.   if objFSO.fileexists(Old_New_Name(1)) then
  138.     Set objOldName = objFSO.GetFile(Old_New_Name(1))
  139.     objOldName.Move Old_New_Name(0)
  140.   elseif objFSO.Folderexists(Old_New_Name(1)) then
  141.     Set objOldName = objFSO.GetFolder(Old_New_Name(1))
  142.     objOldName.Move Old_New_Name(0)
  143.   else
  144.     msgbox "Ошибка отмены переименования!", 16, "Переименование..."
  145.     Sel = MsgBox("Завершить работу программы?", 4 + 32, "Переименование...")
  146.     If Sel = 6 Then WscriptQuit()
  147.   end if
  148.      If Err.Number <> 0 Then
  149.   msgbox "Ошибка отмены переименования!", 16, "Переименование..."
  150.     Sel = MsgBox("Завершить работу программы?", 4 + 32, "Переименование...")
  151.     If Sel = 6 Then WscriptQuit()
  152. End If
  153. On Error goto 0
  154.     end if
  155.  
  156. FilesArrayCount = FilesArrayCount - 1
  157. Loop
  158.   End If
  159.  
  160. End If
  161.  
  162.  
  163.  
  164.  
  165.  
  166. msgbox "Выход...", 64, "Переименование..."
  167.  
  168. WscriptQuit()
  169. sub WscriptQuit()
  170. On Error Resume Next
  171. 'удаление лога...
  172. If objFSO.fileexists("C:\WINDOWS\Temp\RenameByMask.log") Then objFSO.DeleteFile "C:\WINDOWS\Temp\RenameByMask.log", 1
  173. If objFSO.fileexists("C:\RenameByMask.log") Then objFSO.DeleteFile "C:\RenameByMask.log", 1
  174. 'удаление переменных...
  175. set objArgs = nothing
  176. set I = nothing
  177. set objOldName = nothing
  178. set Old_New_Name = nothing
  179. set objFSO = nothing
  180. set LogFile = nothing
  181. set Sel = nothing
  182. set FilesOrFold = nothing
  183. set SubFold = nothing
  184. set strMaskBefore = nothing
  185. set strMaskAfter = nothing
  186. set strMaskFind = nothing
  187. set strMaskReplace = nothing
  188. set LeftCount = nothing
  189. set RightCount = nothing
  190. set strMaskExten = nothing
  191. set strFolderPath = nothing
  192. set TextCompareReplace = nothing
  193. Err.Clear
  194. Wscript.quit   'Выход
  195. End Sub
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219. Sub RenameByMask()
  220.      If objFSO.FolderExists(strFolderPath) Then
  221. If objFSO.FolderExists("C:\WINDOWS\Temp") Then
  222.    Set LogFile = objFSO.OpenTextFile ("C:\WINDOWS\Temp\RenameByMask.log", 2, True)   'открыть для записи, если нет файла - создать
  223. else
  224.    Set LogFile = objFSO.OpenTextFile ("C:\RenameByMask.log", 2, True)   'открыть для записи, если нет файла - создать
  225. end if
  226. LogFile.WriteLine Now & "======================================"
  227. FindContent objFSO.GetFolder(strFolderPath)
  228. LogFile.WriteLine "========================================================="
  229. LogFile.Close
  230.      End If
  231. End Sub
  232.  
  233. Sub FindContent(objFolder)
  234. if FilesOrFold <> 2 then
  235. Dim objFile, objSubFolder, strExten, strFileName, strFileNameExt, strFilePath, strNewFileName
  236.  
  237.      For Each objFile In objFolder.Files
  238. 'objFile.Delete True
  239. 'msgbox objFile
  240.  
  241.  
  242. strFilePath = objFile
  243. if strFilePath <> "" then
  244.     strExten = "." & objFSO.GetExtensionName(strFilePath)   'получить расширение
  245.     if len(strExten) > 3 then
  246.      if strMaskExten = "" or LCase(strExten) = LCase(strMaskExten) then   'искать все типы файлов или только один
  247.     
  248. strFileNameExt = objFSO.GetFileName(strFilePath)   'получить имя с расширением
  249. strFileName = Left(strFileNameExt, len(strFileNameExt) - len(strExten))   'получить имя
  250. strFilePath = Left(strFilePath, len(strFilePath) - len(strFileNameExt))   'получить путь со слешем
  251.  
  252. 'msgbox strExten
  253. 'msgbox strFileName
  254. 'msgbox strFileNameExt
  255. 'msgbox strFilePath
  256. 'Wscript.quit
  257.  
  258. strNewFileName = ""
  259. strNewFileName = strFileName

  260. 'удалить в начале файла
  261. if DelLeftLen > 0 then
  262.     if len(strNewFileName) > CLng(DelLeftLen) then
  263. strNewFileName = Right(strNewFileName, len(strNewFileName) - DelLeftLen)
  264.     end if
  265. end if
  266.  
  267. 'удалить в конце файла
  268. if DelRightLen > 0 then
  269.     if len(strNewFileName) > CLng(DelRightLen) then
  270. strNewFileName = Left(strNewFileName, len(strNewFileName) - DelRightLen)
  271.     end if
  272. end if
  273.  
  274. 'замеить в изначальном имени строку поиска на указанную
  275. if TextCompareReplace = 1 then
  276.     strNewFileName = Replace(strNewFileName, strMaskFind, strMaskReplace, 1, -1, 1)   'без учета регистра
  277. else
  278.     strNewFileName = Replace(strNewFileName, strMaskFind, strMaskReplace, 1, -1, 0)   'с учетом регистра
  279. end if
  280.  
  281. 'удалить пробелы в начале и конце имени
  282. strNewFileName = Trim(strNewFileName)
  283.  
  284. 'применить все изменения в окончательное имя файла
  285. strNewFileName = LeftCount & strMaskBefore & strNewFileName & strMaskAfter & RightCount

  286.  
  287.   if LCase(objFile) <> LCase(strFilePath & strNewFileName & strExten)  then
  288.  
  289. if objFSO.fileexists(strFilePath & strNewFileName & strExten) then
  290. do until objFSO.fileexists(strFilePath & strNewFileName & strExten) = 0
  291.   strNewFileName = inputbox("До: " & objFile & Chr(13) & Chr(10) & "После: " & strFilePath & strNewFileName & strExten & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "Файл с таким именем уже существует!" & Chr(13) & Chr(10) & "Переименовать?", "Переименование...", strNewFileName)  
  292. loop
  293. end if  
  294.  
  295.    if strNewFileName <> "" then
  296.        LogFile.WriteLine objFile & "  --->  " & strFilePath & strNewFileName & strExten
  297.        
  298.   On Error Resume Next
  299.   objFile.name = strNewFileName & strExten
  300.        If Err.Number <> 0 Then
  301.     msgbox "Ошибка переименования файла!", 16, "Переименование..."
  302.       Sel = MsgBox("Завершить работу программы?", 4 + 32, "Переименование...")
  303.       If Sel = 6 Then WscriptQuit()
  304.   end if
  305.   On Error goto 0
  306.  
  307.        if LeftCount <> "" then LeftCount = LeftCount +1
  308.        if RightCount <> "" then RightCount = RightCount +1
  309.         else
  310.        'msgbox "Файл пропущен: " & objFile
  311.        LogFile.WriteLine "Файл пропущен: " & objFile
  312.    end if
  313.   end if
  314.  
  315.      end if
  316.     else
  317. 'msgbox "Ошибка получения имени файла, файл пропущен! " & objFile & " (возможно файл без расширения...)"
  318. LogFile.WriteLine "Ошибка получения имени файла, файл пропущен! " & objFile & " (возможно файл без расширения...)"
  319.     end if
  320.  
  321. end if
  322.      Next
  323. end if
  324.      For Each objSubFolder In objFolder.SubFolders
  325.  
  326. if SubFold = 1 then
  327.   FindContent objSubFolder
  328. end if
  329.  
  330. if FilesOrFold <> 1 then
  331. Dim LenFolderPath, strFolderPath, strFolderName, strNewFolderName
  332.           'objSubFolder.Delete True
  333.   'msgbox objSubFolder
  334.  
  335.   strFolderPath = objSubFolder
  336.   if strFolderPath <> "" then
  337.    if strMaskExten = "" then   'если не указано разрешение файлов
  338. LenFolderPath =  InStrRev(objSubFolder, "\")
  339. strFolderPath = Left(objSubFolder,LenFolderPath)
  340. strFolderName = right(objSubFolder, len(objSubFolder) - LenFolderPath)   'получить имя
  341. 'msgbox LenFolderPath
  342. 'msgbox strFolderPath
  343. 'msgbox strFolderName
  344. 'Wscript.quit
  345.  
  346. strNewFolderName = ""
  347. strNewFolderName = strFolderName


  348. 'удалить в начале папки
  349. if DelLeftLen > 0 then
  350.     if len(strNewFolderName) > CLng(DelLeftLen) then
  351. strNewFolderName = Right(strNewFolderName, len(strNewFolderName) - DelLeftLen)
  352.     end if
  353. end if
  354.  
  355. 'удалить в конце папки
  356. if DelRightLen > 0 then
  357.     if len(strNewFolderName) > CLng(DelRightLen) then
  358. strNewFolderName = Left(strNewFolderName, len(strNewFolderName) - DelRightLen)
  359.     end if
  360. end if
  361.  
  362. 'заменить в изначальном имени строку поиска на указанную
  363. if TextCompareReplace = 1 then
  364.     strNewFolderName = Replace(strNewFolderName, strMaskFind, strMaskReplace, 1, -1, 1)   'без учета регистра
  365. else
  366.     strNewFolderName = Replace(strNewFolderName, strMaskFind, strMaskReplace, 1, -1, 0)   'с учетом регистра
  367. end if
  368.  
  369. 'удалить пробелы в начале и конце имени
  370. strNewFileName = Trim(strNewFileName)
  371.  
  372. 'применить все изменения в окончательное имя папки
  373. strNewFolderName = LeftCount & strMaskBefore & strNewFolderName & strMaskAfter & RightCount

  374.  
  375.     if LCase(objSubFolder) <> LCase(strFolderPath & strNewFolderName)  then   'если изменилось имя
  376.  
  377. if objFSO.FolderExists(strFolderPath & strNewFolderName) then
  378. do until objFSO.FolderExists(strFolderPath & strNewFolderName) = 0
  379.   strNewFolderName = inputbox("До: " & objSubFolder & Chr(13) & Chr(10) & "После: " & strFolderPath & strNewFolderName & Chr(13) & Chr(10) & Chr(13) & Chr(10) & "Папка с таким именем уже существует!" & Chr(13) & Chr(10) & "Переименовать?", "Переименование...", strNewFolderName)  
  380. loop
  381. end if  
  382.  
  383.    if strNewFolderName <> "" then
  384.        LogFile.WriteLine objSubFolder & "  --->  " & strFolderPath & strNewFolderName
  385.        
  386.   On Error Resume Next
  387.   objSubFolder.name = strNewFolderName
  388.        If Err.Number <> 0 Then
  389.     msgbox "Ошибка переименования папки!", 16, "Переименование..."
  390.       Sel = MsgBox("Завершить работу программы?", 4 + 32, "Переименование...")
  391.       If Sel = 6 Then WscriptQuit()
  392.   end if
  393.   On Error goto 0
  394.  
  395.        if LeftCount <> "" then LeftCount = LeftCount +1
  396.        if RightCount <> "" then RightCount = RightCount +1
  397.         else
  398.        'msgbox "Папка пропущена: " & objSubFolder
  399.        LogFile.WriteLine "Папка пропущена: " & objSubFolder
  400.    end if
  401.  
  402.     end if
  403.  
  404.  
  405.    end if
  406.   else
  407.     'msgbox "Ошибка получения имени папки, папка пропущена! " & objSubFolder
  408.     LogFile.WriteLine "Ошибка получения имени папки, папка пропущена! " & objSubFolder
  409.   end if
  410. end if
  411.      Next
  412. End Sub

Ответить

Номер ответа: 2
Автор ответа:
 Alexander



Вопросов: 2
Ответов: 11
 Профиль | | #2 Добавлено: 02.03.10 11:16
есть файлы в папке
qwe7676-2001-1.pdf и qwe7676-2001-2.pdf 1 и 2 в конце имени указывают на часть документа
qwe787-2001-1.pdf и qwe787-2001-2.pdf

необходимо сравнивать имена файлов и при совпадении символов между qwe...-2001-*.pdf запускать скажем команду asd.exe (1-й файл) (2-й файл), затем их удалять и так далее со всеми файлами в папке.

Пытаюсь приспособить регулярные выражения пока-что не очень,
Просьба подсобите?????

Ответить

Номер ответа: 3
Автор ответа:
 Шпион



ICQ: 250543104 

Вопросов: 13
Ответов: 118
 Профиль | | #3 Добавлено: 14.07.10 23:51
если есть в имени файла определенная хрень
(instr(1,strSearchFrom,strSearchString)=1)
, т.е. строка поиска найдена в начале строки поиска, тогда слить два дока
objShell.Run strMycmd,1,True

Ответить

Номер ответа: 4
Автор ответа:
 Шпион



ICQ: 250543104 

Вопросов: 13
Ответов: 118
 Профиль | | #4 Добавлено: 14.07.10 23:57
а если надо по порядку - загоняй имена файлов в массив и сортируй пузырьком (как самое простое)
или еще хлеще - сначала пузырек, потом отбор по критерию.
зы. 10 > 1 поэтому у тебя файлы adcdef-10 abcdef-11 будут раньше чем abcdef-1, вроде

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам