none
Mudar formato para ler txt. RRS feed

  • Pergunta

  • Galera
    Boa noite

    Necessito de uma ajuda, tenho um script que realiza varias funções, entre elas ele realiza um select por usuario, e realiza a copia de dois executaveis para a estação, e cria um atalho.
    Porem a forma que ele esta montada esta me gerando um problema e eu gostaria de mudar o contexto mais não estou conseguindo.
    Gostaria que ele realizada a função de copia, por usuario mais que ele colhesse esta informação de um arquivo txt,com a seguinte configuração por exemplo:

    wilson
    program1.exe
    program2.exe
    Carlos
    program3.exe
    program4.exe

    E assim por diante, ou seja ele realizaria o levantamento para saber quem logou, e buscaria esta informação no txt, e localizando ele pegaria os dois arquivos exe que ele deve colher para continuar o processo.

    segue a parte do codigo que realiza tal função.

    Obrigado tche.

    Option Explicit

    Dim DomainName, Username, oNetwork, oGroupList, objShell, Servidor, strAppPath, objDesktop, objLink
    Dim strOrigem, strCaminho, strFolder, origem, destino, objFSO, objFolder, strAppPath1, strAppPath2
    Dim strAppPath3, strAppPath4

    Set oNetwork = createObject("wscript.network")
    Set objShell = CreateObject("WScript.Shell")

    'On Error Resume Next

      Username = ""
      While Username = ""
        Err.Clear: Username = oNetwork.username
        If Err Then WScript.Sleep 10
      Wend
    On Error Goto 0

    Set oGroupList = CreateObject("Scripting.Dictionary")
     
      Const OverwriteExisting = TRUE

    '***********************
    'CASE POR USUARIOS
    '***********************

    Select case (Username)

    '****************************************************************************************************
    case "wilson"

                    Set objFSO = CreateObject("Scripting.FileSystemObject")
                    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CopyFile "\\servidor\compartilhamento\progam1.exe" , "c:\programas", OverwriteExisting
    objFSO.CopyFile "\\servidor\compartilhamento\progam2.exe" , "c:\programas", OverwriteExisting
     
    strAppPath1 = "c:\programas\progam1.exe"

      objDesktop = objShell.SpecialFolders("Desktop")
    Set objLink = objShell.CreateShortcut(objDesktop & "\progam1.lnk")

    objLink.TargetPath = strAppPath1
    objLink.WindowStyle = 3
    objLink.Save

    strAppPath2 = "c:\programas\progam2.exe"

      objDesktop = objShell.SpecialFolders("Desktop")
    Set objLink = objShell.CreateShortcut(objDesktop & "\progam2.lnk")

    objLink.TargetPath = strAppPath2
    objLink.WindowStyle = 3
    objLink.Save

    '****************************************************************************************************
    case "carlos"

                    Set objFSO = CreateObject("Scripting.FileSystemObject")
                    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CopyFile "\\servidor\compartilhamento\progam3.exe" , "c:\programas", OverwriteExisting
    objFSO.CopyFile "\\servidor\compartilhamento\progam4.exe" , "c:\programas", OverwriteExisting
     
    strAppPath3 = "c:\programas\progam3.exe"

      objDesktop = objShell.SpecialFolders("Desktop")
    Set objLink = objShell.CreateShortcut(objDesktop & "\progam3.lnk")

    objLink.TargetPath = strAppPath3
    objLink.WindowStyle = 3
    objLink.Save

    strAppPath4 = "c:\programas\progam4.exe"

      objDesktop = objShell.SpecialFolders("Desktop")
    Set objLink = objShell.CreateShortcut(objDesktop & "\progam4.lnk")

    objLink.TargetPath = strAppPath4
    objLink.WindowStyle = 3
    objLink.Save

    '****************************************************************************************************

    End select

    quinta-feira, 8 de setembro de 2011 22:40

