Erro subscript out of range no script VBScript

0

Estou tentando mover toda a pasta Usuário no Windows Vista para uma partição que não seja do sistema. Para fazer isso com um mínimo de incômodo, estou seguindo as instruções fornecidas no Blog do Ben , especificamente o VBScript que ele fornece.

No entanto, a execução do script gera um erro que não posso resolver sozinho. Aqui está o código VBScript seguido pelo arquivo de texto que ele trabalha e, finalmente, minha mensagem de erro. Como corrijo o problema?

Código 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:

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

Mensagem de erro:

Windows Script Host

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

(No script VBScript que estou usando no meu sistema, acredito que 'Linha 25' corresponde à linha que começa com oldtarget = Replace(arr(1), "]", "") .

    
por Peter Mortensen 27.07.2009 / 19:11

2 respostas

1

Certifique-se de que quando você copia o script de outra página, as quebras de linha são copiadas como deveriam. Por exemplo, no script que você imprimiu acima, aparece a linha que começa

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

é realmente acrescentado à observação na linha anterior (tudo depois do 'nessa linha). Isso poderia causar o problema que você está tendo nessa posição nunca seria definido de forma adequada e, portanto, nada seria copiado para arr.

Basta ir linha por linha no script que você tem no seu computador e compará-lo com a versão que você copiou no Blog do Ben. Cada linha que está em sua própria linha deve estar em sua própria linha em seu arquivo de script também.

EDIT: Quanto ao que a mensagem de erro significa, parece que o oldTarget está tentando pegar uma string entre dois colchetes. O erro ocorre porque não há texto suficiente na string para iniciar na posição 1 do array (e isso é baseado em zero, o que significa que ele está realmente tentando obter o segundo caractere na string), ou seja, é no máximo uma string de um caractere o que não é possível, considerando que até mesmo uma string em branco "elemento" teria dois caracteres (o colchete aberto e o colchete de fechamento). Então, você precisa descobrir por que não está obtendo uma string válida nesse ponto do código para corrigir esse problema.

    
por 27.07.2009 / 19:46
0

Primeiro, este é um roteiro muito mal escrito. Eu recomendaria reescrevê-lo corretamente. É uma espécie de trabalho de hacker e é daí que vem a maioria dos problemas.

Especificamente, seu problema ocorre na segunda linha aqui:

arr = Split(tuple, "[")

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

Isso significa que a divisão na linha anterior não retornou uma matriz, significando que o [não foi encontrado na tupla e, portanto, arr(1) está fora do intervalo. Tente verificar se arr é um array antes de tentar acessá-lo.

    
por 03.04.2012 / 05:25

Tags