Subskriptionsfehler außerhalb des Bereichs in VBScript-Skript

7398
Peter Mortensen

Ich versuche, meinen gesamten Benutzerordner in Windows Vista auf eine Nicht-Systempartition zu verschieben. Um dies mit einem Minimum an Aufwand zu tun, befolge ich die Anweisungen in Ben's Blog, insbesondere das von ihm bereitgestellte VBScript .

Die Ausführung des Skripts löst jedoch einen Fehler aus, den ich nicht selbst beheben kann. Hier ist der VBScript-Code, gefolgt von der Textdatei, aus der er arbeitet, und schließlich meine Fehlermeldung. Wie kann ich das Problem beheben?

VBScript-Code:

'# 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:

Das Laufwerk in Laufwerk C ist ACER Die Volume-Seriennummer lautet 08D7-C0CC  Verzeichnis der c: \ Benutzer  16.07.2009, 12:29 Uhr . 16.07.2009 12:29 PM .. 02.11.2006 09:02 Alle Benutzer [C: \ ProgramData] 11/02/2006 09:02 AM Default 11/02/2006 09:02 AM Standardbenutzer [C: \ Users \ Default] 08/21/2008 08:37 AM 174 desktop.ini 11/02/2006 08:50 Öffentlich 19.07.2009 20:54 Steve 1 Datei (en) 174 Bytes 7 Dir (s) 5.679.947.776 Bytes frei 

Fehlermeldung:

Windows Script Host

Skript: C: \ user location.vbs Zeile: 25 Zeichen: 2 Fehler: Subscript außerhalb des gültigen Bereichs: '[number: 1]' Code: 800A0009 Quelle: Microsoft VBScript-Laufzeitfehler

(In dem VBScript-Skript, das ich auf meinem System verwende, glaube ich, dass 'Zeile 25' der Zeile entspricht, die mit beginnt oldtarget = Replace(arr(1), "]", "").

0
wirklich, das wird viel Zeit erfordern, nur um zu lesen :) Bogdan_Ch vor 14 Jahren 1
Wenn Sie den Code in einen "Code Sample" -Block einfügen könnten, wäre es viel einfacher, Ihnen zu helfen. Außerdem passt dies wahrscheinlich besser zu stackoverflow.com chills42 vor 14 Jahren 3
Jeff, danke für die Bearbeitung. Ich konnte nicht herausfinden, wie ich den gesamten Code in einen Codeblock bringen kann. vor 14 Jahren 0

2 Antworten auf die Frage

1
Michael Todd

Stellen Sie sicher, dass beim Kopieren des Skripts von einer anderen Seite die Zeilenumbrüche wie gewünscht kopiert werden. In dem oben gedruckten Skript wird beispielsweise die Zeile angezeigt, die beginnt

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

wird tatsächlich an die Bemerkung in der vorherigen Zeile angehängt (alles hinter dem 'in dieser Zeile). Dies könnte dazu führen, dass das Problem, das Sie in dieser Position haben, niemals richtig eingestellt wird und daher nichts in arr kopiert wird.

Gehen Sie einfach in Ihrem auf Ihrem Computer vorhandenen Skript Zeile für Zeile vor und vergleichen Sie es mit der Version, die Sie in Ben's Blog kopiert haben. Jede Zeile, die sich in ihrer eigenen Zeile befindet, MUSS auch in der eigenen Zeile in Ihrer Skriptdatei stehen.

BEARBEITEN: Was die Fehlermeldung bedeutet, sieht es so aus, als ob oldTarget versucht, eine Zeichenfolge zwischen zwei Klammern zu erfassen. Der Fehler tritt auf, weil in der Zeichenfolge nicht genug Text vorhanden ist, um an der Array-Position 1 zu beginnen (und dies ist nullbasiert, was bedeutet, dass tatsächlich versucht wird, das zweite Zeichen in der Zeichenfolge abzurufen), dh es handelt sich höchstens um eine Zeichenfolge Dies ist nicht möglich, wenn man bedenkt, dass selbst ein leeres Zeichenfolgenelement zwei Zeichen (die offene und die schließende Klammer) enthalten würde. Sie müssen also herausfinden, warum Sie zu diesem Zeitpunkt im Code keine gültige Zeichenfolge erhalten, um dieses Problem zu beheben.

0
Nilpo

Zunächst einmal ist dies ein sehr schlecht geschriebenes Skript. Ich würde empfehlen, es richtig zu schreiben. Es ist eine Art Hackjob, von dem die meisten Probleme ausgehen.

Ihr Problem tritt speziell in der zweiten Zeile hier auf:

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

Dies bedeutet, dass die Aufteilung in der Zeile zuvor kein Array zurückgegeben hat, dh, dass [nicht im Tupel gefunden wurde und daher arr(1)außerhalb des Bereichs liegt. Prüfen Sie, ob arr ein Array ist, bevor Sie versuchen, darauf zuzugreifen.