Как использовать VBScript для переименования файлов в каталоге, добавляя имя папки ко всем файлам в папке? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть большое количество файлов изображений, охватывающих почти два десятилетия, когда субъект идентифицируется по имени каталога, и большинство фотографий имеют общее имя, однако некоторые из них имеют более конкретные имена.Я пишу сценарий для добавления имени каталога к имени файла для всех файлов в определенном каталоге.Ну, я пытаюсь по крайней мере.Прошло несколько лет с тех пор, как я использовал VBScript, и кажется, что я ОЧЕНЬ ржавый.Я сталкиваюсь с проблемами с синтаксическим форматом.

Когда у меня есть Option Explicit (в строке 6), он выдает ошибку строки 6, Char 1, Error: Expected Statement, Code: 800A0400 (В моем общем коде этобудет строка 7 из-за добавленной строки начала файла)

Если я закомментирую это, я получу ошибку в операторах импорта вместо строки 3, символ 1, ошибка: несоответствие типов: «Импорт»,Код: 800A000D (В моем общем коде это будет строка 4 из-за добавленной строки Начало файла)

Я потратил несколько часов на поиск возможных причин, но безрезультатно, и поэтому я перехожу кСообщество за помощь в получении правильного форматирования этого сценария.

Любые комментарии о лучшем подходе сценария для выполнения этой задачи также будут оценены.

Я собираюсь поместить в целомкод для файла, потому что я не знаю, какая его часть будет соответствующим аспектом.

В коде в настоящее время он настроен на создание только окна сообщения для электронной почты.ач файл в качестве меры измерения, чтобы убедиться, что переменные имеют значения, которые я думаю, они имеют.Закомментированный код для переименования файла является действительно предназначенной целью.Однако я застрял на правильном форматировании первой части файла.В общем, я выполняю это из командной строки, используя: cscript.exe c: \ MyTools \ addDir2FileName.vbs

Я запустил его через проводник Windows, чтобы получить более конкретные коды ошибок с номерами строк.

Я добавил комментарии «Начало файла» и «Конец файла» просто для ясности в этом посте.

' ####### Beginning of File
' Renames all files in a directory prepending the directory name to the file name

Imports System
Imports System.IO

Option Explicit

Dim WshShell, strOldFull, strNewFull, strFullPath, strCurDir
Dim strCurrentName, strNewName, strMessage, dir, fileObj, fs, fo

' Get the current directory
Set WshShell = CreateObject("WScript.Shell")
strFullPath = WshShell.CurrentDirectory

'Get folder properties to get just the name without path
Set fs=Server.CreateObject("Scripting.FileSystemObject")
Set fo=fs.GetFolder(strFullPath)

strCurDir = fo.Name

'Iterate through the directory
set dir = DirectoryInfo(strFullPath)

For Each fileObj In dir.GetFiles()
  strCurrentName = fileObj.Name
  strNewName = strCurDir & " - " & strCurrentName

  ' For testing purposes to make sure everything is as expected
  ' Creates a message box for each file instead of actually renaming it
  strMessage = "Old Name: " & strCurrentName & chr(13) & chr(10) & "New Name: " & strNewName 
  MsgBox strMessage

  ' Renaming the file
  ' strOldFull =  fs.BuildPath(CurrentDirectory, strCurrentName)
  ' strNewFull = fs.BuildPath(CurrentDirectory, strNewName)
  ' My.Computer.FileSystem.RenameFile(strOldFull, strNewFull)

Next

WshShell = Nothing
fo = Nothing
fs = Nothing

' ### End of File

Предполагается, что файл "C: \ Pictures \ Trip to Nice \"DCM001.jpg "будет переименован в" C: \ Pictures \ Trip to Nice \ Trip to Nice - DCM001.jpg ", и все файлы в каталоге, в котором запускается скрипт, будут аналогично переименованы.Ну, если быть более точным, вывод в текущем отформатированном виде выдаст окно с сообщением «Старое имя: C: \ Pictures \ Trip to Nice \ DCM001.jpg Новое имя: C: \ Pictures \ Trip to Nice \ Trip to Nice- DCM001.jpg "и что для всех файлов в каталоге будет создано окно сообщения.Да, я буду запускать версию окна сообщений только в тестовой директории с 3 файлами.Я не хотел бы получать 50000 окон сообщений, смеется.

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

Спасибо за ваше время и любую помощь, которую может предоставить каждый.Я впервые отправляю сообщения в сообщество, но давно оценил предоставленные ответы.Обычно я могу найти ответы на свои вопросы, но на этом я в тупике ...

1 Ответ

0 голосов
/ 08 мая 2019

Хорошо, после множества проб и ошибок я нашел способ выполнить задачу, при котором я не использовал Систему, и таким образом избежал ошибки, которую я получал раньше. Я подумал опубликовать окончательный сценарий на тот случай, если кому-то будет интересно.

' Renames all files in a directory prepending the directory name to the file name
Option Explicit

Dim WshShell, strOldFull, strFullPath, strCurDir, lastSlash
Dim strCurrentName, strNewName, strMessage, fileObj, fileSpec, fs, fo, ff

' Get the current directory
Set WshShell = CreateObject("WScript.Shell")
strFullPath = WshShell.CurrentDirectory

'Get folder object 
Set fs = CreateObject("Scripting.FileSystemObject")
Set fo = fs.GetFolder(strFullPath)
set ff = fo.Files

'Get just the folder name
lastSlash = inStrRev(strFullPath, "\")
strCurDir = right(strFullPath, len(strFullPath) - lastSlash )


'Iterate through the directory
For Each fileObj in ff
  strCurrentName = fileObj.Name
  strNewName = strCurDir & " - " & strCurrentName

  ' For testing purposes to make sure everything is as expected
  ' Creates a message box for each file instead of actually renaming it
  ' strMessage = "Old Name: " & strCurrentName & chr(13) & chr(10) & "New Name: " & strNewName 
  ' MsgBox strMessage

  ' Renaming the file
  strOldFull =  strFullPath & "\" & strCurrentName
  set fileSpec = fs.GetFile(strOldFull)
  fileSpec.Name = strNewName

Next
...