请高手指点,自动执行批处理文件问题,急!


问题描述:
我通过程序,自动生成了一个批处理文件。
批处理文件内容为:

@echo off
SQLPlus
用户名/用户密码@数据库名称
.
.
.
.
.
.

我的目的是通过执行我的批处理文件,自动连接到SQLPlus,并在里面执行我的操作,而实际在执行批处理文件时,停在了“请输入用户名”,如何实现在我的批处理文件里就连上了SQLPlus而不出现这个提示。请高手们赐教!

13 个解决方案

#1


SQLPlus 用户名/用户密码@数据库名称

#2


谢谢楼上的wohow()。
改成:
@echo  off  
SQLPlus 用户名/用户密码@数据库名称
select count(*) from 表名;

如何执行批处理文件后直接看到其执行SQL语句后而不是要输入执行语句呢?

#3


没看懂。
用EXE吧,别用BAT了

#4


我的意思是:我做了一个加密小工具,对Oracle过程包(含过程、函数、触发器)进行加密(加密机制采用oracle带的wrap工具加密),加密是通过对要加密的文件自动写成批处理文件后,并执行产生加密文件。

而要在工具里自动编译运行加密后的文件(当然可以手工在PLSQL里去编译),我的思路是对要编译的加密文件存成批处理文件后并执行,达到在SQLPlus里自动编译的效果。

批处理文件存成的格式为:
@echo  off  
SQLPlus 用户名/用户密码@数据库名称
@文件名1;
@文件名n;

但执行批处理文件时到“SQLPlus 用户名/用户密码@数据库名称
”就停住了,并未执行“@文件名1;”……“@文件名1;”。


请各位高手提供好的实现方式,谢谢。

#5


已经搞定了,谢谢楼上的支持!

#6


搞定了,那把解决方法公布以下,说不定版主给弄成精华帖呢?
同时别人也可借鉴吗!!!

#7


9494

也让藕们学习学习哈

#8


批处理文件,窗口中显示 
完整代码示例:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------
String ExecuteApp(String sCmdline,TMemo *MyMemo)
{
    PROCESS_INFORMATION proc = {0};
    long ret;//,k=1
    bool bret;
    STARTUPINFO start = {0};
    SECURITY_ATTRIBUTES sa = {0};
    HANDLE hReadPipe ;
    HANDLE hWritePipe;
    String sOutput;
    String sBuffer;
    unsigned long lngBytesRead;
    char cBuffer[257];
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle = TRUE;
    bret =::CreatePipe(&hReadPipe, &hWritePipe,&sa, 0);
    if (!bret)
    {
        sOutput="CreatePipe failed. Error: " + String(GetLastError());
        MyMemo->Lines->Add(sOutput);
        return sOutput; 
    } 
    start.cb = sizeof(STARTUPINFOA); 
    start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    start.hStdOutput = hWritePipe;
    start.hStdError = hWritePipe; 
    start.wShowWindow = SW_HIDE; 
    sBuffer = sCmdline;
    ret =::CreateProcess(0, sBuffer.c_str(), &sa, &sa, TRUE, NORMAL_PRIORITY_CLASS, 0, 0, &start, &proc);
    if (ret == 0)
    { 
        sOutput="Bad command or filename"; 
        MyMemo->Lines->Add(sOutput);
        return sOutput; 
    }
    ::CloseHandle(hWritePipe);
    do 
    {
        memset(cBuffer,'\0',sizeof(cBuffer)); 
        ret = ::ReadFile(hReadPipe, &cBuffer, 256, &lngBytesRead, 0);
        sBuffer=StrPas(cBuffer); 
        sOutput = sOutput + sBuffer;
        MyMemo->Text=MyMemo->Text+sBuffer;
        Application->ProcessMessages(); 

    } while (ret != 0 ); 
    ::CloseHandle(proc.hProcess); 
    ::CloseHandle(proc.hThread); 
    ::CloseHandle(hReadPipe); 
    return sOutput;
}
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ExecuteApp("ping 127.0.0.1",Memo1);
ExecuteApp("DirCD.bat",Memo1);
}
//---------------------------------------------------------------------------

#9


贴这个给大家参考
:)

#10


主要输入 
我在windows没有试过,但在unix下是这样的:

sqlplus <<!
@fileName.sql
!


sqlplus <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
!

你试试吧,我没有进行测试。随便写的。

呵呵~~~接分

#11


我在windows没有试过,但在unix下是这样的:

sqlplus UserName/password@ServerName <<!
@fileName.sql
!


sqlplus UserName/password@ServerName <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
!

你试试吧,我没有进行测试。随便写的。


呵呵~~~接分

#12


我在windows没有试过,但在unix下是这样的:

sqlplus UserName/password@ServerName <<!
@fileName.sql
exit
!


sqlplus UserName/password@ServerName <<!
spool a.txt
select to_char(sysdate,'yyyymmddhh24miss') from dual
exit
!

你试试吧,我没有进行测试。随便写的。


呵呵~~~接分

#13


mark

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2019 ITdaan.com

赞助商广告