Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tiagoluizmartins

ajuda com php para executar um arquivo .vbs no servidor

Recommended Posts

olá tenho um programa que faz consultas mysql e oci e gera cupons em um determinada pasta do servidor em formatos .txt aconteceu que presciso mandar esses cupons para impressoras em rede um por um para que a impressora possa picotar o papel após o termino deles para isso estou usando um .vbs onde o mesmo seleciona todos os arquivos .txt seta a impressora em rede como padrao e manda imprimir todos os arquivos desta pasta, este vbs funciona normal quando dado dois cliques nele, o problema é que eu preciso que o php mande executar ele, eu tentei a funçao  

 

  exec ("imprimir.vbs"); \\ assim o navegador fica carregando sem parar e nada acontece

 

tentei também criar um bat e este por sua vez chamar o vbs

exec ("imp.bat"); \\ pagina carrega normal porém nao é executado o vbs no mesmo bat coloquei comandos para copy e renomear arquivos como teste para ver se ta passando, verificando que somente a parte do vbs nao é chamada

 

tentei também a função shell_exec

 

shell_exec (start cscript "d:\xampp\htdocs\vale\teste\imprimir.vbs"); \\ assim o navegador fica carregando sem parar e nada acontece também

 

por ultimo tentei a função COM, sendo a mesma abilitada no php.ini e com a devida extensão na pasta

/* Defina o caminho para o arquivo(s) */
$command = 'wscript.exe d:/xammp/htdocs/vale/teste/imprimir.vbs';
// Executa os arquivos/comandos
$obj = new COM ( 'WScript.Shell' );
if ( is_object ( $obj ) )
{
    $obj->Run ( 'cmd /C ' . $command, 0, FALSE );
}

else

{
    echo 'Não foi possível criar o objeto!';
}
 
$obj = null;

// desta forma a pagina carrega normal sem dar erro algum porem nada acontece

 

 

segue arquivos em anexo para tal visualização, por favor me ajudem.

 

teste.php

imp.bat

imprimir.vbs

Compartilhar este post


Link para o post
Compartilhar em outros sites

@tiagoluizmartins, primeiro tente executar esse .vbs usando apenas o cmd do windows, pois se nem ai estiver imprimindo, então não adianta tentar nada com PHP. Caso positivo, use o mesmo script que usou no cmd com uma das sugestões abaixo e nos de um retorno.


exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs"');

# Ou

$shell = new COM('WScript.Shell');
$shell->run('php D:/xammp/htdocs/vale/teste/imprimir.vbs', 0, false);

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
46 minutos atrás, EdCesar disse:

@tiagoluizmartins, primeiro tente executar esse .vbs usando apenas o cmd do windows, pois se nem ai estiver imprimindo, então não adianta tentar nada com PHP. Caso positivo, use o mesmo script que usou no cmd com uma das sugestões abaixo e nos de um retorno.



exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs"');

# Ou

$shell = new COM('WScript.Shell');
$shell->run('php D:/xammp/htdocs/vale/teste/imprimir.vbs', 0, false);

@EdCesar, sim ele executa e imprimi mandando via cmd ou dando dois clicks nele, a primeira opção 

exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs"');

não da erro porem a pagina fica carregando eternamente

 

a segunda opção 

 

$shell = new COM('WScript.Shell');
$shell->run('php D:/xammp/htdocs/vale/teste/imprimir.vbs', 0, false);

 no navegador da esse erro no caso a linha 11  do codigo teste.php meu é codigo abaixo as anteriores são testes que estão comentados 

 

$shell->run('php D:/xammp/htdocs/vale/teste/imprimir.vbs', 0, false);

 

Fatal error: Uncaught exception 'com_exception' with message '<b>Source:</b> Unknown<br/><b>Description:</b> Unknown' in D:\xampp\htdocs\vale\teste\teste.php:11 Stack trace: #0 D:\xampp\htdocs\vale\teste\teste.php(11): com->run('php D:/xammp/ht...', 0, false) #1 {main} thrown in D:\xampp\htdocs\vale\teste\teste.php on line 11 

 

no meu php.ini esta ativado a extensão php_com_dotnet

PHP Version 5.6.15

System Windows NT WEB-HOST-2 6.1 build 7600 (Windows Server 2008 R2 Standard Edition) i586
Build Date Oct 29 2015 12:34:05
Compiler MSVC11 (Visual C++ 2012)
Architecture x86
Configure Command cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"
Server API Apache 2.0 Handler

 

com_dotnet

COM support enabled
DCOM support disabled
.Net support enabled
Directive Local Value Master Value
com.allow_dcom 0 0
com.autoregister_casesensitive 1 1
com.autoregister_typelib 0 0
com.autoregister_verbose 0 0
com.code_page no value no value
com.typelib_file no value no value

Core

PHP Version 5.6.15

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja essa nota na documentação do exec

 

Nota:

Se um programa é iniciado com esta função, e deseja que ele continue rodando em background, a saída do programa precisa ser redirecionada para um arquivo ou outro output stream. Se isso não é feito, o que irá ocorrer é que o PHP ficará esperando até que a execução do programa termine.
 

