將 wsadmin Scripting 與 Jython 搭配使用
Jython 是 Python的替代實作,完全以 Java™撰寫。
=> 表示法代表指令或函數輸出。基本功能
此函數是內建函數或 Jython 函數的名稱。 例如,下列函數會傳回 "Hello , World!" 作為輸出:
print "Hello, World!"
=>Hello, World!
import sys
sys.stdout.write("Hello World!\n")
=>Hello, World!在此範例中, print 識別標準輸出串流。 您可以執行 import 陳述式 (如前述範例) 來使用內建模組。 陳述式匯入會在模組中執行程式碼作為匯入的一部分,並傳回模組物件。 sys 是 Python 語言的內建模組。 在 Python 語言中,模組是用來建立名稱的名稱空間。 位於模組中的名稱稱為屬性。 模組對應於檔案,且 Python 語言會建立模組物件,以包含檔案中定義的所有名稱。 換句話說,模組是名稱空間。
output =
AdminControl.invoke(mbean)) ,然後使用 print output。 使用 Jython print 指令來正確地轉換包含 NLS 轉換字元的字串。變數
若要將物件指派給名稱,指派的目標會在等號 (=) 的第一端,以及您在另一端指派的物件。 第一端的目標可以是名稱或物件元件,另一端的物件可以是計算物件的任意表示式。 下列規則適用於將物件指派給名稱:
- 指派會建立物件參照。
- 當您指派名稱時,會建立名稱。
- 您必須先指派名稱,然後再參照它。
變數名稱規則類似於 C 語言的規則; 例如,變數名稱可以具有底線字元 (_) 或字母加上任意數目的字母、數字或底線。
- and
- 主張
- break
- 類別
- 繼續
- DEF
- 德爾
- 埃利斯
- else
- 除了
- EXEC
- 終於
- 如需
- 從
- 廣域 (global)
- 假設
- import
- IN
- 是
- lambda
- 不
- 或
- pass
- 提高
- 返回
- try
- 當
例如:
a = 5
print a
=> 5
b = a
print b
=> 5
text1, text2, text3, text4 = 'good', 'bad', 'pretty', 'ugly'
print text3
=> pretty第二個範例將變數 a 的值指派給變數 b。
類型和運算子
下列清單包含內建物件類型的範例:
- 數字 例如:
8, 3.133, 999L, 3+4j num1 = int(10) print num1 => 10 - 弦 例如:
'name', "name's", '' print str(12345) => '12345' - 清單。 例如:
x = [1, [2, 'free'], 5] y = [0, 1, 2, 3] y.append(5) print y => [0, 1, 2, 3, 5] y.reverse() print y => [5, 3, 2, 1, 0] y.sort() print y => [0, 1, 2, 3, 5] print list("apple") => ['a', 'p', 'p', 'l', 'e'] print list((1,2,3,4,5)) => [1, 2, 3, 4, 5] test = "This is a test" test.index("test") => 10 test.index('s') => 3
下列清單包含運算子的範例:
- x 或 y
僅當 x 為 false 時才會評估 y。 例如:
print 0 or 1 => 1 - x 和 y
只有在 x 為 true 時才會評估 y。 例如:
print 0 and 1 => 0 - x + y , x-y
加法和連結,減法。 例如:
print 6 + 7 => 13 text1 = 'Something' text2 = ' else' print text1 + text2 => Something else list1 = [0, 1, 2, 3] list2 = [4, 5, 6, 7] print list1 + list2 => [0, 1, 2, 3, 4, 5, 6, 7] print 10 - 5 => 5 - x * y , x/y , x% y
乘法和重複、除法、餘數和格式。 例如:
print 5 * 6 => 30 print 'test' * 3 => test test test print 30 / 6 => 5 print 32 % 6 => 2 - x [i] , x [i:j] , x (...)
檢索、切割、函數呼叫。 例如:
test = "This is a test" print test[3] => s print test[3:10] => s is a print test[5:] => is a test print test[:-4] => This is a print len(test) => 14 - <, <=, >, >=, ==, <>, !=, is is not
比較運算子、身分測試。 例如:
L1 = [1, ('a', 3)] L2 = [1, ('a', 2)] L1 < L2, L1 == L2, L1 > L2, L1 <> L2, L1 != L2, L1 is L2, L1 is not L2 => (0, 0, 1, 1, 1, 0, 1)
反斜線替代
如果陳述式必須跨越多行,您也可以在前一行的結尾新增反斜線 (\) ,以指出您將繼續下一行。 請勿在反斜線字元之後使用空格字元,特別是 Tab 或空格。 例如:
text = "This is a test of a long lines" \
" continuing lines here."
print text
=> This is a test of a long lines continuing lines here.功能和範圍
def 陳述式來定義函數。 功能相關陳述包括:def,returndef陳述式會建立函數object,並將它指派給名稱。return陳述式會將結果物件傳回給呼叫程式。 這是選用項目,如果不存在,則函數會結束,以便控制流程脫離函數主體。globalglobal陳述式宣告要指派的模組層次變數。 依預設,在函數中指派的所有名稱都是該函數的本端名稱,且只有在函數執行時才存在。 如果要在含括模組中指派名稱,請列出廣域陳述式中的函數。
定義函數的基本語法如下:
def name (arg1, arg2, ... ArgN)
statements
return value其中 name 是所定義函數的名稱。 後面接著左括弧、右括弧及冒號。 括弧內的引數包括程序的參數清單。 冒號後面的下一行是函數的主體。 形成函數主體的指令群組。 定義 Jython 函數之後,就會像任何內建函數一樣使用它。 例如:
def intersect(seq1, seq2):
res = []
try:
for x in seq1:
if x in seq2:
res.append(x)
except:
pass
return res若要呼叫此函數,請使用下列指令:
s1 = "SPAM"
s2 = "SCAM"
intersect(s1, s2)
=> [S, A, M]
intersect([1,2,3], (1.4))
=> [1] 註解
在 Jython 語言中使用井號字元 (#) 進行註解。
指令行引數
Jython Shell 會將指令行引數傳遞至 Script ,以作為 sys.argv的值。 在 wsadmin Jython 中,程式或 Script 的名稱不是 sys.argv的一部分。 與 wsadmin Jython 不同, Jython 獨立式會將 Script 檔作為 Script 的起始引數。 因為 sys.argv 是陣列,所以請使用 index 指令從引數清單中擷取項目。 例如, test.py 採用三個引數 a、b 及 c。
wsadmin -f test.py a b ctest.py 內容:
import sys
first = sys.argv[0]
second = sys.argv[1]
third = sys.argv[2]
arglen = len(sys.argv)基本陳述式
有兩個迴圈陳述式: while 和 for。 條件式陳述式為 if。 錯誤處理陳述式為 try。 最後,有一些陳述式可細部調整控制流程: break、 continue及 pass。
- 假設
if陳述式會選取要執行的動作。if陳述式可能包含其他陳述式,包括其他if陳述式。if陳述式後面可以接著一或多個選用的elif陳述式,並以選用的else區塊結尾。if 的一般格式如下:
if test1 statements1 elif test2 statements2 else statements3例如:
weather = 'sunny' if weather == 'sunny': print "Nice weather" elif weather == 'raining': print "Bad weather" else: print "Uncertain, don't plan anything"- 當
while陳述式由具有測試表示式的標頭行、一個以上縮排陳述式的主體,以及在控制項結束迴圈而不進入 break 陳述式時執行的選用else陳述式所組成。 只要標頭行中的測試繼續評估 true 值,while陳述式就會反覆地執行縮排陳述式的區塊。while的範例如下:while test1 statements1 else statements2例如:
a = 0; b = 10 while a < b: print a a = a + 1- 如需
for陳述式以標頭行開頭,該標頭行指定一或多個指派目標,以及您要逐步執行的物件。 標頭後面接著您要重複的縮排陳述式區塊。for陳述式的範例如下:for target in object: statements else: statements它會逐一將序列物件中的項目指派給目標,並針對每一個項目執行迴圈主體。 迴圈主體通常使用指派目標來參照序列中的現行項目,就像游標逐步執行序列一樣。 例如:
sum = 0 for x in [1, 2, 3, 4]: sum = sum + x- break、continue 及 pass
您可以使用
break、continue及pass陳述式來控制迴圈。break陳述式會跳出最接近的含括迴圈 (超出整個迴圈陳述式)。continue陳述式會跳至最接近之含括迴圈的開頭 (跳至迴圈的標頭行) ,而pass陳述式是空的陳述式位置保留元。- try
如果以錯誤的引數數目呼叫陳述式,或它偵測到其實作特有的某個錯誤狀況,則陳述式會產生錯誤。 未處理的錯誤會停止執行 Script。
try陳述式用來設陷這類錯誤。 Pythontry陳述式有兩個特性,一個用來處理異常狀況,另一個用來執行最終化程式碼 (不論是否發生異常狀況)。try、except、else陳述式以一個 try 標頭行開頭,後面接著一個縮排陳述式的區塊,然後接著一或多個選用的除外條款,用來命名要捕捉的異常狀況,最後是選用的else子句。try,finally陳述式以 try 標頭行開頭,後面接著縮排陳述式的區塊,然後是 finally 子句,不論在 try 區塊執行時是否發生異常狀況,一律會在輸出路上執行。try、except、else函數的範例如下:try: statements except name: statements except name, data: statements else statements例如:
try: myfunction () except: import sys print 'uncaught' , sys.exc_info() try: myfilereader () except EOFError: break else: process next line here
try 及 finally 的一般格式如下所示:
try statements finally statements例如:
def divide(x, y): return x / y def tester(y): try: print divide(8, y) finally: print 'on the way out...'
- 依預設,陳述式會循序執行。 陳述式通常會在其出現行的結尾結束。 當陳述式太長而無法填滿單一行時,您也可以在前一行的結尾新增反斜線 (\) ,以指出您要繼續下一行。
- 會自動偵測區塊及陳述式界限。 程式碼區塊周圍沒有大括弧或開始或結束定界字元。 相反地, Python 語言會使用標頭下陳述式的縮排,以將陳述式分組在巢狀區塊中。 行縮排會偵測區塊界限。 所有縮排相同距離的陳述式都屬於相同的程式碼區塊,直到該區塊以無縮排行結束為止。
- 複合陳述式 = 標頭; ':' ,縮排陳述式。 Python 語言中的所有複合陳述式都遵循相同的型樣: 以冒號結尾的標頭行,後面接著一個以上縮排在標頭下的巢狀陳述式。 縮排陳述式稱為區塊。
- 通常會忽略空格和註解。 陳述式和表示式內的空格幾乎一律會被忽略 (字串常數和縮排除外) ,註解也會被忽略。
使用另一個 Script 來呼叫 Script
使用 execfile 指令,從另一個 Jython Script 呼叫 Jython Script。 例如:
建立稱為 test1.py 的 Script ,其中包含下列各項:
execfile('c:/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')execfile('/temp/script/testFunctions.py')
print printName('Cathy', 'Smith')建立稱為 testFunctions.py 的 Script ,其中包含下列各項:
def printName(first, last):
name = first + ' ' + last
return name然後傳遞下列路徑作為 Script 引數:
wsadmin -lang jython -f 'c:/temp/script/test1.py'wsadmin -lang jython -f '/temp/script/test1.py'您必須使用正斜線 (/) 作為路徑分隔字元。 反斜線 (\) 無法運作。
執行使用套件的 Jython Script
如果您執行使用套件的 Script ,則必須為 wsadmin 工具提供使用套件之 Jython Script 的搜尋路徑。
如果要將這項資訊提供給 wsadmin 工具,當您啟動工具時,請包含下列選項:
-Dwsadmin.script.libraries.packages=path1;path2;...其中 dir1 和 dir2 代表包含 Jython 套件之程式庫的目錄搜尋路徑。
搭配 Microsoft Windows 目錄的 Jython 用法
Jython 會將下列字元或條件清單視為特殊。 若可能的話,在使用 Jython 時,請勿使用這些字元。
- \a
- \b
- \f
- \n
- \N
- \r
- \t
- \u
- \U
- \v
- \x
- 反斜線後面接著 0 到 7 之間的一連串數字
在 Jython 中指定 Microsoft Windows 檔案路徑時,您必須瞭解這些特殊條件。 當您必須使用任何這些字串時,您可以使用「兩個反斜線」而非一個反斜線,或以正斜線取代單一反斜線,來抵消這些特殊字串的 Jython 解譯。 下列範例說明如何進行這些調整。
| 錯誤路徑 | 已更正雙反斜線路徑 | 已更正正斜線路徑 |
|---|---|---|
c:\aadirectory\myfile.txt |
c:\\aadirectory\\myfile.txt |
c:/aadirectory/myfile.txt |
c:\myfiles\number1.txt |
c:\\myfiles\\number1.txt |
c:/myfiles/number1.txt |
c:\zebra7\stripe.txt |
c:\zebra7\\stripe.txt |
c:/zebra7/stripe.txt |
c:\5mod\Net33\residue.log |
c:\\fivemod\\Net33\\residue.log |
c:/fivemod/Net33/residue.log |