2010年11月28日 星期日

SoftEther設定教學

在大陸出差通常會遇到一個問題,那就是有一些網路被擋掉~
這個時候,通常會使用到網路無國界的軟體~

但是,我們並不知道這一些封包如何被對方使用,所以,最好還是自己來架一個VPN比較安全。

2004年左右,在日本有一位大學生研發了一個虛擬軟體,它可以虛擬一個網卡,而這一張虛擬網卡可以連到某一台電腦(Server),而這一台電腦(Server端)的網路並沒有被限制,這個時候,我們就會把封包傳送到這一個虛擬網卡,而虛擬網卡再把資料送到Server端,並且由Server端把要求送出去。

如此一來,我們上網也不會有所限制了。

但是,在當時,日本有提供一個Server當作一個預設的Hub,讓所有的使用者可以連到這一個Server並且再連出去,但是,現在那一個Server已經停用了。所以,我們必需自己建立一個Server。

在設定User的設定時,請按照下面的設定
Virtual HUB ID : 0
You can set user's Security Option. Enter Y or 1 to enable option. Enter N or 0 to disable option.
Press only Enter key to no change. Deny Connect (Off) :0
Disable Session Reconnect (Off) :0
Force to use IP Addess allocated by DHCP Server (Off) :0
Limit to 1 IP Address to use. (Off) :0
Limit to 1 MAC Address to use. (Off) :0
Do not use existing IP Address (Off) :1
Do not use existing MAC Address (Off) :1
Do not send Broadcast Packet (Off) :0
Do not send DHCP ACK Packet (Off) :1
Filter ALL DHCP Packets (Off) :1


詳細的設定以後有空再寫,先參照以下的參考資料吧~

參考資料:
SoftEther 安裝與設定。Virtual HUB & Virtual Lan,Server 端 & Clinet端
SoftEther Server端與Client端之設定
SoftEther - 好用的虛擬HUB
Softether 英文版下載 | 連線教學

2010年11月7日 星期日

BAT大補帖 - 測驗 (07)

下面兩個指令,請直接在指令列上練習~~
ECHO Hello World!!>file.txt
Hello World!!存到file.txt中;若檔案不存在,則會產生這一個file.txt檔案;若檔案已經存在,則把這一個檔案的內容清除。並且把Hello World!!存到檔案中

ECHO Hello BAT!!>>file2.txt
Hello World!!存到file2.txt中;若檔案不存在,則會產生這一個file2.txt檔案;若檔案已經存在,則在這一個檔案的內容最後加入Hello BAT!!

========== 測驗開始 ==========

1. 印出目前所在資料夾的名稱,例如,目前在C:\windows\newfile,則印出newfile
提示: GOTO, ECHO, FOR, %CD%

解答:
exercise_a.bat

@ECHO OFF
SET MYPATH=%CD%
:Search
FOR /F "tokens=1,* delims=\ " %%p IN ("%MYPATH%") DO (
SET MYPATH=%%~q
SET Current=%%~p
)
IF "%MYPATH%" NEQ "" GOTO :Search
ECHO %Current%
PAUSE


2. 若有一個設定檔為setting.ini,內容為
; This is setting file for test
; When ShowMoneyFlag is ON, the system will show money string
ShowMoneyFlag=OFF
; When ShowYou in ON, the system will show the username
ShowYou=ON


讓使用者透過修改setting.ini可以改變顯示的文字~並且把結果存到result.txt
提示: ECHO, FOR, IF, SET

解答:
exercise_b.bat
@ECHO OFF
FOR /F "eol=; tokens=1-2 delims==" %%i IN (setting.ini) DO (
SET %%~i=%%~j
)

IF /I "%ShowMoneyFlag%" EQU "ON" (
ECHO Show money!!
ECHO Show money!!>result.txt
) ELSE (
ECHO NoMoney!!
ECHO NoMoney!!>result.txt
)

IF /I "%ShowYou%" EQU "ON" (
ECHO Hello %UserName%
ECHO Hello %UserName%>>result.txt
)
PAUSE

