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% 表示截取 的前四个长度。

  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 命名参数

  当作业设置了命名参数后,在脚本里可如下调用。本例以资源库pdibasetest路径下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 作业中设置命名参数

  在作业的画布上右键-作业设置

 

  如果在子转换或者子作业希望使用该命名参数,则点击子转换/作业,编辑 - 命名参数 - 勾选命名参数往下传递(默认勾选上的)

 

posted @ 2019-01-09 19:07  狐狸小姐18岁  阅读(1607)  评论(0编辑  收藏  举报