2009-07-28 5 views
1

J'essaie de déplacer l'intégralité de mon dossier Utilisateur dans Vista vers une partition non-système. Pour le faire avec un minimum de tracas, je suis les instructions fournies au Ben's Blog, en particulier le script vbs qu'il fournit. Cependant, l'exécution du script génère une erreur que je ne peux pas résoudre moi-même. Voici le code vbs suivi du fichier texte qu'il appelle, et enfin mon message d'erreur. Quelqu'un peut-il m'aider à corriger le problème? (Je ne sais vraiment pas grand-chose à propos de VBS, donc s'il vous plaît écrire aussi simple que possible.)Indice d'erreur hors plage dans le script vbs

code VBS:

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

Message d'erreur:

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 

Répondre

0

Le problème est à ces lignes:

arr = Split(tuple, "[") 

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

Je suppose que arr (1) donne l'erreur, car arr n'a qu'une seule entrée - et puisque les tableaux sont basés sur zéro dans VBS, cette entrée doit être accédés comme arr (0). Hummm ... s'il n'y a qu'une seule entrée, alors on n'a probablement pas trouvé "["]. Le code doit probablement vérifier cela (en testant si UBound(arr) > 1). Qu'est-ce que cela signifie dans un contexte plus large - c'est-à-dire pourquoi il n'y a pas de ["Je ne peux pas dire."


EDIT: OK, j'ai regardé sur le blog dont vous avez parlé, et exactement le même problème a été signalé. L'auteur du blog a répondu:

Un couple de pointeurs: regardez dans le fichier txt sortie par la commande dir. Sur mon système , les cibles des liens symboliques sont indiquées entre crochets []. Apparemment dans votre cas, il n'y a pas any - dans tous les cas c'est une hypothèse qui expliquerait pourquoi le script ne peut pas analyser les cibles de liaison.

... ce qui confirme à peu près ma théorie. Je vous suggère de faire comme il le suggère et de regarder le fichier txt pour voir si un autre personnage est utilisé. Notez que ce n'est pas vraiment un problème avec le script en soi - c'est juste que le script attend des entrées qu'il n'obtient pas.

+0

Comment puis-je corriger le script? –

0

@Gary, je suis le même qui a signalé le problème sur ce blog. J'ai posté le fichier txt ici sous le code VBS. Mon fichier txt contient également les cibles de jonction symbolique entre crochets. Y a-t-il autre chose qui me manque?

Questions connexes