BAT大補帖 - Call (06)

若要寫大型的BAT程式,CALL這一個指令就絕對不可以忽略~

它可以提高程式的reuse,可以讓程式更精簡!

CALLGOTO最大的不同在於
GOTO是直接跳到設定的LABEL,並且不會跳回來。
CALLGOTO :EOF配合,當被跳到目的的程式執行完時(執行到GOTO :EOF),會跳回執行CALL的程式的下一行。

例:
call_a.bat

@ECHO OFF
ECHO Hello World!!

CALL :Money

ECHO Good Morning!!

CALL :Money

GOTO :END

:Money
ECHO Hello Money!!
GOTO :EOF

:END
PAUSE

大家想像一下,若:Money這一段的程式有到一百行,你執行兩次CALL :Money不就節省了一百行的指令嗎?
若有寫過C語言的話,那就把GOTO :EOF當作return這一個關鍵字吧~

同時,call指令後面可以接傳入的參數。
例:
call_b.bat
@ECHO OFF
ECHO Hello World!!

CALL :Money 100 "300 - 200"

ECHO Good Morning!!

CALL :Money 200 "400 - 200"

GOTO :END

:Money
ECHO Hello %1 Money!!
ECHO The procedure is %~2
GOTO :EOF

:END
PAUSE


第一個CALL後面會接兩個參數,分別是100"300 - 200",而為什麼要用雙引號把它括起來哩~因為,BAT是以空白當作參數的區隔,所以,若你傳入的參數中內含空白的話,就必需要用雙引號把它括起來。

%1分別%~2分別就是代表傳進來的參數,另外,為什麼%1不需要加~
%~2中間確需要加入~這一個符號哩,有加~符號的,會把參數的值的雙引號移除掉,當然,若他本身沒有雙引號的話,~這一個就沒有效果~

平常在執行BAT檔後面也可以輸入參數~
例:
call_c.bat
@ECHO OFF
IF /I "%~1" EQU "ccd9527" (
ECHO HELLO CCD9527!!
) ELSE (
ECHO HELLO EVERYONE!!
)
PAUSE


執行的時候,請用以下兩個方式分別執行
%> call_c.bat ccd9527

%> call_c.bat
透過這一個方式,可以讓使用者決定要使用哪一個流程~非常之好用~

另外,要善用說明檔~
help印出目前系統可以使用的指令
CALL /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
CALL

BAT大補帖 - goto(05)

有時候程式的流程不是一定由上面執行下來的,若可以又上面執行下來,同時也可以由下面跳到上面執行,這樣程式是不是會更彈性哩~

GOTO這一個指令,就可以做到這樣的事情。它可以讓程式流程跳到這一個程式碼中的某一個LABEL

LABEL就是在程式碼的某一點加上一個代號,這樣,就可以讓程式跳到這一個程式碥這一點。

例:
Jump.bat

@ECHO OFF
GOTO :Start

:Money
ECHO Momey
GOTO :END

:Start
ECHO Hello World!!
GOTO :Money

:END
PAUSE

以上的例子,程式的流程就不是由上依序往下跑的~

另外,要善用說明檔~
help印出目前系統可以使用的指令
GOTO /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
GOTO

2010年11月4日 星期四

BAT大補帖 - for(04)

接下來要介紹的是For的這一個指令。

FOR的這一個指令功能之多,有一些非迴圈的功能都隱藏在FOR這一個指令裡面。

列印1,3,5,7,9

@ECHO OFF
FOR /L %%P IN (1,2,10) DO (
echo %%P
)
PAUSE

這裡要注意,如果要在批次程式中使用FOR命令,請指定%%p,而不要指定%%P。 變數名稱有大小寫的區分,所以%%p不同於%%P

若有一個檔案,myfile.txt,內容如下
; This is sample code start
a1,a2,a3,a4,a5,a6
b1,b2,b3,b4,b5,b6
c1,c2,c3,c4,c5,c6
d1,d2,d3,d4,d5,d6
; This is sample code end