Respostas

  • Teste este código (o arquivo texto no formato original, usuário e programas em linhas diferentes)

     

     
    Dim Username, oNetwork, objShell, strAppPath, objDesktop, objLink, arq, objFolder, Linhas
    Dim texto, palavra, strOrigem, strCaminho, strFolder, origem, destino, FSO, objFSO, strid, strLine 
    
    Set oNetwork = createObject("wscript.network") 
    Set objShell = CreateObject("WScript.Shell")
      
    Username = "" 
    While Username = "" 
         Err.Clear: Username = oNetwork.username 
         If Err Then WScript.Sleep 10 
    Wend 
    On Error Goto 0
     
    Const OverwriteExisting = True
     
    strCaminho = "c:\arquivo.txt"
    strid = oNetwork.username
     
    
    ' ------- parte que modifiquei ----------------
    
    Set FSO = createobject("scripting.filesystemobject")
    Set objTextFile = FSO.opentextfile(strCaminho,1)
     
    'Ler linha por linha
    Do Until objTextFile.AtEndOfStream
        'A primeira linha tem que ser o nome do primeiro usuário
    	strNextLine = objTextFile.Readline
        
    	if strNextLine = strid then
    		'Se a linha for igual ao nome do usuário então pega
    		'os programas nas duas proximas linhas
    		p1 = objTextFile.Readline
    		p2 = objTextFile.Readline
    	
    	else
    		'se não for o usuário atual então le as duas
    		'proximas linhas e segue para o proximo usuario do arquivo
    		strNextLine = objTextFile.Readline
    		strNextLine = objTextFile.Readline
    	end if
    	
    Loop
    
    '-------------------------------------
    
    'neste ponto vc tem as variaveis p1 e p2 com os programas do usuario
    
    'Substitua o SELECT CASE por um IF para cada programa, aqui fiz p/ programa 3 e 1
    
    
     
    IF P1 = "Program3" or P2 = "Program3" then
     
    		Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    		objFSO.CopyFile "\\servidor\compartilhamento\progam3.exe" , "c:\programas", OverwriteExisting
        
    		strAppPath = "c:\programas\program3.exe"
      
    		objDesktop = objShell.SpecialFolders("Desktop")
    		Set objLink = objShell.CreateShortcut(objDesktop & "\program3.lnk")
      
    		objLink.TargetPath = strAppPath
    		objLink.WindowStyle = 3
    		objLink.Save
     
    end if
    
    
     
    IF P1 = "Program1" or P2 = "Program1" then
     
    		Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    		objFSO.CopyFile "\\servidor\compartilhamento\progam1.exe" , "c:\programas", OverwriteExisting
        
    		strAppPath = "c:\programas\program1.exe"
      
    		objDesktop = objShell.SpecialFolders("Desktop")
    		Set objLink = objShell.CreateShortcut(objDesktop & "\program1.lnk")
      
    		objLink.TargetPath = strAppPath
    		objLink.WindowStyle = 3
    		objLink.Save
     
    end if
    
    
    

     



    • Editado Fábio JrModerator segunda-feira, 12 de setembro de 2011 16:36 Erro em sintaxe do script
    • Marcado como Resposta Marcelo TI segunda-feira, 12 de setembro de 2011 19:48
    segunda-feira, 12 de setembro de 2011 16:01
    Moderador

Todas as Respostas

  • Ba galera, alguma ideia.

    Eu estava tentado assim mais não rola tche.

    obrigado.

    OptionExplicit

    Dim Username, oNetwork, objShell, strAppPath, objDesktop, objLink, arq, objFolder, Linhas
    Dim texto, palavra, strOrigem, strCaminho, strFolder, origem, destino, FSO, objFSO, strid, strLine, 

    Set oNetwork = createObject("wscript.network") 
    Set objShell = CreateObject("WScript.Shell")

      Username = ""
      While Username = ""
        Err.Clear: Username = oNetwork.username
        IfErrThen WScript.Sleep10
      Wend
    OnErrorGoto0

       Const OverwriteExisting = True

    strCaminho = "c:\arquivo.txt"
    strid = oNetwork.username

    Set FSO = createobject("scripting.filesystemobject")
    Set arq = FSO.opentextfile(strCaminho,1)
    texto = arq.readall

    arq.close

    Linhas = Split(texto, " ")

    ForEach strLinein Linhas
    IfInStr(strLine, strid) Then

    EndIf
    Next

    wscript.echo strid

    SelectCase (strid)

    '****************************************************************************************************
    Case"strid"

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFSO = CreateObject("Scripting.FileSystemObject")

        objFSO.CopyFile "\\servidor\compartilhamento\progam3.exe" , "c:\programas", OverwriteExisting
       
        strAppPath = "c:\programas\program3.exe"

        objDesktop = objShell.SpecialFolders("Desktop")
        Set objLink = objShell.CreateShortcut(objDesktop & "\program3.lnk")

    objLink.TargetPath = strAppPath
    objLink.WindowStyle = 3
    objLink.Save

    EndSelect

    sexta-feira, 9 de setembro de 2011 14:51
  • Marcelo,

    Porque você quer separar o script em script + arquivo texto? É uma pessoa que faz o script e outra que decide que programa vai pra quem? São quantos usuários no total que ficaria dentro do arquivo texto?

    Seguem algumas sugestões:

    1) Mantenha a lógica e a informação dentro do script

    Utilize o Select Case (como vc já utiliza no primeiro script) , se vários usuários copiam os mesmos executaveis crie um case com todos estes usuários:

    Select case oNetwork.username

        Case "fabio", "marcelo", "usuariox"

           Copia programa1 e dois

        Case "usuarioy" : copia programa2

    end select

     

    ou então faça um case para cada programa

    'Case Program1

    Select case oNet.username

        Case fabio, marcelo: copia program1

    end select

    'case program 2

    Select case oNet.username

        Case fabio, usuariox: copia program2

    end select

     

    2) Se não tiver outra alternativa e tem que ter os dados separados

    Ao invés do formato (usuario em uma linha e programas nas linhas seguintes) use este (uma linha por usuario com dados separados por ";"):

    fabiojr;program1;program2

    marcelo;program3;program4

    Leia linha por linha (ao invés do readall que vc está utilizando)

    Utilize a função SPLIT(strLinha,";") assim ele quebraria a linha em um array

    arrDados(0)=fabiojr

    arrDados(1)=program1

    arrDados(2)=program2

     

    Você pode testar o arrDados(0)=nomedousuário, se não for o usuário atual ele segue para a leitura da proxima linha.

    (sempre são dois programas por usuário? vou considerar que sim)

    Depois vem  for com select case

    for i=1 to 2 'substitua este dois pelo máximo de programas que um usuário pode copiar)

    Case arrDados(i)

        case "Program1": copia program1

        case "program2":copia program2

    end if

    next

     

    Caso quise tentar uma destas alternativa modifique seu código, se enfrentar dificuldade poste o novo código aqui.


    Fábio de Paula Junior
    sábado, 10 de setembro de 2011 13:28
    Moderador
  • Fabio

    Obrigado pela força tche mais necessito que ele colha as informaçoes em um txt mesmo para evitar alteraçao no script e somente no texto para que fique mais simples para o gestor, a fonte no txt pode ser linha a linha separado por ; ou outra coisa ou linha sobre linha como coloquei, vc tem alguma ideia de como fazer.

    No arquivo texto devo ter em media 3000 contas de usuarios, e é o gestor que decide que programa usar e pra complicar cada programa tem um novo diferente tb, e para nao ficar mudando o script toda vez que vem um usuario novo ou um programa novo, a saida seria o scritp buscar as 3 ou mais variaveis no txt sendo sempre um usuario para 2 ou mais programas, assim ele alterar na sua base e entregar a informaçao para o usuario, e eu assim eu passo para o gestor o controle.

    Tente a a sua segunda ideia mais nao consegui fazer funcionar, e acho que o caminho deve ser mais complicado Fabio pois eu necessito que ele veja quem esta logado, ai ele tem que buscar no txt a conta logada e assim pegar o valor dos nomes dos programas e popular no script apos o caminho de rede do programa para fazer a copia, caso eu tenha que entrar com alguma informaçao que esteja no txt de forma manual como o case program1, a alteraçao do script vai continuar.

    obrigado tche.

    • Editado Marcelo TI sábado, 10 de setembro de 2011 22:03
    sábado, 10 de setembro de 2011 21:17
  • Alguma ideia Fabio ou Galera.
    domingo, 11 de setembro de 2011 22:25
  • Marcelo,

    Ler um arquivo com 9000 linhas (3000 usuarios + 2 programas x 3000) toda vez que fizer logon acho inviavel. (dá pra fazer mas....)

    Tenho uma idéia: Porque vc não faz por grupo.

    Crie um grupo por programa, exemplo: GR_Programa1, e coloque dentro dele todos usuários que precisam dele, você pode delegar para o gestor poder modificar os membros do grupo e no script é só vc verificar.

    if ingroup("GR_Program1) then

        copia programas, copia atalhos, etc...

    end if

     

    Veja quanta vantagem, vc pode ter controle dos programas por gestores, o gestorx pode dar permissão para programa1 mas não pode para o programa2, o gestory pode para o programa2 mas não pode para o programa1....

    No link abaixo tem uma função que verifica se o usuário está dentro de determinado grupo.

    http://www.tek-tips.com/viewthread.cfm?qid=1409676&page=9


    Fábio de Paula Junior
    segunda-feira, 12 de setembro de 2011 12:06
    Moderador
  • Fabio

    Realmente seria o melhor e ate teria um controle mais ja tentei por este caminho e nao rola eles estão muito rigido quanto ao processo, por este motivo eu teria que partir para o caminho de levantar quem logou na maquina e buscar as 3 informações em um texto para montar as variaveis e assim entregar a copia e o atalho, como poderia montar ?

    obrigado tche.

    segunda-feira, 12 de setembro de 2011 13:08
  • Teste este código (o arquivo texto no formato original, usuário e programas em linhas diferentes)

     

     
    Dim Username, oNetwork, objShell, strAppPath, objDesktop, objLink, arq, objFolder, Linhas
    Dim texto, palavra, strOrigem, strCaminho, strFolder, origem, destino, FSO, objFSO, strid, strLine 
    
    Set oNetwork = createObject("wscript.network") 
    Set objShell = CreateObject("WScript.Shell")
      
    Username = "" 
    While Username = "" 
         Err.Clear: Username = oNetwork.username 
         If Err Then WScript.Sleep 10 
    Wend 
    On Error Goto 0
     
    Const OverwriteExisting = True
     
    strCaminho = "c:\arquivo.txt"
    strid = oNetwork.username
     
    
    ' ------- parte que modifiquei ----------------
    
    Set FSO = createobject("scripting.filesystemobject")
    Set objTextFile = FSO.opentextfile(strCaminho,1)
     
    'Ler linha por linha
    Do Until objTextFile.AtEndOfStream
        'A primeira linha tem que ser o nome do primeiro usuário
    	strNextLine = objTextFile.Readline
        
    	if strNextLine = strid then
    		'Se a linha for igual ao nome do usuário então pega
    		'os programas nas duas proximas linhas
    		p1 = objTextFile.Readline
    		p2 = objTextFile.Readline
    	
    	else
    		'se não for o usuário atual então le as duas
    		'proximas linhas e segue para o proximo usuario do arquivo
    		strNextLine = objTextFile.Readline
    		strNextLine = objTextFile.Readline
    	end if
    	
    Loop
    
    '-------------------------------------
    
    'neste ponto vc tem as variaveis p1 e p2 com os programas do usuario
    
    'Substitua o SELECT CASE por um IF para cada programa, aqui fiz p/ programa 3 e 1
    
    
     
    IF P1 = "Program3" or P2 = "Program3" then
     
    		Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    		objFSO.CopyFile "\\servidor\compartilhamento\progam3.exe" , "c:\programas", OverwriteExisting
        
    		strAppPath = "c:\programas\program3.exe"
      
    		objDesktop = objShell.SpecialFolders("Desktop")
    		Set objLink = objShell.CreateShortcut(objDesktop & "\program3.lnk")
      
    		objLink.TargetPath = strAppPath
    		objLink.WindowStyle = 3
    		objLink.Save
     
    end if
    
    
     
    IF P1 = "Program1" or P2 = "Program1" then
     
    		Set objFSO = CreateObject("Scripting.FileSystemObject")
     
    		objFSO.CopyFile "\\servidor\compartilhamento\progam1.exe" , "c:\programas", OverwriteExisting
        
    		strAppPath = "c:\programas\program1.exe"
      
    		objDesktop = objShell.SpecialFolders("Desktop")
    		Set objLink = objShell.CreateShortcut(objDesktop & "\program1.lnk")
      
    		objLink.TargetPath = strAppPath
    		objLink.WindowStyle = 3
    		objLink.Save
     
    end if
    
    
    

     



    • Editado Fábio JrModerator segunda-feira, 12 de setembro de 2011 16:36 Erro em sintaxe do script
    • Marcado como Resposta Marcelo TI segunda-feira, 12 de setembro de 2011 19:48
    segunda-feira, 12 de setembro de 2011 16:01
    Moderador
  • Fabio

    No IF P1 or P2, é possivel colocar uma variavel tipo strp1 e strp2, para que ele tb tire esta informação da leitura do texto, e tb entre no copyfile para ficar \\servidor\compartilhamento\& strp1 e tb no strAppPath = "c:\programas\& strp1" ?

    segunda-feira, 12 de setembro de 2011 17:26
  • Fabio

    Resolvido com a alteração:

    IF P1 = p1 or P2 = p2 then e com "& p1 no processo de copia.

     

    obrigado tche.

    segunda-feira, 12 de setembro de 2011 19:49