kkkiler Postado Setembro 13, 2008 Denunciar Share Postado Setembro 13, 2008 A dúvida é a seguinte... tem como executar mais de um comando no dos pelo mesmo shell? Ao invés de ter que fazer outro shell?Para que funcione como um arquivo de lotes(.bat)Desde já agradeço pela atenção. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 13, 2008 Denunciar Share Postado Setembro 13, 2008 tem, você pode criar um arquivo bat via codigo com todos os codigos q você quer, e depois executa-lo com o shell mesmo.se quiser depois tb pode apagar o arquivo.se tiver duvida com o codigo, pode postar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 14, 2008 Autor Denunciar Share Postado Setembro 14, 2008 Vlw mas a intenção é justamente evitar o bat :).Bom, enfim, era só curiosidade.Pelo jeito não tem como mesmo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 14, 2008 Autor Denunciar Share Postado Setembro 14, 2008 Vou aproveitar o tópico pra tirar outra dúvida:Tem jeito de abrir um programa pelo vb utilizando o recurso "Executar como..."(que aparece clicando com o botão direito em um aplicativo).Na verdade, abrir um programa como um outro usuário, pelo vb.Por exemplo, eu coloco lá no vb "shell 'cmd' as administrator 123456", onde os números são a senha do administrador. Então, tem como fazer isso pelo vb?O fato é q eu quero copiar um arquivo logado como um usuário sem privilégio, para uma pasta do usuário com privilégio(administrador).Se isso não der certo, teria um jeito de dar todos os privilégios possíveis a um usuário comum para usar o dos? Sei la, liberar os privilégios administrativos pra o usuário comum usar o dos, sem que ele tenha que clicar com o botão direito, "Executar como...".Tenho certeza que é possível esta última opção :)Aguardando resposta... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 14, 2008 Denunciar Share Postado Setembro 14, 2008 de uma olhada no comando (de linha de comando e não do visual basic) runas, acho q com ele talvez seja possivel fazer o q você quer.mas você já não tinha postado isso antes, e ai eu te passei o link de um componente q permitia editar as permissoes?? ele não resolveu?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 14, 2008 Autor Denunciar Share Postado Setembro 14, 2008 Ok, vamos por partes:1° Eu já testei o runas. Eu testei usando o explorer como administrador.Consegui apenas copiar o arquivo a mão(botão direito), mas não consegui fazê-lo pelo DOS ou pelo vb. Então eu descobri que na verdade eu tinha que executar o dos como administrador. Esse é o problema. Como executar o dos como admin pelo vb? Ou mesmo por um arquivo bat? Além disso, há um momento que é preciso digitar a senha do administrador no prompt de comando, ou seja, eu tentei de tudo, mas esse comando insiste que eu digite a senha na tela preta.Fiz até um bat pra ver se dava certo, mas eu sempre tive que digitar a senha na tela. Eu quero que o programa faça isso, sem eu precisar digitar.2°Quanto ao componente...bem, primeiro vou dizer que eu tinha dado uma pausa nesse assunto e fui fazer outras coisas no vb. Antes de te perguntar pelo primeira vez do assunto, eu já tinha encontrado um compilador que fazia a tarefa, mas como eu sou teimoso B) , eu não quis usar pois so quero fazer pelo vb(o dos não conta). Dae quando eu voltei pro assunto, eu olhei o componente, achei muito complicado xP e fui procurar se tinha outra solução. Achei o runas, que no fim das contas não deu certo.Enfim... acho que vou ter que aprender a usar o componente mesmo, ou eu uso o compilador hahaha(se você souber alguma coisa do uso desse componente, me fala porque eu já dei uma olhada e parece muito complicado) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 15, 2008 Denunciar Share Postado Setembro 15, 2008 e se você escrever a senha por codigo pelo proprio visual basic?? tipo, você da runas no bat, ai ele pede pra digitar a senha. ai você usa a api sendmessage. ou pode usar o componente XComm do Graymalkin. veja esse link aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=9403mas tipo, quando você digita a senha na tela preta, ele aparece asteriscos ou aparece a senha de verdade?? se você precisar esconder a janela, acho q você pode usar a api showwindow.quanto ao componente tb achei complicado heeeheh, mas nem tentei usar, mas se nd der certo, seria uma opcao estuda-lo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 15, 2008 Autor Denunciar Share Postado Setembro 15, 2008 (editado) Eu quero fazer usando essa API aí... o único problema é que eu não entendi como usá-la(sim, eu olhei o post do Graymalkin) e também procurei em outros lugares.Estou com dificuldade. Você não pode me dar um exemplo prático usando essa api para se comunicar com o dos, enviando uma mensagem a ele? Eu não entendi direito como declara a API, nem como envia a mensagemNão quero usar a dll do graymalkin. porque? porque quero aprender a pescar, não quero o peixe pronto :D. Depois que eu aprender, quem sabe eu uso ne heheDaí eu vou fazer assim: Usando o runas, vou abrir outra tela dos como admin, digitando a senha usando API(ou por acaso tem jeito de abrir o dos como admin pelo vb?). Nessa tela irei digitar o comando para copiar o arquivo, também usando API. È isso. Só preciso entender como q usa haha Editado Setembro 15, 2008 por kkkiler Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 16, 2008 Denunciar Share Postado Setembro 16, 2008 (editado) Daí eu vou fazer assim: Usando o runas, vou abrir outra tela dos como admin, digitando a senha usando API(ou por acaso tem jeito de abrir o dos como admin pelo vb?). Nessa tela irei digitar o comando para copiar o arquivo, também usando API. È isso. Só preciso entender como q usa hahabom, eu tinha pensado em você escrever o bat em por codigo visual basic, e abrir o bat com o runas. apesar q você tinha dito q não queria usar bat, entenda q dessa forma você pode fazer "como se o bat não existisse". você escreve o bat, salva temporariamente, roda e apaga. acho q seria mais "bem-feito" do que digitar o texto todo na janela, entende?? principalmente se forem varios comandos.a ideia q eu tinha passado do sendmessage era só para a senha, q ele pediria no runas.a e entenda tb q nunca tentei usar o runas. aqui no meu pc, só existe um usuario, q é o admin (e sem senha) e não da pra testar, então não posso te dar mta ajuda nos procedimentos do runas, mas se ele ta pedindo a senha, dei a ideia de como você digitar a senha.o codigo pode acabar ficando simples ou complicado, dependendo exatamente do q você precisa e como você implementar, mas da pra dexar funcionando legalzinho se for bem trabalhado, alem de q nem vai ser tão complexo quanto parece.bom o graymalkin tinha os exemplos certinhos la. mas pra usar o FindWindow, você faz assim ó:Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long aqui na janela do dos aparece escrtio, no titulo, o texto C:\WINDOWS\system32\cmd.exe então é esse q você vai procurar (note q ele adiciona o nome do bat tb no titulo da janela, ai você tem q ver certinho como vai ficar o nome da janela): hWindow = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe") o FindWindow vai gravar o enderco da janela na variavel hWIndow, entendeu?? assim, sempre q você precisar acessar a janela, você vai passar esse endereco. mas tipo, não use o FindWindow imediatamente depois de abrir a janela, pois normalmente demora-se algumas fracoes de segundo pra ela aparecer. ou você pode o FindWindow num loop ate ele achar a janela (se o hWindow for <> 0 significa q achou), ou habilita um timer e espera 1 ou 2 segundos pra chamar o FindWindow. bom, tem um problema q eu não tinha previsto quando postei antes. se você mandar o sendmessage com o settext com o hwnd da janela ele vai escrever no titulo da janela. normalmente, a gente procura o hwnd de um textbox e escreve nele. mas na janela do dos fica dificil, testei e não consegui de nenhum jeito aqui. não sei se você encontrou alguma forma, mas isso não tem mta importancia, porque existe um modo 1.123.098.034 de vezes mais simples do q o sendmessage: você pode simplesmente por o foco na janela e usar o SendKeys, é bem menos complexo. é só colocar foco na janela do dos e mandar o texto. você pode abrir com o shell com o vbFocus no segundo parametro e se você ajeitar certinho, talvez nem do FindWindow você precise, mas se você tiver problemas com o foco, pode usar a API: Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long se você fizer: SetForegroundWindow hWindow ele coloca a janela em foco (lembre-se q o hWindow você vai achar pelo FindWindow). ai mande o texto tipo: SendKeys "senha" e pra mandar o enter: SendKeys "{ENTER}" o unico problema q você pode ter com o SendKeys é com tempo, tipo, seu programa pode estar executando codigos antes da janela ter recebido o texto, nesse caso você pode ter q adicionar um timer, mas se você conseguir implementar certinho, é pra funcionar sem problemas. ai se precisar esconder a janela, pode usar a api: Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Boolean ShowWindow hWindow, 0 'Isso escondeShowWindow hWindow, 5 'Isso mostra[/code]e pode ficar tranquilo q tanto o SetForegroundWindow quanto o SendKeys funcionam com a janela escondida.bom, não sei quanto a parte do runas, e de digitar a senha, tudo, mas pelo menos pra escrever o texto na janela esta tudo testado aqui e funcionou certinho. então se você tiver problemas nessa parte, muito provavelmente é o esquema do timer, ai qualquer coisa poste ai. e se você conseguir manejar foco certinho, tlavez nem precise das apis.ve se deu pra entender ai e se você consegue fazer, qualquer coisa poste.EDITADO:nos proximos dois dias, vai ser meio dificil de eu entrar no forum, entoa não tenha pressa pras respostas, beleza?? Editado Setembro 16, 2008 por kuroi Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 23, 2008 Autor Denunciar Share Postado Setembro 23, 2008 (editado) Eu estive ausente por um tempinho... agora voltei, e acabei d testar o método do sendkeys. Eu não sei o q estou fazendo d errado, simplesmente não está enviando a mensagem. Veja como eu coloquei:Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Private Sub Command1_Click() hWindow = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe") If hWindow Then SetForegroundWindow hWindow SendKeys "ipconfig" End If End SubBom, devo avisar que eu estou deixando a janela aberta antes de executar o programa. Fiz alguns testes e percebi que está tudo funcionando, com exceção de enviar a mensagem. Na verdade, se eu fico dando muitos cliques, uma vez ou outra aparece a última letra da mensagem.Enfim, estou quase lá xDEditFiz o teste em um bloco de notas, deu o mesmo problema, so q depois q eu clico um tempinho o programa envia a mensagem inteira, dae eu tenho q fica clicando até enviar(depois que envia a primeira vez, se eu quiser enviar outra, eu tenho q continuar clicando até enviar)EditOpaopa.... que coisa estranha. O meu código está funcionando, mas só quando o dos está minimizado na hora que eu executo o programa. Ou seja, se o dos aqui estiver maximizado e eu enviar a mensagem, não vai acontecer nada, mas se o dos estiver minimizado, ele envia normalmente. Que bizarro... nota que isso que eu falei não vale pro "enter". Este funciona tanto se o dos estiver minimizado ou não. Bom, quando o dos está minimizado, ele maximiza na primeira vez q eu clico, dae eu minimizo e não maximiza +.Explica pra mim isso... e a solução, que eu não to entendendo nada. Editado Setembro 23, 2008 por kkkiler Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 23, 2008 Denunciar Share Postado Setembro 23, 2008 provavelmente é isso q eu falei:o unico problema q você pode ter com o SendKeys é com tempo, tipo, seu programa pode estar executando codigos antes da janela ter recebido o texto, nesse caso você pode ter q adicionar um timer, mas se você conseguir implementar certinho, é pra funcionar sem problemas.provavelmente funciona quando o dos esta minimizado, porque como não precisa mostrar o caracter na tela, o tempo de processamento é menor.antes de usar o sendkeys tenta adicionar um timer de 1 segundo, e só chamar o sendkeys depois de um segundo e veja o q da.se não resolver, tente fazer o teste de enviar uma teclar por vez. sei la, ponha um timer e envie um caracter a cada meio segundo so de teste pra ver. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kkkiler Postado Setembro 23, 2008 Autor Denunciar Share Postado Setembro 23, 2008 Eu já ia escrever falando q usando o timer deu certo :). Finalmente! Mas será q não tem jeito com loop? Eu tentei e num funfo não... como você fez? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Setembro 23, 2008 Denunciar Share Postado Setembro 23, 2008 (editado) opa a dica do loop q eu tinha dado era pro findwindow, porque se você usar o shell e logo depois o findwindow, a janela demoraria algumas fracoes de segundo pra carregar, e o findwindow falharia se fosse executado antes de ela carregar.ai você podia usar um timer ou por em loop ate encontrar a janela.pro sendkeys acho q o jeito é com o timer mesmo. a não ser q o visual basic tenha alguma funcao tipo o delay() do pascal (q espera um determinado tempo pra continuar a execucao do codigo), mas nunca vi isso, sempre uso timer pra trabalhar com tempo.ou você tb pode por um loop q qualquer pra esperar um certo tempo. tipo, delcare a variavel x com valor 0, e enquanto for menor q, por exemplo 2000, vai somando 1. ai ele vai levar alguns segundos (ou milisegundos) pra chegar em 2000. pode parecer uma gambiarra, mas pelo menos o codigo fica mais simples, mas na verdade acho q é possivel q isso não funcione, porque ele estara executando codigo a todo momento, e o timer vai justamente dar um pause entre uma linha e outra.EDITADO:na epoca q escrevi isso, eu ainda não conhecia a funcao Sleep() da "kernel32". não testei aqui, mas se não me engano em algum outro tópico, um membro q não me lembro quem era comentou q funciona.ela é muito mais simples do q usar um timer:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub Command1_Click() MsgBox "begin" Sleep 10000 'espera 10 segundos MsgBox "end"End Sub[/code](codigo retirado de http://www.freevbcode.com/ShowCode.Asp?ID=7556) Editado Maio 9, 2011 por kuroi Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
kkkiler
A dúvida é a seguinte... tem como executar mais de um comando no dos pelo mesmo shell? Ao invés de ter que fazer outro shell?Para que funcione como um arquivo de lotes(.bat)
Desde já agradeço pela atenção.
Link para o comentário
Compartilhar em outros sites
12 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.