在前段时间看到有位兄台用C#写了一个守护进程,挺好的,最近对批处理产生了很大兴趣,所以就试着用批处理写了一个守护进程批处理脚本。主要包括三个文件:ProcessCheck.bat、DeamonProcess.bat、Init.bat。分别具有以下职能:
Init.bat
(1) 设置需要守护程序的路径,将输入路径保存在根目录,生成processInfo.txt文件,文件格式为:path@name(d:\QQ.exe@QQ.exe) 。注意:如果路径中存在空格请使用""将其包括(当然也可以直接创建processInfo.txt文件,输入配置信息),如图所示:

代码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%==Y goto insert
DeamonProcess.bat:
(1)进程守护,读取文件processInfo.txt中配置,定时调用ProcessCheck.bat用于确认进程是否已经启动。可以对ProcessCheck.bat进行修改,提供其他核对条件:运行时间、内存占用量等。
代码echo 开始守护进程
echo.
:loop
for /f "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
(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
代码wmic process where "commandline like '%%%1%%' and name!='wmic.exe'" get name /value|find /I "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 密码。
在前一个项目中因项目经理的要求,需要提供一个自动备份功能。刚开始是想写个脚本将整个数据库exp出来进行保存,后来无意中看到了rman备份,且是官方推荐方式,所以在网上搜索了资料进行观看,感觉挺有收获的,以下是我在网上搜寻到的资料,各位有兴趣的话可以看看:
http://oracle.chinaitlab.com/backup/523597.html
http://oracle.chinaitlab.com/backup/23304.html
http://www.oracle.com/technology/global/cn/pub/articles/havewala-rman-grid.html (不错)
http://microjava.javaeye.com/blog/510023
http://www.91linux.com/html/article/database/oracle/20100909/20502.html
http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4699320.aspx (不错)
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 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
以下是批处理脚本,已经对一些步骤进行了注释:
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 /s /q "%backDir%"
)
md "%backDir%"
md "%backDir%\data"
md "%backDir%\log"
md "%backDir%\script"
::生成rman备份脚本
cd. > "%backDir%\script\rman_%ORACLE_SID%.cmd"
::这句话很关键,启用延缓环境变量扩展名
setlocal enabledelayedexpansion
::遍历模板文件
for /f "delims=: tokens=1*" %%i in ('findstr /n .* "%~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
以上就是所有内容了,自己记录下
工作中遇到一条查询语句,需要传入多个值,类似这样的语句: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语句改写为
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类型
2、进行切分,并使用PIPELINED函数来返回表集合
代码(
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;
最后,我们可以将原查询语句修改为以下语句,执行性能也可以有所保障
from table a
inner join table(split(:param)) b
on a.column=b.column_value
没有高深的东西,仅仅是小知识、小应用。都是项目开发过程中记录下来的,大都来源于网上。整理下让自己看着方便,也分享下,希望能有点帮助。
一、获取web根地址 ,因为有些创建的是虚拟目录,有些创建的站点
{
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是否已经关闭
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);
// ... // other internal initialization code goes here
}; //可以将jQuery理解为类
jQuery.fn = jQuery.prototype
jQuery.func1=function(){
.....
} //可以将其理解为jQuery静态函数
jQuery.fn.func2=function(){
.....
} //可以将其理解为jQuery实例函数
七、Oracle
字符填充:可以使用函数lpad rpad,具体功能指若字符串长度小于指定长度,则用指定的字符进行补全,可以在网上搜索下
将十进制转化为二进制函数 :
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, 2) as varchar2) || vars;
xs := floor(xs / 2);
end loop;
return vars;
end;
使用查询语句将二进制转化为十进制:
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,在服务端获取查询参数的方式不同:
{
HttpRequest request = context.Request;
if (request.RequestType == "GET")
{
return request.QueryString;
}
return request.Form;
}