file.bat
@ECHO OFF
FOR /F "eol=; tokens=2,3* delims=, " %%i in (myfile.txt) do (
echo first: %%i
echo second: %%j
echo other: %%k
)

eol表示當我是由;開頭的行,我就不去分析它。
因為,FOR這一個指令在讀取檔案,並且去分析的時候,是以一行為單位。
由第一行開始讀取時,發現是由;開頭的,程式就會直接忽略第一行
; This is sample code start
繼續分析下一行。

FOR的檔案分析,其實就是把每一行的內容分成許多欄位,而delims就是設定由哪一些符號當作分格符號。例如這一個例子中,我們是以,空白字元當作分格符號。因此,第二行就會被分割成以下欄位。
第一欄: a1
第二欄: a2
第三欄: a3
第四欄: a4
第五欄: a5
第六欄: a6

而我們把這一行分成這麼多欄位,我們不一定會每一個欄位都拿來使用。而tokens就是表示說,我只要拿哪一些欄位。
若我只設定tokens=2-4
那這一個意思是說,我只會拿出欄位2欄位4來做處理。

那拿出來的數值,會被存放在哪一個檔數中呢?
這就取決於我們設定於後面的%%i
所以,我們選用的第一的欄位會被放在%%i,而選用的第二個欄位會被放在%%j
所以,在我們file.bat的這一個例子中,在分析第二行(非註解的第一行)時,%%i裡面的內容就會是a2,而%%j的內容就會是a3

相信你應該有注意到(指)
那tokens=2,3後面接的*是什麼意思呢?
而我只有選用兩個欄位而已(2與3),怎麼%%k裡面會有內容哩?

沒有錯,若你在tokens最後面有加*的話,那麼在這一行沒有被選用的剩於的部分,會被存放在你還沒有使用的下一個變數中,這一個例子中,%%i存放a2%%j存放a3,所以,%%k就會存放a4,a5,a6

我們可以對檔案內容分析之外,我們也可以對變數做分析
例如:我們對PATH這一個變數做分析~
我們把PATH裡面第一個欄位與第三個欄位印出來
variable.bat
@ECHO OFF
ECHO Original: %PATH%
FOR /F "tokens=1,3 delims=;" %%I IN ("%PATH%") DO (
ECHO first: %%I
ECHO third: %%J
)
PAUSE


另外,也可以分析執行完指令後的結果~
result.bat
@ECHO OFF
type myfile.txt
ECHO.
ECHO.
FOR /F "eol=; tokens=2,3* delims=," %%i IN ('type myfile.txt') DO (
echo first: %%i
echo second: %%j
echo other: %%k
)
PAUSE

這裡用到一個新的指令,type,這一個指令會把後面接的檔案的內容顯示在終端機上~

另外,要善用說明檔~
help印出目前系統可以使用的指令
FOR /?
TYPE /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
FOR
TYPE

2010年11月3日 星期三

BAT大補帖 - IF (03)

在Script中,我們並不會希望每一行指令被執行,而是當目前的情況符合某一些情況時,就去執行某一部分的程式碼。

這個時候就要用到IF這一個關鍵字。

判斷使用者是否為CCD9527,若是,就跟CCD9527打招呼~若不是就跟大家打招呼~
if01.bat

@ECHO OFF
IF "%USERNAME%" EQU "CCD9527" (
ECHO HELLO CCD9527
) ELSE (
ECHO HELLO EVERYBODY
)
PAUSE

這裡要注意的是,在變數與要比較的數值最好都用雙引號括號起來,避免變數的內容值有空白字元,會造成判斷錯誤。

判斷file.txt是否存在
@ECHO OFF
IF EXIST "file.txt" (
ECHO THE file.txt EXIST
) ELSE (
ECHO THE file.txt DOES NOT EXIST
)
PAUSE


若要忽略大小寫字元的比較,要加個/I,如下的範例
@ECHO OFF
IF "A" EQU "a" (
ECHO A EQUAL a
)
IF /I "B" EQU "b" (
ECHO B EQUAL b
)
PAUSE


