前言: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 作業中設置命名參數
在作業的畫布上右鍵-作業設置

如果在子轉換或者子作業希望使用該命名參數,則點擊子轉換/作業,編輯 - 命名參數 - 勾選命名參數往下傳遞(默認勾選上的)


