#vbscript
#vbscript
Вопрос:
О, чувак!
Это VBScript, который должен был изменять все файлы в каталоге, которые называются как
с 1229_002510 по 2010-12-29_002510
В итоге произошло то, что скрипт так и не был завершен.
После одного прохода по именам файлов он ПРОДОЛЖАЛ РАБОТАТЬ и добавлял 2010 — НЕСКОЛЬКО РАЗ, пока я не убил скрипт.
Ошибка появляется, только если вы запускаете скрипт через CScript в cmd.
(Запустите с помощью: cscript «filename.vbs»)
Итак, теперь у меня есть папка, полная файлов, таких как 2010-20-10-20-10-20-10-20-10-20-10-20-10-20-10-20-10-20-10-20-10-11-26_023335
Поймите, я новичок в VBScript.
Кажется, что скрипт работает в тестовом режиме (просто печатает имена файлов), но как только вы запускаете его для работы с реальными файлами, он демонстрирует описанное поведение.
' shell script that changes dates like
' 1219_005530 to 2010-12-19_005530
' create a root filesystemobject:
Dim ofso
Set ofso = CreateObject( "Scripting.FileSystemObject" )
' create a folder object USING that root filesystem object
Dim folder
' that's the current directory
Set folder = ofso.GetFolder( "." )
' now, visit each file in the folder
Dim fileo
For Each fileo In folder.Files
dim originalName
originalName = CStr( fileo.Name )
' cut first 2 chars, prepend 2010-, re-add first 2 chars "-"
dim monthNumber
monthNumber = Mid( originalName, 1, 2 )
' don't change the source file!
If Right( originalName, 3 ) = "vbs" Then
WSH.echo( "Not changing " amp; originalName )
Else
dim newName
newName = "2010-" amp; monthNumber amp; "-" amp; Mid( originalName, 3 )
WSH.echo( originalName )
WSH.echo( newName amp; " < CHANGED TO" )
' ONLY ENABLE THIS LINE ONCE DEBUGGING COMPLETE
'fileo.Name = newName
End If
Next
' PAUSE BEFORE EXIT
Комментарии:
1. Поскольку вы используете FileSystemObject:
ofso.GetExtensionName(originalName)
будет делать то же самое, что иRight( originalName, 3 )
, и будет более читаемым — и работает для расширений, состоящих из <> 3 символов.
Ответ №1:
Я не знаю, что вы делаете, но я скопировал / вставил ваш скрипт, и он работает именно так, как вы задумали. (Windows 7)
Редактировать: попробуйте установить максимальное количество раз, когда скрипт может выходить из цикла. Это все исправит. Возможно, скрипт видит переименованные файлы как новые файлы, создавая таким образом бесконечный цикл.
Комментарии:
1. Ах, но вы пробовали это на реальных файлах? Загвоздка в том, что ошибка появляется только после того, как вы попробуете ее на реальных файлах
2. я сделал 🙂 всего 1 файл. IMG_20101231_212421.jpg для 2010-IM-G_20101231_212421.jpg
3. Ах, подождите. Это произойдет, только если вы запустите это через
CScript
4. ОК. В папке, в которой я его опробовал, был 191 объект общим объемом 4,62 ГБ.
Ответ №2:
Вы можете выполнить эту задачу в 2 шага. Сначала просканируйте каталог на наличие файлов и соберите их имена в массив, а затем запустите через этот массив и переименуйте файлы. Это должно быть более надежным.
И подумайте о том, чтобы переключиться на JScript. VBS просто уродлив по сравнению с ним.
Комментарии:
1. Да, но немного удивительно, что WSH ведет себя так странно
2. Я думаю, это потому, что переименование файла сбрасывает итератор папок или добавляет к нему переименованный файл, поэтому он никогда не заканчивается. Это также может зависеть от версии Windows и WSH