2009-07-28 1 views
1

Ich versuche, meinen gesamten Benutzerordner in Vista auf eine Nicht-Systempartition zu verschieben. Um dies mit minimalem Aufwand zu tun, befolge ich die Anweisungen unter Ben's Blog, insbesondere das vbs-Skript, das er zur Verfügung stellt. Die Ausführung des Skripts wirft jedoch einen Fehler auf, den ich selbst nicht lösen kann. Hier ist der VBS-Code gefolgt von der Textdatei, die er anruft, und schließlich meine Fehlermeldung. Kann mir jemand helfen, das Problem zu beheben? (Ich weiß wirklich nicht viel über VBS, so wenden Sie sich bitte so einfach wie möglich schreiben.)Index außerhalb des Bereichs Fehler in VBS-Skript

VBS-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:

Volume in drive C is ACER 
Volume Serial Number is 08D7-C0CC 

Directory of c:\users 

07/16/2009 12:29 PM <DIR 
07/16/2009 12:29 PM <DIR> .. 
11/02/2006 09:02 AM <SYMLINKD> All Users [C:\ProgramData] 
11/02/2006 09:02 AM <DIR> Default 
11/02/2006 09:02 AM <JUNCTION> Default User [C:\Users\Default] 
08/21/2008 08:37 AM 174 desktop.ini 
11/02/2006 08:50 AM <DIR> Public 
07/19/2009 08:54 PM <DIR> Steve 
1 File(s) 174 bytes 
7 Dir(s) 5,679,947,776 bytes free 

Fehlermeldung:

Windows Script Host 

Script: C:\userlocationchange.vbs 
Line: 25 
Char: 2 
Error: Subscript out of range: '[number: 1]' 
Code: 800A0009 
Source: Microsoft VBScript runtime error 
an diesen Leitungen 0

Antwort

0

Das Problem ist:

arr = Split(tuple, "[") 

oldtarget = Replace(arr(1), "]", "") 

Ich nehme an, arr (1) den Fehler geben, weil arr nur einen Eintrag hat - und da Arrays in VBS Null-Basis werden, sollte dieser Eintrag zugegriffen werden als arr (0).

Hmmm ... wenn es nur einen Eintrag gibt, dann wurde vermutlich kein "[" gefunden. Wahrscheinlich muss der Code darauf prüfen (durch Testen, ob UBound(arr) > 1).

Was bedeutet das in einem weiteren Kontext - d. H. Warum gibt es kein "[" kann ich nicht sagen.


EDIT: OK, habe ich einen Blick auf den Blog, den Sie genannt, und genau das gleiche Problem berichtet wurde. Der Blog-Autor antwortete:

Ein paar Zeiger: schauen Sie in der txt Dateiausgabe durch den Befehl dir. In meinem System werden die Ziele der Symlinks in eckigen Klammern [] angezeigt. Offenbar in Ihrem Fall gibt es keine any - in jedem Fall ist das eine Hypothese , die erklären würde, warum das Skript die Linkziele nicht analysieren kann.

... was ziemlich meine Theorie bestätigt. Ich schlage vor, Sie tun, was er vorschlägt, und werfen einen Blick auf die TXT-Datei, um zu sehen, ob ein anderes Zeichen verwendet wird.

Beachten Sie, dass dies nicht wirklich ein Problem mit dem Skript an sich ist - es ist nur, dass das Skript einige Eingaben erwartet, die es nicht bekommt.

+0

Wie kann ich das Skript korrigieren? –

0

@Gary, ich bin derselbe, der das Problem auf diesem Blog gemeldet hat. Ich habe die TXT-Datei hier unter dem VBS-Code veröffentlicht. Meine TXT-Datei hat auch die Symlink-Junction-Ziele in eckigen Klammern. Gibt es noch etwas, das mir fehlt?