• 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:WindowsSystem32wbemwmic 根据实际情况配置
     3 for /f "tokens=2 delims==" %%a in ('C:WindowsSystem32wbemwmic 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:OFFICEWinRARWinRAR.exe为WinRAR的程序路径,可根据实际情况配置
    23 "D:OFFICEWinRARWinRAR.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:WindowsSystem32wbemwmic 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:OFFICEWinRAR有配置环境变量,可全路径使用,建议配置环境变量,这样脚本适用性更强一些。更多命令详情可在WinRAR.exe所在同目录下的D:OFFICEWinRARWinRAR.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 作业中设置命名参数

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

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

  • 相关阅读:
    [GSEAPY] 在Python里进行基因集富集分析
    scRNAseq R包公共单细胞数据获取
    pybedtools:在Python中使用BEDTools
    pybedtools 提取序列
    将博客搬至CSDN
    【转】SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    sql长日期数据以短日期格式显示【转】
    [转]YouTube架构学习体会
    [转]让Nginx 支持 ASP ASP.NET配置方法
    [转]LINQ查询总结
  • 原文地址:https://www.cnblogs.com/missfox18/p/7553524.html
Copyright © 2020-2023  润新知