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 作業中設置命名參數

  在作業的畫布上右鍵-作業設置

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM