在前段时间看到有位兄台用C#写了一个守护进程,挺好的,最近对批处理产生了很大兴趣,所以就试着用批处理写了一个守护进程批处理脚本。主要包括三个文件:ProcessCheck.bat、DeamonProcess.bat、Init.bat。分别具有以下职能:

       Init.bat

       (1)  设置需要守护程序的路径,将输入路径保存在根目录,生成processInfo.txt文件,文件格式为:path@name(d:\QQ.exe@QQ.exe) 。注意:如果路径中存在空格请使用""将其包括(当然也可以直接创建processInfo.txt文件,输入配置信息),如图所示:

代码
@echo off
set dir="%~dp0processInfo.txt"
cd. > "%dir%"
echo 输入守护程序路径:
:insert
echo.
set /p val=
FOR %%i IN (%val%) DO SET FN=%%~nxi
ECHO  %val%@%FN% >>"%dir%"
echo.
set /p check=是否继续输入【Y/N】
if %check%==goto insert
      

      

       DeamonProcess.bat:

       (1)进程守护,读取文件processInfo.txt中配置,定时调用ProcessCheck.bat用于确认进程是否已经启动。可以对ProcessCheck.bat进行修改,提供其他核对条件:运行时间、内存占用量等。

      

代码
@echo off
echo 开始守护进程
echo.
:loop
for /"delims=@ tokens=1*" %%i in ('findstr ."%~dp0processInfo.txt"') do (    
    
call ProcessCheck.bat %%j %%i
    
echo.
)
::暂停60秒
ping -n 60 127.0.0.1 > nul  
goto loop



       ProcessCheck.bat:

       (1)核对程序是否已经运行,若未运行,将其启动 ,否则跳过。如上所述,可以修改文件ProcessCheck.bat、Init.bat增加核对条件,这里只实现了最简单的核对条件(是否已运行);通过WMIC PROCESS进行核对,其包括很多参数,根据需要进行选取(WMIC PROCESS GET /?),关于WMIC的一些参考信息:

       http://msdn.microsoft.com/en-us/library/aa394606%28v=VS.85%29.aspx

   http://blogold.chinaunix.net/u3/94687/showart_2045762.html

 

代码
@echo off
wmic process where 
"commandline like '%%%1%%' and name!='wmic.exe'" get name /value|find /"name" >nul
If ErrorLevel 1 goto processstart
IF ErrorLevel 0 goto running
:processstart
echo 消息:%date%%time% 启动程序%1
start "" %2
goto end
:running
echo 消息:%date%%time% 正在运行%1
:end

 

 

      扩展:

      可以使用schtasks将DeamonProcess.bat注册为当系统启动时自动运行:schtasks /create /tn DeamonProcess /tr "E:\守护进程\deamonProcess.bat" /sc onstart /u 用户名 /p 密码。

/Files/WGZ_Home/守护进程.rar

    

      

       

       


 

posted @ 2011-02-20 16:23 wgz 阅读(316) 评论(0) 编辑

      在前一个项目中因项目经理的要求,需要提供一个自动备份功能。刚开始是想写个脚本将整个数据库exp出来进行保存,后来无意中看到了rman备份,且是官方推荐方式,所以在网上搜索了资料进行观看,感觉挺有收获的,以下是我在网上搜寻到的资料,各位有兴趣的话可以看看:

http://blog.csdn.net/tianlesoftware/archive/2009/12/13/4976998.aspx(不错)  

     在了解了相关知识之后,最后提供的备份思路是这样的: 

    (1)提供一个模板文件,此文件包括rman参数设置命令,备份命令,归档日志清除命令等,参考连接:http://www.oracle.com/technology/global/cn/pub/articles/havewala-rman-grid.html

    (2)通过批处理脚本创建相关目录、备份脚本,将目录分为:data、log 、script。data目录用于存放数据库备份数据;log目录用于存储执行日志;script目录保存rman备份批处理脚本

    (3)在系统中增加备份任务,在每日01:30进行数据库备份。

以下是模板文件:

