Ошибка индекса вне диапазона в сценарии VBScript

7063
Peter Mortensen

Я пытаюсь переместить всю папку пользователя в Windows Vista в несистемный раздел. Чтобы сделать это с минимальными трудностями, я следую инструкциям, приведенным в блоге Бена, в частности, VBScript, который он предоставляет.

Однако выполнение сценария выдает ошибку, которую я не могу устранить самостоятельно. Вот код VBScript, за которым следует текстовый файл, из которого он работает, и, наконец, мое сообщение об ошибке. Как мне исправить проблему?

Код VBScript:

'# Perform dir /a c:\users > c:\dir.txt '# place this script file in c:\ too '# double click to run it '# run resulting script.bat from recovery mode repprefix = " Directory of..." ' Modify to your language sourcedrive = "C:\" targetdrive = "D:\" altsourcedrive = "C:\" 'leave same as target drive unless otherwise indicated alttargetdrive = "E:\" 'leave same as target drive unless otherwise indicated  inname = "dir.txt" outname = "script.bat" userroot = "Users"  set fso = CreateObject("Scripting.FileSystemObject")  ' construct batch commands for saving rights, then link, the recreating rights Function GetCommand(curroot, line, typ, keyword) ' first need to get source and target pos = Instr(line, keyword) + Len(keyword)  tuple = Trim(Mid(line, pos)) arr = Split(tuple, "[")  oldtarget = Replace(arr(1), "]", "") oldlink = curroot & "\" & Trim(arr(0))  ' need to determine if we are pointing back to old disk newlink = replace(oldlink, sourcedrive, targetdrive) if(Instr(oldtarget, sourcedrive & userroot)) then newtarget = Replace(oldtarget, sourcedrive, targetdrive) else newtarget = oldtarget ' still pointing to original target end if  ' comment out = "echo " & newlink & " --- " & newtarget & vbCrLf ' save permissions out = out & "icacls """ & replace(oldlink, sourcedrive, altsourcedrive) & """ /L /save " & altsourcedrive & "permissions.txt" & vbCrLf  ' create link newlink = replace(newlink, targetdrive, alttargetdrive) if typ = "junction" then out = out & "mklink /j """ & newlink & """ """ & newtarget & """" & vbCrLf else ' typ = "symlink" out = out & "mklink /d """ & newlink & """ """ & newtarget & """" & vbCrLf end if  'set hidden attribute out = out & "attrib +h """ & newlink & """ /L" & vbCrLf  ' apply permissions shortlink = Left(newlink, InstrRev(newlink, "\") - 1) 'icacls works strangely - non-orthogonal for restore out = out & "icacls """ & shortlink & """ /L /restore " & altsourcedrive & "permissions.txt" & vbCrLf  GetCommand = out & vbCrLf End Function  Sub WriteToFile(file, text) ForWriting = 2 Create = true set outfile = fso.OpenTextFile(file, ForWriting, Create) Call outfile.Write(text) Call outfile.Close() End Sub  outtext = "ROBOCOPY " & altsourcedrive & userroot & " " & alttargetdrive & userroot & " /E /COPYALL /XJ" & vbCrLf & vbCrLf  set intext = fso.OpenTextFile(inname) while not intext.AtEndOfStream line = intext.ReadLine() if Instr(line, repprefix) then curroot = Replace(line, repprefix, "") elseif Instr(line, juncname) then outtext = outtext & GetCommand(curroot, line, "junction", juncname) elseif Instr(line, linkname) then outtext = outtext & GetCommand(curroot, line, "symlink", linkname) end if  Wend  outtext = outtext & "icacls " & altsourcedrive & userroot & " /L /save " & altsourcedrive & "permissions.txt" & vbCrLf outtext = outtext & "ren " & altsourcedrive & userroot & " _" & userroot & vbCrLf outtext = outtext & "mklink /j " & altsourcedrive & userroot & " " & targetdrive & userroot & vbCrLf outtext = outtext & "icacls " & altsourcedrive & " /L /restore " & altsourcedrive & "permissions.txt"  Call intext.Close()  Call WriteToFile(outname, outtext)  MsgBox("Done writing to " & outname) 

dir.txt:

Объем в приводе ACER Серийный номер тома 08D7-C0CC  Каталог c: \ users  16.07.2009 12:29 . 16.07.2009 12:29 .. 02.11.2006 09:02 Все пользователи [C: \ ProgramData] 02.11.2006 09:02 По умолчанию 02.11.2006 09:02 Пользователь по умолчанию [C: \ Users \ Default] 21.08.2008 08:37 174 desktop.ini 02.11.2006 08:50 Public 19.07.2009 20:54 Стив 1 файл (ов) 174 байтов 7 Dir (s) 5 679 947 776 байт свободно 

Сообщение об ошибке:

Windows Script Host

Сценарий: C: \ user location.vbs Строка: 25 символов: 2 Ошибка: нижний индекс вне диапазона: «[число: 1]» Код: 800A0009 Источник: ошибка времени выполнения Microsoft VBScript

(В сценарии VBScript, который я использую в своей системе, я считаю, что строка 25 соответствует строке, начинающейся с oldtarget = Replace(arr(1), "]", "").

0
на самом деле это потребует много времени только на чтение :) Bogdan_Ch 14 лет назад 1
Если бы вы могли поместить код в блок «Образец кода», вам было бы намного легче помочь. Кроме того, это, вероятно, лучше подходит для stackoverflow.com chills42 14 лет назад 3
Джефф, спасибо за редактирование, я не мог понять, как собрать весь код в один блок кода. 14 лет назад 0

2 ответа на вопрос

1
Michael Todd

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

pos = Instr(line, keyword) + Len(keyword) 

фактически добавляется к замечанию в предыдущей строке (все, что находится после 'в этой строке). Это может привести к тому, что проблема, с которой вы столкнулись в этой позиции, никогда не будет установлена ​​должным образом, и поэтому ничего не будет скопировано в arr.

Просто перейдите строка за строкой в ​​вашем сценарии на компьютере и сравните его с версией, которую вы скопировали в блоге Бена. Каждая строка, которая находится на своей собственной строке, ДОЛЖНА также быть на своей собственной строке в вашем файле скрипта.

РЕДАКТИРОВАТЬ: Что касается того, что означает сообщение об ошибке, похоже, что oldTarget пытается захватить строку между двумя скобками. Ошибка возникает из-за того, что в строке недостаточно текста, чтобы начать с позиции массива 1 (и он начинается с нуля, что означает, что он на самом деле пытается получить второй символ в строке), т. Е. Это не более чем односимвольная строка что невозможно, учитывая, что даже пустая строка 'element' будет иметь два символа (открывающая и закрывающая скобки). Итак, вам нужно выяснить, почему вы не получаете правильную строку в этот момент кода, чтобы решить эту проблему.

0
Nilpo

Во-первых, это очень плохо написанный сценарий. Я бы порекомендовал переписать его правильно. Это какая-то хакерская работа, и вот откуда берутся большинство ваших проблем.

В частности, ваша проблема возникает во второй строке здесь:

arr = Split(tuple, "[")  oldtarget = Replace(arr(1), "]", "") 

Это означает, что разделение в строке ранее не возвращало массив, это означает, что [не было найдено в кортеже и, следовательно, arr(1)находится вне диапазона. Попробуйте проверить, что arr является массивом, прежде чем пытаться получить к нему доступ.

Похожие вопросы