1. 程式人生 > >KETTLE調度第三篇:Windows下調度Dos腳本編寫和遇到的一些問題解決

KETTLE調度第三篇:Windows下調度Dos腳本編寫和遇到的一些問題解決

p s off ati ech 存儲 %s left 天數 mar

  前言:Kettle在Windows機器上常常依賴批處理腳本來完成,本文記錄使用KETTLE過程中遇到命名參數、中文壓縮包解壓時批處理腳本是怎麽處理的。

1、中文壓縮包解壓

  最近接到一個數據采集工作,第一反應就是想用Kettle來實現。我的環境是Windows。

  • 我的大致需求是: 周期性從SFTP下載壓縮包解析文件內容處理後入庫。
  • 過程中遇到問題: zip壓縮包文件名為中文,在使用文本文件讀取時,會出現亂碼或者zip讀取不了等問題。
  • 一個解決方案是: 使用一個shell腳本組件,利用windows機器上的WinRAR來解壓文件。

1.1 shell腳本

  spoon中這個組件在作業的腳本裏。

技術分享圖片

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 
 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 EDD--------------------
18 19 if not exist "%TARGETFILEPATH%" (md %TARGETFILEPATH% ) else (echo exist %TARGETFILEPATH%) 20 21 rem D:\OFFICE\WinRAR\WinRAR.exe為WinRAR的程序路徑,可根據實際情況配置 22 "D:\OFFICE\WinRAR\WinRAR.exe" e %SOURCEZIPFILE% %TARGETFILEPATH%

  

1.3 說明

  set 設置變量值,% % 使用變量,echo 輸出,rem 註釋,%t:~0,4% 表示截取 t 的前四個長度。

  1.3.1 WMIC獲取時間

  WMIC是一個強大的命令行工具。第一次執行WMIC命令時,Windows首先要安裝WMIC,然後顯示出WMIC的命令行提示符。在WMIC命令行提示符上,命令以交互的方式執行。

  如果WMIC所在路徑未配置環境變量,可全路徑使用,如本例中獲取當前時間(yyyyMMddHH):

C:\Windows\System32\wbem\wmic path win32_operatingsystem get LocalDateTime /value

  在cmd窗口執行一下語句,結果如下:

技術分享圖片

  

  dos獲取時間的方法很多,常用的一種:

echo %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%

技術分享圖片

  

  這種方式的問題在於,當月份、天數或者小時數不是兩位數的時候有可能會得到空格。以下是防止問題出現的腳本:

 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 檢查路徑

  目標路徑不存在就創建。

if not exist "%TARGETFILEPATH%" (md %TARGETFILEPATH% ) else (echo exist %TARGETFILEPATH%)

  1.3.3 WinRAR解壓壓縮包

  和wmic同理,如果WinRAR.exe所在路徑如D:\OFFICE\WinRAR有配置環境變量,可全路徑使用,建議配置環境變量,這樣腳本適用性更強一些。更多命令詳情可在WinRAR.exe所在同目錄下的D:\OFFICE\WinRAR\WinRAR.chm中查看命令行模式可使用的命令。

技術分享圖片

2 命名參數

  當作業設置了命名參數後,在腳本裏可如下調用。本例以資源庫pdibasetest路徑下test.kjb的作業為例,該作業中參數名稱為PDATE

 1 @echo off
 2 rem **********************************SetVAR***************************************************************************
 3 set KettlePath=%KETTLE_HOME%\Kitchen.bat
 4 set KettleBase=pdibase
 5 rem 作業的路徑
 6 set JobPath==test//test
 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 ******************************************************************************************************************

KETTLE調度第三篇:Windows下調度Dos腳本編寫和遇到的一些問題解決