none
Script para verificar a existência de arquivo RRS feed

  • Pergunta

  • Boa tarde, pessoal.

    Uso aqui na empresa o Ammy pra fazer acesso remoto e nós deixamos o executável na área de trabalho de todas as estações mas os nomes variam de estação pra estação. Decidi renomear todos para um padrão pra facilitar no contato com o usuário e usar isso como desculpa pra aprender um pouco de VB Script.

    Até aqui eu consegui fazer o script rodar e fazer o que eu quero, mas queria tentar isso de forma diferente e minha falta de conhecimento sobre a linguagem me fez travar em um ponto.

    Segue o código que já fiz e o que queria modificar:

    On Error Resume Next
    Dim WsShell
    Dim objDesktop
    Dim objFolder
    Dim objFSO
    Dim colFiles
    Dim objFile
    Dim objExec
    Dim Result
    'Dim objName
    
    ' Pega o caminho da pasta desktop
    Set WsShell = CreateObject("Wscript.Shell")
    objDesktop = WsShell.SpecialFolders("Desktop")
    
    
    ' Instancia a variavel como FileSystemObject 
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(objDesktop)
    
    ' Retorna uma coleção com todos os arquivos contidos na pasta
    Set colFiles = objFolder.Files
    
    ' Verifica se o arquivo existe e renomeia conforme condição ou copia para o desktop caso não exista
    For Each objFile In colFiles
    	If objFSO.FileExists("AA_v3.1.exe") Then
    		objFSO.MoveFile objDesktop & "\AA_v3.1.exe", objDesktop & "\Acesso Remoto.exe"
    	ElseIf objFSO.FileExists("Ammyy.exe") Then
    		objFSO.MoveFile objDesktop & "\Ammyy.exe", objDesktop & "\Acesso Remoto.exe"
    	ElseIf objFSO.FileExists("AA_v3.exe") Then
    		objFSO.MoveFile objDesktop & "\AA_v3.exe", objDesktop & "\Acesso Remoto.exe"
    	ElseIf objFSO.FileExists("Ammy.exe") Then
    		objFSO.MoveFile objDesktop & "\Ammy.exe", objDesktop & "\Acesso Remoto.exe"
    	Else
    		objFSO.CopyFile "\\192.168.1.13\Transfer\Acesso Remoto.exe", objDesktop & "\Acesso Remoto.exe"
    	End If
    Next 

    Ele verifica se existe o arquivo com esses nomes e renomeia caso encontre ou copia caso não exista, mas queria uma forma de não depender de nomes e pensei em utilizar o CRC, achei um programa que retorna o CRC do arquivo (http://www34.brinkster.com/dizzyk/crc32.asp). Tem um com linha de comando que eu pensei que poderia usar no código, mas procurei pela net uma forma de usar comandos externos no VBS e não achei, procurei também uma forma de executar um batch através do VBS passando o endereço do arquivo como parametro para o batch executar, mas tudo o que achei era muito confuso.

    Se eu conseguisse pegar o CRC do arquivo bastava verificar se existe aquele CRC e caso existisse, mudaria o nome, se não ele copiaria um novo.

    Alguém poderia me dar uma luz?
    Não é algo que preciso pro trabalho, é pura vontade de aprender e acho que o que me falta aqui é um conhecimento maior da linguagem.

    Agradeço a atenção.



    terça-feira, 28 de maio de 2013 20:14

Respostas

  • Opa aproveitando o ensejo, uso esta msm script e tenho erro ao copiar o arquivo nesta linha:

    objFSO.CopyFile "\\192.168.1.13\Transfer\Acesso Remoto.exe", objDesktop & "\Acesso Remoto.exe"

    Como demora a conectar em:

    \\192.168.1.13\

    O script dá erro dizendo que não achou o arquivo

    Acesso Remoto.exe

    Como posso usar um while verificando se consegue conexão e que o arquivo está lá, para só depois de conferir copiar o arquivo?

    Outra:

    Tem como usar o Powershell como script de logon?

    Obrigado.


    Warley

    Boa noite Warley.
    Você não vai conseguir usar esse script sem alterar algumas coisas. Tanto o endereço do arquivo como o nome são os que uso aqui na empresa, o endereço é um IP da rede interna, então você terá que trocar isso.
    Mas eu acabei fazendo uma versão melhorada desse script, só que em C#, vou deixar o código aqui se você quiser usar, só vai precisar criar uma nova aplicação Console no Visual Studio e substituir o código pelo que eu vou disponibilizar abaixo, alterando é claro alguns campos. Eu usei o Visual C# Express pra criar essa aplicação, então pode ser que numa versão anterior (2008 pra baixo) ele não compile, qualquer dúvida me manda um email (anderson_bass@hotmail.com).

    Segue o código:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.IO; using System.Diagnostics; using System.Security.Cryptography; namespace rename_ammy { class Program { static void Main(string[] args) {

    //copie o código apenas dessa linha para baixo e mantenha a parte acima, apenas adicionando os "using" que você não tiver const string hash = "f9cde592fcd907fb00807124df17c2f1"; //não use esse hash, substitua pelo que vai usar DirectoryInfo dir = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); DirectoryInfo[] dirs = dir.GetDirectories(); FileInfo[] files = dir.GetFiles(); string caminho = dir.FullName + @"\Acesso Remoto.exe"; //o nome do arquivo também deve ser substituido pelo que você usa foreach (FileInfo file in files) { string nome = file.FullName; string h = GetMD5HashFromFile(nome); if (h == hash) { if (nome != caminho) { File.Copy (nome, caminho); File.Delete (nome); break; } } } if (!File.Exists(dir.FullName + @"\Acesso Remoto.exe")) //mesma coisa, substitua o nome do arquivo { File.Copy(@"\\192.168.1.13\Transfer\Acesso Remoto.exe", caminho); //substitua o caminho completo do arquivo } } public static string GetMD5HashFromFile(string filename) { using (var md5 = new MD5CryptoServiceProvider()) { var buffer = md5.ComputeHash(File.ReadAllBytes(filename)); var sb = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { sb.Append(buffer[i].ToString("x2")); } return sb.ToString(); } } } }




    quinta-feira, 30 de maio de 2013 00:07

Todas as Respostas

  • uma sugestão seria gpo, mas como quer aprender mesmo hehe, já pensou em powershell?

    Ajudei? Marca como útil.
    Visite meu blog: HowToServer

    Quer conversar ou pedir ajuda sobre Powershell?
    entre no grupo no Facebook Powershell Brasil
    Quer Aprender Powershell?

    Quer conversar ou pedir ajuda sobre servidores em geral?
    Entre no grupo no Facebook Administradores IT

    Meus Artigos na TechNet Wiki

    terça-feira, 28 de maio de 2013 21:37
  • Opa aproveitando o ensejo, uso esta msm script e tenho erro ao copiar o arquivo nesta linha:

    objFSO.CopyFile "\\192.168.1.13\Transfer\Acesso Remoto.exe", objDesktop & "\Acesso Remoto.exe"

    Como demora a conectar em:

    \\192.168.1.13\

    O script dá erro dizendo que não achou o arquivo

    Acesso Remoto.exe

    Como posso usar um while verificando se consegue conexão e que o arquivo está lá, para só depois de conferir copiar o arquivo?

    Outra:

    Tem como usar o Powershell como script de logon?

    Obrigado.


    Warley

    quarta-feira, 29 de maio de 2013 12:23
  • Opa aproveitando o ensejo, uso esta msm script e tenho erro ao copiar o arquivo nesta linha:

    objFSO.CopyFile "\\192.168.1.13\Transfer\Acesso Remoto.exe", objDesktop & "\Acesso Remoto.exe"

    Como demora a conectar em:

    \\192.168.1.13\

    O script dá erro dizendo que não achou o arquivo

    Acesso Remoto.exe

    Como posso usar um while verificando se consegue conexão e que o arquivo está lá, para só depois de conferir copiar o arquivo?

    Outra:

    Tem como usar o Powershell como script de logon?

    Obrigado.


    Warley

    Boa noite Warley.
    Você não vai conseguir usar esse script sem alterar algumas coisas. Tanto o endereço do arquivo como o nome são os que uso aqui na empresa, o endereço é um IP da rede interna, então você terá que trocar isso.
    Mas eu acabei fazendo uma versão melhorada desse script, só que em C#, vou deixar o código aqui se você quiser usar, só vai precisar criar uma nova aplicação Console no Visual Studio e substituir o código pelo que eu vou disponibilizar abaixo, alterando é claro alguns campos. Eu usei o Visual C# Express pra criar essa aplicação, então pode ser que numa versão anterior (2008 pra baixo) ele não compile, qualquer dúvida me manda um email (anderson_bass@hotmail.com).

    Segue o código:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.IO; using System.Diagnostics; using System.Security.Cryptography; namespace rename_ammy { class Program { static void Main(string[] args) {

    //copie o código apenas dessa linha para baixo e mantenha a parte acima, apenas adicionando os "using" que você não tiver const string hash = "f9cde592fcd907fb00807124df17c2f1"; //não use esse hash, substitua pelo que vai usar DirectoryInfo dir = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop)); DirectoryInfo[] dirs = dir.GetDirectories(); FileInfo[] files = dir.GetFiles(); string caminho = dir.FullName + @"\Acesso Remoto.exe"; //o nome do arquivo também deve ser substituido pelo que você usa foreach (FileInfo file in files) { string nome = file.FullName; string h = GetMD5HashFromFile(nome); if (h == hash) { if (nome != caminho) { File.Copy (nome, caminho); File.Delete (nome); break; } } } if (!File.Exists(dir.FullName + @"\Acesso Remoto.exe")) //mesma coisa, substitua o nome do arquivo { File.Copy(@"\\192.168.1.13\Transfer\Acesso Remoto.exe", caminho); //substitua o caminho completo do arquivo } } public static string GetMD5HashFromFile(string filename) { using (var md5 = new MD5CryptoServiceProvider()) { var buffer = md5.ComputeHash(File.ReadAllBytes(filename)); var sb = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { sb.Append(buffer[i].ToString("x2")); } return sb.ToString(); } } } }




    quinta-feira, 30 de maio de 2013 00:07
  • Caro Anderson,

    Colocar um atalho na area de trabalho apontando para o exe do arquivo remoto não seria mais viável?

    ________________________________________________________________________

    Set WshShell = CreateObject("WScript.Shell")
    strDesktopPath = WshShell.SpecialFolders("Desktop")

    Set objShortcutLnk = WshShell.CreateShortcut(strDesktopPath & "\BRMAClient 3.3.lnk")
    objShortcutLnk.TargetPath = "\\srvapp\publico\brma\client3.3\BRMAClient.exe"
    objShortcutLnk.Hotkey = "CTRL+SHIFT+B"
    objShortcutLnk.IconLocation = "\\srvapp\publico\brma\client3.3\BRMAClient.exe,0"
    objShortcutLnk.WorkingDirectory = "\\srvapp\publico\brma\client3.3\"
    objShortcutLnk.Description = "Cliente BRMA"
    objShortcutLnk.WindowStyle = 1

    objShortcutLnk.Save

    ________________________________________________________________________

    Eis a solução que uso.


    The mind is the Universe Portal

    quinta-feira, 30 de maio de 2013 15:49
  • Caro Anderson,

    Colocar um atalho na area de trabalho apontando para o exe do arquivo remoto não seria mais viável?


    É que o arquivo já existia em todas as máquinas,  eu só queria renomear. Mas de qualquer forma o objetivo era unicamente aprender, só usei isso como exemplo.

    O tópico já pode ser fechado, eu já fiz uma pequena aplicação em C#. Obrigado pela atenção e resposta de todos.
    sábado, 1 de junho de 2013 00:44
  • Anderson acho que não precisava criar um console aplication em C# para isso, mas tudo bem.

    Eu tb sei que que meu IP é diferente e o nome do arquivo é diferente, mas coloquei o código o seu script  foi como exemplo, sei que depois tenho que trocar os o ip e o caminho, etc...

    Usei o seu como exemplo pois ele é idêntico ao que uso aqui,  e mostrei onde no meu script dá errado, que é justamente ao transferir o arquivo.

    Se alguém poder ajudar em colocar um while aí no vbs ou um script powershell, agradeço.

    Até..


    Warley

    segunda-feira, 3 de junho de 2013 15:48
  • Anderson acho que não precisava criar um console aplication em C# para isso, mas tudo bem.

    Eu tb sei que que meu IP é diferente e o nome do arquivo é diferente, mas coloquei o código o seu script  foi como exemplo, sei que depois tenho que trocar os o ip e o caminho, etc...

    Usei o seu como exemplo pois ele é idêntico ao que uso aqui,  e mostrei onde no meu script dá errado, que é justamente ao transferir o arquivo.

    Se alguém poder ajudar em colocar um while aí no vbs ou um script powershell, agradeço.

    Até..


    Warley

    Agora entendi.

    Eu não tenho uma resposta a sua pergunta, até porque aqui ele não deu problemas com relação a não encontrar o arquivo.

    Como eu disse, minha intenção era apenas aprender, e como eu fiz um curso de C# recentemente e quero seguir na área, resolvi mudar o código pro C#. O .exe que compilei ficou bem leve, 6kb e usando start /B no batch ele executou sem abrir console nenhum, ficou bem transparente. O único problema que tive foi numa máquina que informou que precisaria de uma versão superior do .net instalado, e isso é realmente um problema.

    Verificar se tem conexão eu não sei, mas talvez o FileExists ajude no seu caso:
    http://msdn.microsoft.com/en-us/library/x23stk5t%28v=vs.84%29.aspx

    sexta-feira, 7 de junho de 2013 00:51