KETTLE调度第三篇:Windows下调度Dos脚本编写和遇到的一些问题解决
前言:Kettle在Windows机器上常常依赖批处理脚本来实现执行过程,本文记录使用KETTLE过程中遇到命名参数、中文压缩包解压时批处理脚本是怎么处理的。
1、中文压缩包解压
最近接到一个数据采集工作,第一反应就是想用Kettle来实现。我的环境是Windows。
- 我的大致需求是: 周期性从SFTP下载压缩包解析文件内容处理后入库。
- 过程中遇到问题: zip压缩包文件名为中文,在使用文本文件读取时,会出现乱码或者zip读取不了等问题。
- 一个解决方案是: 使用一个shell脚本组件,利用windows机器上的WinRAR来解压文件。
1.1 shell脚本
spoon中这个组件在作业的脚本里。
另外 :shell脚本可传递参数,对应批处理脚本中访问:%1,%2表示第一个和第二个传入的参数。%0表示批处理脚本本身。
1.2 批处理脚本
1 @echo off 2 rem C:\Windows\System32\wbem\wmic 根据实际情况配置 3 for /f "tokens=2 delims==" %%a in ('C:\Windows\System32\wbem\wmic path win32_operatingsystem get LocalDateTime /value') do ( 4 set t=%%a 5 ) 6 rem 获取日期,如:2019090118 7 set YYYYMMDDHH=%t:~0,4%%t:~4,2%%t:~6,2%%t:~8,2% 8 echo 日期:%YYYYMMDDHH% 9 rem --------------------SETVAR BEGIN----------------- 10 rem 目标文件夹 11 set TARGETFILEPATH=%YYYYMMDDHH% 12 echo 目标文件夹:%TARGETFILEPATH% 13 14 rem 压缩包完整路径,如当前目录下以_result.zip结尾的zip文件 15 set SOURCEZIPFILE=%TARGETFILEPATH%*_result.zip 16 echo %SOURCEZIPFILE% 17 rem --------------------SETVAR END-------------------- 18 19 if exist "%TARGETFILEPATH%" (rmdir /s/q %TARGETFILEPATH% ) 20 md %TARGETFILEPATH% 21 22 rem D:\OFFICE\WinRAR\WinRAR.exe为WinRAR的程序路径,可根据实际情况配置 23 "D:\OFFICE\WinRAR\WinRAR.exe" e %SOURCEZIPFILE% %TARGETFILEPATH%
1.3 说明
set 设置变量值,% % 使用变量,echo 输出,rem 注释,%t:~0,4% 表示截取 t 的前四个长度。
1.3.1 WMIC获取时间
1.3.1.1 wmic获取年月日时分秒
WMIC是一个强大的命令行工具。第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在WMIC命令行提示符上,命令以交互的方式执行。
如果WMIC所在路径未配置环境变量,可全路径使用,如本例中获取当前时间(yyyyMMddHH):
C:\Windows\System32\wbem\wmic path win32_operatingsystem get LocalDateTime /value
在cmd窗口执行一下语句,结果如下:
1.3.1.2 常用dos获取日期和时间
dos获取时间的方法很多,常用的一种:
echo %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%
结果:
这种方式的问题在于,当月份、天数或者小时数不是两位数的时候有可能会得到空格。如上午9点显示结果:
以下是防止问题出现的脚本:
1 @echo off 2 setlocal enabledelayedexpansion 3 echo path 4 rem ******************************************************************************** 5 set YYYYMMDD=%date:~0,4%-%date:~5,2%-%date:~8,2% 6 set HH=%time:~0,2% 7 8 rem 去空格 9 :intercept_left 10 @if "%YYYYMMDD:~0,1%"==" " set "YYYYMMDD=%YYYYMMDD:~1%"&goto intercept_left 11 :intercept_right 12 @if "%YYYYMMDD:~-1%"==" " set "YYYYMMDD=%YYYYMMDD:~0,-1%"&goto intercept_right 13 :intercept_left 14 @if "%HH:~0,1%"==" " set "HH=%HH:~1%"&goto intercept_left 15 :intercept_right 16 @if "%HH:~-1%"==" " set "HH=%HH:~0,-1%"&goto intercept_right 17 18 set YYYYMMDDHH=%YYYYMMDD%%HH% 19 20 rem ******************************************************************************** 21 22 rem ---------------------以上:获取时间参数 yyyyMMddHH
1.3.2 检查路径
创建目标路径,已经压缩就删除文件夹和文件夹内内容,/q 不需要交互询问是否删除。
1 if exist "%TARGETFILEPATH%" (rmdir /s/q %TARGETFILEPATH% ) 2 md %TARGETFILEPATH%
1.3.3 WinRAR解压压缩包
和wmic同理,如果WinRAR.exe所在路径如D:\OFFICE\WinRAR没有配置环境变量,可全路径使用,建议配置环境变量,这样脚本适用性更强一些。更多命令详情可在WinRAR.exe所在同目录下的D:\OFFICE\WinRAR\WinRAR.chm中查看命令行模式可使用的命令。
1.4 示例
准备一个或多个压缩包,准备批处理脚本例如脚本名称unzip.bat。由于我们的脚本中含有中文,请注意将文件保存成ANSI编码格式。可在脚本末尾加上 pause ,表示脚本需要按任意键再能结束,方便在执行窗口查看执行结果。
以下是执行结果:
2 命名参数
当作业设置了命名参数后,在脚本里可如下调用。本例以资源库pdibase中test路径下FinallyJob.kjb的作业为例,该作业中参数名称为PDATE。
2.1 脚本中使用-param:"PDATE=?"
1 @echo off 2 rem **********************************SetVAR*************************************************************************** 3 set KettlePath=%KETTLE_HOME%\Kitchen.bat 4 set KettleBase=pdibase 5 rem 作业的路径 6 set JobPath==test//FinallyJob 7 rem 日志存储,如当前目录下 8 set LogPath=%cd% 9 rem ****************************************************************************************************************** 10 %KettlePath% -rep %KettleBase% -user admin -pass admin -job %JobPath% -param:"PDATE=20190109" > %LogPath%\log.log 11 rem ******************************************************************************************************************
2.2 作业中设置命名参数
在作业的画布上右键-作业设置
如果在子转换或者子作业希望使用该命名参数,则点击子转换/作业,编辑 - 命名参数 - 勾选命名参数往下传递(默认勾选上的)