# Configure RMAN settings
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 
1 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP 
ON;
CONFIGURE CONTROLFILE AUTOBACKUP 
FORMAT FOR DEVICE TYPE  DISK TO '$BACKUPDIR\cf_%F';
CONFIGURE 
BACKUP OPTIMIZATION ON;
CONFIGURE 
DEVICE TYPE disk PARALLELISM 3;
CONFIGURE DEFAULT 
DEVICE TYPE TO disk; 
CONFIGURE CHANNEL 
1 DEVICE TYPE DISK FORMAT  '$BACKUPDIR\b_%U';
CONFIGURE CHANNEL 
2 DEVICE TYPE DISK FORMAT  '$BACKUPDIR\b_%U';
CONFIGURE CHANNEL 
3 DEVICE TYPE DISK FORMAT  '$BACKUPDIR\b_%U';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO  '
$BACKUPDIR\snapcf_$DBNAME.f';
# Perform backup of database and archivelogs, deleting  backed up archivelogs
BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
# Maintainance commands for crosschecks and deleting  expired backups
ALLOCATE CHANNEL 
FOR MAINTENANCE DEVICE TYPE DISK;
CROSSCHECK 
BACKUP;
DELETE NOPROMPT EXPIRED 
BACKUP;
DELETE NOPROMPT OBSOLETE 
DEVICE TYPE DISK;
CROSSCHECK  ARCHIVELOG ALL
;
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL
;
# End of RMAN command script

 

 

以下是批处理脚本,已经对一些步骤进行了注释:

@echo off
set /p user=请输入系统用户
set /p pwd=请输入系统密码
::将ora_dba用户组权限赋予系统执行用户
net localgroup ora_dba  %user% /add
set /p ORACLE_SID=请输入备份数据库名称
set /p backDir=请输入备份路径
if exist "%backDir%" (
 
rd //"%backDir%" 
) 
md "%backDir%"
md "%backDir%\data"
md "%backDir%\log"
md "%backDir%\script"

::生成rman备份脚本
cd. > "%backDir%\script\rman_%ORACLE_SID%.cmd" 
::这句话很关键,启用延缓环境变量扩展名
setlocal enabledelayedexpansion
::遍历模板文件
for /"delims=: tokens=1*" %%i in ('findstr /."%~dp0model_file.txt"') do (           
      
set current=%%j
      
::对参数使用环境变量进行替换
      set current=!current:$BACKUPDIR=%backDir%!      
      
set current=!current:$DBNAME=%ORACLE_SID%!     
      
echo !current! >> "%backDir%\script\rman_%ORACLE_SID%.cmd"
)            
::生成计划执行脚本
echo @echo off > "%backDir%\script\task_%ORACLE_SID%.bat"
echo set ORACLE_SID=%ORACLE_SID% >> "%backDir%\script\task_%ORACLE_SID%.bat"
echo rman target / msglog="%backDir%\log\bak_%date:~0,10%.log"  cmdfile="%backDir%\script\rman_%ORACLE_SID%.cmd" >> "%backDir%\script\task_%ORACLE_SID%.bat"
schtasks 
/delete /tn "%ORACLE_SID%_backup" /f
schtasks 
/create /RU %user% /RP %pwd% /sc daily /st 01:30:00 /tn "%ORACLE_SID%_backup" /tr "%backDir%\script\task_%ORACLE_SID%.bat"
pause

 

以上就是所有内容了,自己记录下

 

posted @ 2011-02-16 12:58 wgz 阅读(1529) 评论(0) 编辑

  工作中遇到一条查询语句,需要传入多个值,类似这样的语句:select * from table  where column in (:param)。在sql server中可以使用动态语句来拼凑执行。在oracle中不知道怎样处理,所以只能出大招,上网找资料,很幸运找到了解决办法,所以记录一下,主要参考链接:1、http://www.sommarskog.se/arrays-in-sql-2005.html   2、http://dev.firnow.com/course/7_databases/oracle/oraclexl/20090304/158057.html

  链接一中收获了一种比较好的sql语句书写方式,其中有很详细的描述;有一点较可惜的是这篇文章只提到了sql server 的相关操作。不过通过启发可以将上述sql语句改写为

select * 
from table a
inner join ufn_condition_list(:param) b
on a.column=b.column_value

其中函数ufn_condition_list的作用为将类似于"'1','2','3'"这样的参数进行处理,返回table类型对象同查询表进行关联。oracle函数无法像sql server函数那样直接返回表数据,通过查询之后发现可以使用PIPELINED函数来返回表集合,可以阅读下以下两个链接:1、http://www.oracle-base.com/articles/9i/PipelinedTableFunctions9i.php   2、http://database.51cto.com/art/201004/194462.htm

  链接二中收获了split功能的函数,且返回表集合,分为两步:

    1、创建table类型 

CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2(4000

    2、进行切分,并使用PIPELINED函数来返回表集合

代码
create or replace function split
(
       p_list 
in varchar2,
       p_sep 
in varchar2 default ’,’

return type_split pipelined 
AS 
 l_idx pls_integer; 
 v_list 
varchar2(50) := p_list; 
begin 
      loop 
          l_idx :
= instr(v_list,p_sep); 
           
if l_idx > 0 then 
               
pipe row(substr(v_list,1,l_idx-1)); 
               v_list :
= substr(v_list,l_idx+length(p_sep)); 
           
else 
                
pipe row(v_list); 
                
exit
           
end if
      
end loop; 
     
      
return
end split;

 

  最后,我们可以将原查询语句修改为以下语句,执行性能也可以有所保障

select * 
from table a
inner join table(split(:param)) b
on a.column=b.column_value


 

 



 

posted @ 2010-11-03 21:25 wgz 阅读(476) 评论(0) 编辑

  没有高深的东西,仅仅是小知识、小应用。都是项目开发过程中记录下来的,大都来源于网上。整理下让自己看着方便,也分享下,希望能有点帮助。

  一、获取web根地址 ,因为有些创建的是虚拟目录,有些创建的站点

        public static string WebsiteRoot()
        {
            HttpRequest request
=HttpContext.Current.Request;
            
string root = request.Url.GetLeftPart(UriPartial.Authority); 
            
if (request.ApplicationPath == null || request.ApplicationPath == "/")
            {
                
//安装在web站点
                return root;
            }
            
//安装在虚拟目录
            return string.Concat(root, request.ApplicationPath);            
        }

 

  二、JS判定IE是否已经关闭

        window.onunload = function() {
            
var clientX = event.clientX;
            
if (clientX < 0 || clientX > 3000) {
                
/*用户关闭了IE.
                 *已经在IE6,7下测试过两种关闭方式:
                 *1.点击关闭按键   2.ALT+F4
                
*/

                
//需要执行的代码
                alert("已经关闭");
            }
        }

 

  三、日志记录

  可以使用NLog做为日志工具,对其进行简单封装就OK了

 

  四、EXCEL导出

  可以使用CarlosAg.ExcelXmlWriter,包括代码自动生成工具

  

  五、XML编辑工具

  Altova XMLSpy,   破解版下载地址:http://www.verycd.com/topics/2838119/

    Altova MapForce ,破解版文件太大,无法上传,地址忘记了

   

    六、jQuery

  JS中的匿名函数又称为闭包函数 例子:(function(arg){})("1"); jQuery扩展可以这样书写 (function($){ ... })(jQuery);  

var jQuery = window.jQuery = window.$ = function(selector, context)  {  
   
// ...  // other internal initialization code goes here 

}; 
//可以将jQuery理解为类 

jQuery.fn 
= jQuery.prototype

jQuery.func1
=function(){

     ..... 

}  
//可以将其理解为jQuery静态函数

jQuery.fn.func2
=function(){

      ..... 

}  
//可以将其理解为jQuery实例函数


  七、Oracle

  字符填充:可以使用函数lpad rpad,具体功能指若字符串长度小于指定长度,则用指定的字符进行补全,可以在网上搜索下

    将十进制转化为二进制函数 :   

 

 create or replace function ufun_tentobin(ix in numberreturn varchar2 is

  vars 
varchar2(1000);

  xs   
number(10);

begin

  
if ix<=0 then

  
begin

     
return '0';

  
end;

  
end if;

  vars :
= '';

  xs   :
= ix;

  
while xs > 0 loop

    vars :
= cast(mod(xs, 2as varchar2|| vars;

    xs   :
= floor(xs / 2);

  
end loop;

  
return vars;

end;


  使用查询语句将二进制转化为十进制:

select sum(data1) 
from (select substr(二进制字符串, rownum, 1* power(2, length(二进制字符串) - rownum) data1
from dual
connect 
by rownum <= length(二进制字符串)); 

  

  八、jquery easyui

  datagrid控件使用Post获取.json文件需要进行一些设置,可以看看这篇文章

  http://blog.csdn.net/zhhhhao/archive/2009/04/06/4051352.aspx

  jQuery中ajax的提交方式post、get,在服务端获取查询参数的方式不同:

        public static System.Collections.Specialized.NameValueCollection QueryParams(HttpContext context)
        {
            HttpRequest request 
= context.Request;
            
if (request.RequestType == "GET")
            {
                
return request.QueryString;
            }
            
return request.Form;
        }


 

  

  

 


 

 

  

  

 

 

posted @ 2010-10-19 21:01 wgz 阅读(341) 评论(4) 编辑
摘要: 一、前因 因为项目中需要在silverlight 中导出Excel文件,所以就在琢磨这个事情了,开始时候的想法是能不能通过js 导出excel,在网上查了资料,试了所有找到的方法,可惜没有一个成功的。想不出其他办法,只能绕着走了,可能有点蠢,呵呵。不知道大家是怎么解决的,我把自己的发出来,抛砖引玉,不恰当的地方欢迎指出。 二、具体实现 整个解决方案包括以下几个项目,如图: 其中的BLL,Enity...阅读全文
posted @ 2010-04-10 22:48 wgz 阅读(3395) 评论(5) 编辑