none
Alguem me ajude com esse Script RRS feed

  • Pergunta

  • através de uns posts anteriorires consegui criar um script para listar e salvar em um arquivo, os arquivos em desuso por mais de um ano, em meu servidor de arquivos .

    Porém eu gostaria que fosse exibido também ao lado do AbsolutePathName a data de modificação do arquivo e nao to conseguindo, e ainda ta aparecendo um erro de arquivo não encontrado no fim da execução do script.

     

    o código é o seguinte.

     

    dim nomePasta, nomeArquivos, dataInicio, dataFim
    dim nomeArquivo, numeroCont, numeroTamanho
    dim nomeDominio, nomeComputador
    dim textoNew
    nomeDominio = ""
    nomeComputador = "."
    nomePasta = ""
    nomeArquivo = ""
    nomeArquivos = ""
    dataAnterior = "20070101"
    numeroCont = 0
    numeroTamanho = 0
    Const ForAppending = 8
    set objetoFSO = CreateObject("Scripting.FileSystemObject")
    systime = Now()
    textoNew = "C:\scripts\arquivos\teste.txt"
    set objetoSF = objetoFSO.OpenTextFile (textoNew, ForAppending, True)
      objetoSF.writeline
      objetoSF.writeline
      Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & nomeComputador & "\root\cimv2")
      objetoSF.writeline
      Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile")
      Set objetoFSO2 = CreateObject("Scripting.FileSystemObject")
      objetoSF.writeline
      for each objFile in colFiles
        Set objetoSF2 = objetoFSO2.GetFile (objFile.name)
     objetoSF.writeline objetoFSO2.GetAbsolutePathName(objetoSF2)
        objetoSF.writeline
        If cdbl(mid(objfile.lastmodified, 1, 8)) >= cdbl(dataAnterior) then
           objetoSF.writeline
          numeroCont = numeroCont +1
          objetoSF.writeline
          numeroTamanho = numeroTamanho + cdbl(round(objfile.filesize/1024))
           objetoSF.writeline
          ArquivoInfo = "Arquivo: " & objfile.name &  vbCrLf & "Tamanho :" & cdbl(round(objfile.filesize/1024)) & "Kb" &  vbCrLf &  vbCrLf
          objetoSf.writeline ArquivoInfo
        end if
      Next
      objetoSF.writeline ":: Imprime totais ::"
      objetoSF.writeline "Arquivos: " & numeroCont
      objetoSF.writeline "Tamanho:  " & numeroTamanho & "Kb"
      objetoSF.writeline ":: Terminou ::"
      objetoSF.close

     

    Se alguém poder da uma revisada nele e ajudar fico Grato.

    quinta-feira, 22 de novembro de 2007 12:58

Respostas

  •  

    Opa,

     

    Achei melhor enxugar um pouco o seu script e mudar algumas linhas:

     

    dim numeroCont,numeroTamanho,nomeComputador,textoNew

    nomeComputador = "."

    numeroCont = 0

    numeroTamanho = 0

    Const ForAppending = 8

    set objetoFSO = CreateObject("Scripting.FileSystemObject")

    systime = Now()

    textoNew = "check.txt"

    set objetoSF = objetoFSO.OpenTextFile (textoNew, ForAppending, True)

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & nomeComputador & "\root\cimv2")

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Drive ='e:' and lastmodified<'20070101'")

    for each objFile in colFiles

    Set objetoSF2 = objetoFSO.GetFile (objFile.name)

    numeroCont = numeroCont +1

    numeroTamanho = numeroTamanho + cdbl(round(objfile.filesize/1024))

    ArquivoInfo = "Arquivo: " & objfile.name & vbCrLf & "Tamanho :" & cdbl(round(objfile.filesize/1024)) & "Kb" & vbCrLf & "Date last modified:" & objetoSF2.DateLastModified & vbCrLf

    objetoSf.writeline ArquivoInfo

    Next

    objetoSF.writeline ":: Imprime totais ::"

    objetoSF.writeline "Arquivos: " & numeroCont

    objetoSF.writeline "Tamanho: " & numeroTamanho & "Kb"

    objetoSF.writeline ":: Terminou ::"

    objetoSF.close

     

    O script está funcionando corretamente agora.

    Não esqueça de alterar a linha :

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Drive ='e:' and lastmodified<'20070101'")

    Com a data target que você quer pegar os arquivos e também o drive !

     

    Espero te ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

     

    sexta-feira, 23 de novembro de 2007 12:43
  • Opa,

     

    Testei aqui em duas máquinas distintas e não tive problema.

     


    Arquivo: e:\system volume information\_restore{01e266c2-86f5-40b2-9145-b4252fff29c3}\rp82\a0025342.exe
    Tamanho :981Kb
    Date last modified:26/9/2005 20:04:50

     

    :: Imprime totais ::
    Arquivos: 4095
    Tamanho: 325471Kb
    :: Terminou ::

    Faz um teste , coloque para fazer o scan em outro drive ou pasta ... pode ser que exista algum arquivo sem permissão ou corrompido , que possa estar fazendo o script ter um comportamento inesperado.

     


    Espero ter ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

    segunda-feira, 26 de novembro de 2007 14:18
  • Opa,

     

    Testei em duas unidades completas e não recebi erro.

     

    Acredito que a opção "on error resume next" , não vá gerar uma inconsistência em seu relatório. 

    O Script pode estar parando em arquivo de swap , corrompido ou sem direito.

     

    Faça um teste com o script e outro com o search do windows ajustando a data nas opções avançadas e depois compare os dois ... você não deverá ter diferença.

     

    Espero ter ajudado.

     

    Não esqueça classificar a mensagem como "respondido", caso tenha ajudado.

     

    Luiz Espínola
    Microsoft MCSE+S , MCT , MCDBA , Comptia Security+  , IBM CSex

    ITIL Foundation ,Novell CNA ,SUN SCSA Solaris 9 ,Citrix CCA

    terça-feira, 27 de novembro de 2007 01:19