如何判斷%VALUE%這一個變數是否有被設定過?
@ECHO OFF
IF "%VALUE% EQU "" (
ECHO THE VALUE DOES NOT SET.
) ELSE (
ECHO THE VALUE IS %VALUE%
)
PAUSE


另外,要善用說明檔~
help印出目前系統可以使用的指令
IF /?
通常裡面會有很多解釋和例子,值的參考!!

[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
IF

2010年11月2日 星期二

BAT大補帖 - SET (02)

這裡要介紹的是SET指令。若ECHO是輸出指令,那麼SET就是設定與輸入指令。

以下的例子就是設定YourName變數的內容為ccd9527,那麼要如何確認YourName變數內容是正確的哩?當然就是使用ECHO來確認囉~
yourname.bat

@ECHO OFF
SET YourName=ccd9527
ECHO Your Name is %YourName%
PAUSE


在與使用者的互動中,除了可以印出字串給使用者看的ECHO指令,用來接收使用者的輸入指令SET也是另一個重要的角色。
SET後面加一個/P的參數,後面可以提示使用者輸入的提示,當使用者輸入,則會被存到前面的變數!
yourname.bat
@ECHO OFF
SET /P YourName="Please input your name: "
ECHO Your Name is %YourName%
PAUSE


在BAT中,預設是把所有的變數內容當作字串來使用,若要把內容當作數字作加減運算時,必需要加上/A的參數。
add.bat
@ECHO OFF
SET VALUE=1
ECHO %VALUE%
SET /A VALUE=%VALUE%+1
ECHO %VALUE%
PAUSE


若單單只有打SET指令,後面沒有接任何參數,則會列出目前所有環境變數的資料。
若能善用這一些環境變數,將會大大簡化程式碼的大小,而且也會更彈性喔~
env.bat
@ECHO OFF
SET
PAUSE

有幾個動態環境變數會被展開但是不會出現在SET所顯示的環境變數列表中
%CD% - 展開為含目前目錄的字串。
%DATE% - 展開為與 DATE 命令格式相同的目前日期字串。
%TIME% - 展開為與 TIME 命令格式相同的目前時間字串。
%RANDOM% - 展開為一個在 0 和 32767 之間的整數亂數值。
%ERRORLEVEL% - 展開為目前的 ERRORLEVEL 值
%CMDEXTVERSION% - 展開為目前的命令處理擴充功能的版本號碼。
%CMDCMDLINE% - 展開為執行命令處理器前的原始命令列。

只有在bat檔案有用的環境變數
%~dp0 - 表示被執行的bat檔的所在位置

另外,要善用說明檔~
help印出目前系統可以使用的指令
SET /?
通常裡面會有很多解釋和例子,值的參考!!

進階用法
Q: 若有一個變數VALUE的內容值為12 34,如何把空白填成0
A:
switch.bat
@ECHO OFF
SET VALUE=12 34
ECHO %VALUE%
ECHO %VALUE: =0%
PAUSE

[2010.11.06 補充]
這裡的意思是說,把變數裡面的空白字元0這一個字元來取代~
我所知道在處理%time%這一個變數會用到!
請在晚上十二點過後到早上十點之前執行ShowTime.bat這一個檔案,很恐怖,請做好心理準備後在服用~
ShowTime.bat

因為,在bat檔中,空白字元是當作分格參數的特殊字元,有時候很讓人討厭(會造成程式流程錯誤),所有,有時候,我們必需有以上的處理!

@ECHO OFF
Set Now=%TIME%
ECHO %Now%
ECHO %Now: =0%
PAUSE


Q: 如何印出字串,但是,確不換行,再輸入第一筆資料?
A:
NotTurnLine.bat
@ECHO OFF
SET /P=First<NUL
SET /P=Second<NUL
PAUSE


[總結]
在這裡,你應該學會了以下指令或關鍵字的用法
SET