Почему этот скрипт сошел с ума?

#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