Todas as Respostas

  • Amigo,

     

    Segue

     

    dim nomePasta, nomeArquivos, dataInicio, dataFim

    dim nomeArquivo, numeroCont, numeroTamanho

    dim nomeDominio, nomeComputador

    dim textoNew

    nomeDominio = ""

    nomeComputador = "."

    nomePasta = ""

    nomeArquivo = ""

    nomeArquivos = ""

    dataAnterior = "20070101"

    numeroCont = 0

    numeroTamanho = 0

    Const ForAppending = 8

    set objetoFSO = CreateObject("Scripting.FileSystemObject")

    systime = Now()

    textoNew = "teste.txt"

    set objetoSF = objetoFSO.OpenTextFile (textoNew, ForAppending, True)

    Set objetoSF3 = objetoFSO.GetFile("c:\windows\system32\scrrun.dll")

    objetoSF.writeline

    objetoSF.writeline

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & nomeComputador & "\root\cimv2")

    objetoSF.writeline

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Path = '\\temp\\'")

    Set objetoFSO2 = CreateObject("Scripting.FileSystemObject")

    objetoSF.writeline

    for each objFile in colFiles

    Set objetoSF2 = objetoFSO2.GetFile (objFile.name)

    objetoSF.writeline objetoFSO2.GetAbsolutePathName(objetoSF2) &" " & "Date last modified: " & objetoSF3.DateLastModified

    objetoSF.writeline

    If cdbl(mid(objfile.lastmodified, 1, 8)) >= cdbl(dataAnterior) then

    objetoSF.writeline

    numeroCont = numeroCont +1

    objetoSF.writeline

    numeroTamanho = numeroTamanho + cdbl(round(objfile.filesize/1024))

    objetoSF.writeline

    ArquivoInfo = "Arquivo: " & objfile.name & vbCrLf & "Tamanho :" & cdbl(round(objfile.filesize/1024)) & "Kb" & vbCrLf & vbCrLf

    objetoSf.writeline ArquivoInfo

    end if

    Next

    objetoSF.writeline ":: Imprime totais ::"

    objetoSF.writeline "Arquivos: " & numeroCont

    objetoSF.writeline "Tamanho: " & numeroTamanho & "Kb"

    objetoSF.writeline ":: Terminou ::"

    objetoSF.close

     

    Espero te ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

     

    quinta-feira, 22 de novembro de 2007 15:41
  •  

    Ta bacana Luiz tá 10 o script agora.

    só mais uma coisa que tbm ainda nao consegui fazer.

    tipo as informações estão vindo misturadas no arquivo, o AbsolutPath junto com o DateLastModified.. teria como separ as informações em duas colunas ?

    outra coisa que não consegui fazer foi fazer a busca em uma unidade especifica.. quando uso o "where path" ele procura em todas as unidades. isso almenta muito o tempo da minha busca.

     

    Obrigado.

    quinta-feira, 22 de novembro de 2007 20:25
  • Opa,

     

    Veja se ficou melhor ,

     

    dim nomePasta, nomeArquivos, dataInicio, dataFim
    dim nomeArquivo, numeroCont, numeroTamanho
    dim nomeDominio, nomeComputador
    dim textoNew
    nomeDominio = ""
    nomeComputador = "."
    nomePasta = ""
    nomeArquivo = ""
    nomeArquivos = ""
    dataAnterior = "20070101"
    numeroCont = 0
    numeroTamanho = 0
    Const ForAppending = 8
    set objetoFSO = CreateObject("Scripting.FileSystemObject")
    systime = Now()
    textoNew = "teste.txt"
    set objetoSF = objetoFSO.OpenTextFile (textoNew, ForAppending, True)
    Set objetoSF3 = objetoFSO.GetFile("c:\windows\system32\scrrun.dll")
      objetoSF.writeline
      objetoSF.writeline
      Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & nomeComputador & "\root\cimv2")
      objetoSF.writeline
      Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Drive ='c:' And Path = '\\temp\\'")
      Set objetoFSO2 = CreateObject("Scripting.FileSystemObject")
      objetoSF.writeline
      for each objFile in colFiles
        Set objetoSF2 = objetoFSO2.GetFile (objFile.name)
        objetoSF.writeline objetoFSO2.GetAbsolutePathName(objetoSF2)
        objetoSF.writeline "Date last modified:" & objetoSF3.DateLastModified
        objetoSF.writeline
        If cdbl(mid(objfile.lastmodified, 1, 8)) >= cdbl(dataAnterior) then
           objetoSF.writeline
          numeroCont = numeroCont +1
          objetoSF.writeline
          numeroTamanho = numeroTamanho + cdbl(round(objfile.filesize/1024))
           objetoSF.writeline
          ArquivoInfo = "Arquivo: " & objfile.name &  vbCrLf & "Tamanho :" & cdbl(round(objfile.filesize/1024)) & "Kb" &  vbCrLf &  vbCrLf
          objetoSf.writeline ArquivoInfo
        end if
      Next
      objetoSF.writeline ":: Imprime totais ::"
      objetoSF.writeline "Arquivos: " & numeroCont
      objetoSF.writeline "Tamanho:  " & numeroTamanho & "Kb"
      objetoSF.writeline ":: Terminou ::"
      objetoSF.close

     

    Espero te ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

    quinta-feira, 22 de novembro de 2007 20:44
  • Olá Luiz

    Quando eu rodei script ele começou a listar os arquivos, porém eu percibi uma coisa, ele lista os arquivos colocando uma data de modificação identica pra todos os arquivos listados, que não bate com a real data de modificação do arquivo.. tbm nao sei se vc viu que no arquivo que ele gera há momentos que ele deixa umas 3 linhas em branco e depois continua com a listagem dos arquivos, isso várias vezes.

    Depois de um tempo em execução ele retornou um erro:

    linha: 28

    caract: 5

    Erro: chamada de procedimento ou argumento inválido

    código: 800A0005

    eu até atualizei a versão do meu VBS mais deu o mesmo erro.

     

    Se vc poder me ajudar mais essa vez fico grato.

     

    sexta-feira, 23 de novembro de 2007 00:06
  •  

    Opa,

     

    Achei melhor enxugar um pouco o seu script e mudar algumas linhas:

     

    dim numeroCont,numeroTamanho,nomeComputador,textoNew

    nomeComputador = "."

    numeroCont = 0

    numeroTamanho = 0

    Const ForAppending = 8

    set objetoFSO = CreateObject("Scripting.FileSystemObject")

    systime = Now()

    textoNew = "check.txt"

    set objetoSF = objetoFSO.OpenTextFile (textoNew, ForAppending, True)

    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & nomeComputador & "\root\cimv2")

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Drive ='e:' and lastmodified<'20070101'")

    for each objFile in colFiles

    Set objetoSF2 = objetoFSO.GetFile (objFile.name)

    numeroCont = numeroCont +1

    numeroTamanho = numeroTamanho + cdbl(round(objfile.filesize/1024))

    ArquivoInfo = "Arquivo: " & objfile.name & vbCrLf & "Tamanho :" & cdbl(round(objfile.filesize/1024)) & "Kb" & vbCrLf & "Date last modified:" & objetoSF2.DateLastModified & vbCrLf

    objetoSf.writeline ArquivoInfo

    Next

    objetoSF.writeline ":: Imprime totais ::"

    objetoSF.writeline "Arquivos: " & numeroCont

    objetoSF.writeline "Tamanho: " & numeroTamanho & "Kb"

    objetoSF.writeline ":: Terminou ::"

    objetoSF.close

     

    O script está funcionando corretamente agora.

    Não esqueça de alterar a linha :

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile where Drive ='e:' and lastmodified<'20070101'")

    Com a data target que você quer pegar os arquivos e também o drive !

     

    Espero te ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

     

    sexta-feira, 23 de novembro de 2007 12:43
  • Opa ,

     

    Conseguiu utilizar o scriop acima ?

     

    At.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

     

     

    sexta-feira, 23 de novembro de 2007 15:06
  • Bom dia Luiz desculpe a demora pra responder !

    o script ainda continua dando o erro que eu citei no post anterior, só que agora na linha 33

    ele ainda me lista alguns arquivos mas, ele nao conclui sua execução pois nao exibe os totais no fim do arquivo, e com isso nao tenho certeza se ele listou realmente todos os arquivos.

    vc conseguio rodar ele normal ai ? não acho que seja problema com minha maquina, formatei e reinstalei recentemente.

    agradeço sua ajuda.

    segunda-feira, 26 de novembro de 2007 13:23
  • Opa,

     

    Testei aqui em duas máquinas distintas e não tive problema.

     


    Arquivo: e:\system volume information\_restore{01e266c2-86f5-40b2-9145-b4252fff29c3}\rp82\a0025342.exe
    Tamanho :981Kb
    Date last modified:26/9/2005 20:04:50

     

    :: Imprime totais ::
    Arquivos: 4095
    Tamanho: 325471Kb
    :: Terminou ::

    Faz um teste , coloque para fazer o scan em outro drive ou pasta ... pode ser que exista algum arquivo sem permissão ou corrompido , que possa estar fazendo o script ter um comportamento inesperado.

     


    Espero ter ajudado.

    Luiz Espínola
    MCSE+S , MCT , CCA , Security+ , IBM CSex , ITIL , CNA , SCSA
    Não esqueça de dar como "respondido" a mensagem, caso tenha ajudado.

    segunda-feira, 26 de novembro de 2007 14:18
  • quando eu escolho um diretório com a poção "path" o script nao da erro, porém nao lista o conteúdo dos subdiretórios mesmo que eles pertençam a condição de data, somente os arquivos do diretório descrito na variável "path".

    quando eu uso somente o "where drive" ele lista os arquivos de todos os subdiretórios mais da akele erro no decorrer do script.

    eu usei o "on error resume next" ai funfou .. porém nao se isso vai gerar um relatório incorreto no final.

    tenta testar o script em uma unidade em seu pc, sem usar o " and path", pra ver se gera o erro.

    desde já agradeço.

     

    segunda-feira, 26 de novembro de 2007 20:46
  • Opa,

     

    Testei em duas unidades completas e não recebi erro.

     

    Acredito que a opção "on error resume next" , não vá gerar uma inconsistência em seu relatório. 

    O Script pode estar parando em arquivo de swap , corrompido ou sem direito.

     

    Faça um teste com o script e outro com o search do windows ajustando a data nas opções avançadas e depois compare os dois ... você não deverá ter diferença.

     

    Espero ter ajudado.

     

    Não esqueça classificar a mensagem como "respondido", caso tenha ajudado.

     

    Luiz Espínola
    Microsoft MCSE+S , MCT , MCDBA , Comptia Security+  , IBM CSex

    ITIL Foundation ,Novell CNA ,SUN SCSA Solaris 9 ,Citrix CCA

    terça-feira, 27 de novembro de 2007 01:19
  • Boa tarde Luiz ..

    eu fiz a comparação .. deu uma diferença mínima quase insiguinificante... entre as duas consultas, com sua ajuda o script ficou excelente, valeu mesmo ai pela força. so vou lhe incomodar mais uma vez.

    eu fiz um outro scrtipt totalmente baseado no seu mudando somente a critério de busca pra ele localizar periódicamente arquivos de extensões indesejadas em meu servidor de arquivos. exemplo.

     

    Set colFiles = objWMIService.ExecQuery("SELECT * FROM CIM_DataFile WHERE extension = 'mp3' or extension = 'mpg' or extension = 'avi' or extension = 'wav' ")

     

    so que além do path e da data de modificação, como eu faria pra ele por no relatorio também o proprietario do arquivo, ai saberia quem ta pondo bagulhada no servidor.

    se vc poder me dar essa força mais esse vez eu ficaria muito grato.

    quarta-feira, 28 de novembro de 2007 15:30
  • Opa,

     

    O método para conseguir verificar o Owner é diferente do que está sendo utilizado no script que foi passado !

     

    Vou ver como integrar os dois para conseguir o que você precisa !

     

    Assim que conseguir , eu passo para você !

     

    Espero ter ajudado.

     

    Não esqueça classificar a mensagem como "respondido", caso tenha ajudado.

     

    Luiz Espínola
    Microsoft MCSE+S , MCT , MCDBA , Comptia Security+  , IBM CSex

    ITIL Foundation ,Novell CNA ,SUN SCSA Solaris 9 ,Citrix CCA

    quinta-feira, 29 de novembro de 2007 02:43