http://php.net/manual/pt_BR/function.exec.php

Então tente isso:

exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs" > impressaolog.txt');


Se também não entendi errado, se colocar o & o php não aguardara o retorno
 

exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs" &');


Caso ainda não de certo, só confirme duas coisas que não ficou claro:
Você disse que a primeira opção "não da erro porem a pagina fica carregando eternamente", ok, mas imprime?
Qual o comando que você esta usando para imprimir pelo cmd?

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 minutos atrás, EdCesar disse:

Veja essa nota na documentação do exec

 

Nota:

Se um programa é iniciado com esta função, e deseja que ele continue rodando em background, a saída do programa precisa ser redirecionada para um arquivo ou outro output stream. Se isso não é feito, o que irá ocorrer é que o PHP ficará esperando até que a execução do programa termine.
 

http://php.net/manual/pt_BR/function.exec.php

Então tente isso:


exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs" > impressaolog.txt');


Se também não entendi errado, se colocar o & o php não aguardara o retorno
 


exec('wscript "D:/xammp/htdocs/vale/teste/imprimir.vbs" &');


Caso ainda não de certo, só confirme duas coisas que não ficou claro:
Você disse que a primeira opção "não da erro porem a pagina fica carregando eternamente", ok, mas imprime?
Qual o comando que você esta usando para imprimir pelo cmd?

 

não não imprime!!!

 

desse dois modos fica carregando eternamente do primeiro jeito cria um arquivo de log em txt porem ele esta em branco e nao imprimi nada em nenhum dos dois!

 

para imprimir estou usando um script.vbs que no caso o nome é imprimir.vbs que coloquei em anexo na primeira postagem as linhas que tem ' sao comentarios

'  Script para impressão de documentos
'  Modificado por Rafael Zottesso
'  ******************************
' Cria a variável para definir a impressora padrão
Set objPrinter = CreateObject("WScript.Network")
' Para impressora da rede utilize "\servidorNome da Impressora"
objPrinter.SetDefaultPrinter "\\comp-1-pc\hp"
' Define o diretório
TargetFolder = "D:\xampp\htdocs\vale\teste\temp\"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(TargetFolder)
' Lista os arquivos
Set colItems = objFolder.Items
For Each objItem in colItems
' Imprime os arquivos encontrados
objItem.InvokeVerbEx("Print")
Next
' Define-se a impressora padrão após 5 segundos
Wscript.Sleep 3000
Set oldPrinter = CreateObject("WScript.Network")
oldPrinter.SetDefaultPrinter "Foxit Reader PDF Printer"

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez o problema esteja em uma das perguntas que coloquei, como é que você executa o .vbs pelo cmd? E quando você faz isso, apos imprimir, no cmd fica processando ou volta ao prompt permitindo digitar outros comandos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, talvez seja bem simples! Faça da mesma forma

 

troque wscript por  cscript

exec('cscript "D:/xammp/htdocs/vale/teste/imprimir.vbs"');


Fiz um teste aqui e criei um hello.vbs

 

function Main()
      Wscript.Echo "Hello!"
end function
call Main

 

<?php

echo exec('cscript hello.vbs'); # Executa

echo exec('wscript hello.vbs'); # fica em loop infinito


Olhando a documentação do vbs ficou claro o motivo, o cscript envia a saída para o console, já o wscript para uma caixa de dialogo, que precisa de um clique no ok

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
21 minutos atrás, EdCesar disse:

Olha, esse era o ponto!  Faça da mesma forma

 

troque wscript por  cscript


exec('cscript "D:/xammp/htdocs/vale/teste/imprimir.vbs"');


Fiz um teste aqui e criei um hello.vbs

 


function Main()
      Wscript.Echo "Hello!"
end function
call Main

 


<?php

echo exec('cscript hello.vbs'); # Executa

echo exec('wscript hello.vbs'); # fica em loop infinito


Olhando a documentação do vbs ficou claro o motivo, o cscript executa em console, já o wscript chama uma caixa de dialogo, que precisa de um clique no ok

 

 

 

 

@EdCesar, veio nao roda mesmo colocando desta forma 

exec('cscript hello.vbs');

claro que com o meu vbs imprimir.vbs ele nao fica carregando porem nao é acionado o vbs no servidor, sendo assim nao imprimi, como eu falei anteriormente eu fiz esse bat abaixo e e fiz a funçao exec chamar esse bat, contudo tbm nao rodou o script vbs ai fiz um teste, no mesmo bat pedindo para copiar um determinado arquivo para outro lugar antes do script e apos chamar o script renomear esse arquivo, os todos os processo de copia de rename foi executado menos chamar o vbs pelo cmd atraves do cscript.exe

 

 

 

ECHO starting program

cmd.exe /c cscript.exe D:\xampp\htdocs\vale\teste\imprimir.vbs

echo finish program

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim fiz o teste com aquele vbs que você fez trazendo hello na tela ele funcionou. porem o meu nao roda é para o meu abrir os arquivos no notepad.exe no servidor setando impressora padrao e mandando imprimir

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.