2008年11月18日 星期二

如何用VBA or VB6將Excel資料匯出到Access 資料庫

Sub test()
Dim cn As Object
Dim rs As Object
Dim rs2 As Object
Dim i As Long
Dim iCount As Long
Set cn = CreateObject("adodb.connection")
Set rs = CreateObject("adodb.recordset")
Set rs2 = CreateObject("adodb.recordset")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\db1.mdb;Persist Security Info=False"
rs.cursorlocation = 3
rs.Open "Select * From NewData", cn, 1, 3
For i = 1 To 65535
iCount = 0
If Range("A" & i).Text <> "" Then
If rs2.State = 1 Then rs2.Close
rs2.cursorlocation = 3
rs2.Open "Select * From NewData where [編號]=" & Range("A" & i).Text, cn, 0, 1 '數字要這樣
'rs2.Open "Select * From NewData where 編號='" & Range("A" & i).Text & "'", cn, 0, 1 '文字改這樣
iCount = rs2.RecordCount
End If
If iCount = 0 Then
rs.addnew
rs("編號") = IIf(Range("A" & i).Text = "", Null, Range("A" & i).Text)
End If
rs("名稱") = IIf(Range("B" & i).Text = "", Null, Range("B" & i).Text)
rs("數量") = IIf(Range("C" & i).Text = "", Null, Range("C" & i).Text)
If rs("編號") & "" = "" And rs("名稱") & "" = "" And rs("數量") & "" = "" Then
rs.cancelupdate
Exit For
End If
rs.Update
Next
End Sub

2008年10月2日 星期四

SET NO_BROWSETABLE ON

在 SQL Server 線上叢書 》, " FOR 子句 」 主題不包含完整的資訊。 這份文件包含其他資訊將會包含在 「 FOR 子句 」 主題中的引數 " BROWSE 」 一節。 此外, 本文也將告訴您的案例中, 說明其他資訊。

其他相關資訊


引數 " BROWSE 」 一節中的 " " 引數 ] 區段的 SQL Server 線上叢書 》 主題 「 FOR 子句 」 包括下列資訊:


請注意 當唯一索引鍵資料行的資料表可以接受 Null 值, 和資料表是在內部端的外部聯結作業, 瀏覽模式就不支援索引。


瀏覽模式可讓您掃描您的 SQL Server 資料表中資料列並在同一時間更新您的資料表一個資料列中的資料。 若要存取 SQL Server 資料表在您應用程式在瀏覽模式, 您必須使用的下列兩個選項之一:
必須以關鍵字 FOR BROWSE 結尾 SELECT 陳述式, 讓您用來從您的 SQL Server 資料表存取資料。 當您開啟 FOR BROWSE 選項設定為使用瀏覽模式, 會建立暫存資料表。
您必須執行下列 Transact - SQL 陳述式以瀏覽模式開啟藉由使用 NO_BROWSETABLE 選項:
SET NO_BROWSETABLE ON
當您開啟於 NO_BROWSETABLE 選項, 所有 SELECT 陳述式行為就好像 FOR BROWSE 選項會附加至陳述式。 不過, NO_BROWSETABLE 選項並不會建立暫存表格, FOR BROWSE 選項通常會用來將結果傳送到您的應用程式。
當您試著存取從 SQL Server 資料表中的資料瀏覽模式藉由使用 SELECT 查詢牽涉到的外部聯結陳述式, 而且唯一索引定義在資料表已存在於內部的外部聯結陳述式, 端時, 瀏覽模式不支援唯一索引。 只有當所有索引鍵資料行唯一索引可接受 Null 值瀏覽模式支援唯一索引。 瀏覽模式不支援唯一索引, 如果下列條件為真:
您嘗試藉由使用 SELECT 查詢牽涉到外部聯結陳述式從 SQL Server 資料表在瀏覽模式下存取資料。
唯一索引定義在資料表已存在於內部端的外部聯結陳述式。
如果要重現此行為在瀏覽模式, 請依照下列步驟執行:
1.啟動 SQL Server Management Studio, 然後再連接到 SQL Server 2005 的執行個體。
2.建立資料庫, 並命名 SampleDB 資料庫。
3.在資料庫, SampleDB 建立 tleft 資料表和兩者都包含單一資料行 c 1, 並命名為 「 tright 資料 」 資料表。 在 tleft 資料表, 中的資料行 c 1 上定義唯一的索引, 將資料行設定為接受 Null 值。 在適當的查詢視窗中如果要執行這項操作, 執行下列 Transact - SQL 陳述式:

CREATE TABLE tleft(c1 INT NULL UNIQUE)
GO
CREATE TABLE tright(c1 INT NULL)
GO
4.在資料 tleft 表與 tright 資料表中插入多個值。 請確定在 tleft 資料表中, 插入 Null 值。 若要執行這項, 在 [ 查詢 ] 視窗執行下列 Transact - SQL 陳述式:

INSERT INTO tleft VALUES(2)
INSERT INTO tleft VALUES(NULL)
INSERT INTO tright VALUES(1)
INSERT INTO tright VALUES(3)
INSERT INTO tright VALUES(NULL)
GO
5.開啟 [ NO_BROWSETABLE 選項。 若要執行這項, 在 [ 查詢 ] 視窗執行下列 Transact - SQL 陳述式:

SET NO_BROWSETABLE ON
GO
6.可以在 SELECT 查詢使用外部聯結陳述式存取資料 tleft 表與 tright 資料表中的資料。 請確定該 tleft 資料表是在內部端的外部聯結陳述式。 若要執行這項, 在 [ 查詢 ] 視窗執行下列 Transact - SQL 陳述式:

SELECT
tleft.c1
FROM
tleft RIGHT JOIN tright
ON
tleft.c1 = tright.c1
WHERE
tright.c1 <> 2
請注意結果 ] 窗格中下列輸出:
c1
----
NULL
NULL
在您執行 SELECT 查詢, 以存取資料表在瀏覽模式, 的 SELECT 查詢結果集包含兩個 Null 值為 tleft 資料表中資料行 c 1 之定義的右外部聯結陳述式, 因為。 因此, 在結果集中, 您無法區別 Null 值, 來自資料表和 Null 值, 引入右外部聯結陳述式。 如果您必須忽略 Null 值從結果集可能會收到不正確的結果。


注意 如果 that are included in 唯一索引資料行不接受 Null 值, 在結果集中所有的 Null 值已引入由右外部聯結陳述式。

set FMTONLY on

--只顯示資料行名稱
set FMTONLY on
set FMTONLY off

2008年9月29日 星期一

DBCC SHRINKFILE

1.先備份Log檔
BACKUP LOG EF2KWeb WITH TRUNCATE_ONLY

2.指定要壓縮的資料庫
USE EF2kWeb

3.找到資料庫的fileid
select fileid,groupid,name from sysfiles where groupid=0
>>結果fileid=7

4.以下語法將EF2kWeb的LOG檔壓縮為2M
DBCC SHRINKFILE(fileid,要壓縮成的大小)
DBCC SHRINKFILE(7,2)

SQL 2005
select * from sys.master_files

2008年9月22日 星期一

如何設定 SQL Server 2005 為允許遠端連接

注意:本文是不經人為參與的自動機器翻譯系統翻譯完成。這些文章是Microsoft為非英語系國家使用者所提供,讓使用者可以了解文章的內容。Microsoft 不保證翻譯的語言品質也不對由於內容的錯譯或客戶針對內容使用所發生的任何直接或間接可能的問題負責。
INTRODUCTIONloadTOCNode(1, 'summary');當您嘗試從遠端電腦, 連線至 Microsoft SQL Server 2005 的執行個體可能會收到一則錯誤訊息。 這個問題的發生原因, 是當您使用任何程式, 來連線到 SQL Server。 例如, 當您使用 SQLCMD 公用程式來連線至 SQL Server 會收到下列錯誤訊息:
Sqlcmd: 錯誤已建立連線到伺服器時發生錯誤:: Microsoft SQL Native Client 連線至 SQL Server 2005 時,發生此失敗,可能是因為在預設設定下,SQL Server 不允許遠端連線。.在 SQL Server 2005 尚未設定為可接受遠端連接時, 可能就會發生這個問題。 根據預設值, SQL Server 2005 Express Edition 和 SQL Server 2005 Developer Edition 不允許遠端連線。 若要設定 SQL Server 2005 才能允許遠端連線, 請完成所有執行下列步驟:

啟用遠端連線的, 您要從遠端電腦連線到 SQL Server 執行個體上。

啟動 SQL Server Browser 服務。

設定防火牆, 以允許到 SQL Server 以及到 SQL Server Browser 服務相關的網路流量。本文告訴您如何完成每個步驟。
回此頁最上方
其他相關資訊loadTOCNode(1, 'moreinformation');若要啟用遠端連線的 SQL Server 2005 執行個體上並以開啟 SQL Server Browser 服務, 使用 SQL Server 2005 介面區組態工具。 當您安裝 SQL Server 2005 已安裝 「 介面區組態工具。
回此頁最上方
啟用遠端連線為 SQL Server Express 2005 或 SQL Server 2005 Developer EditionloadTOCNode(2, 'moreinformation');1.按一下 [ 開始 ] 指向 [ 程式集 ] , 指向 Microsoft SQL Server 2005 , 指到 組態工具 , 然後按一下 [ SQL Server 介面區組態 。2.在頁 SQL Server 2005 介面區組態 面, 按一下 [ 為服務 」 和連線 ] 介面區組態 (Surface Area Configuration 。3.為服務 」 和連線 ] 介面區組態 (Surface Area Configuration 頁面上展開 [ 資料庫引擎 , 按一下 [ 遠端連線 ] 按一下適當的通訊協定才能啟用為您的環境,、 按一下 [ 本機和遠端連線 、 及 [ 套用 ] 。注意[ 確定 ] Click當您收到下列訊息:
必須重新啟動資料庫引擎服務的變更連線設定值才會生效。4.為服務 」 和連線 ] 介面區組態 (Surface Area Configuration , 頁面上展開 資料庫引擎 、 按一下 [ 服務 ]、 按一下 [ 停止 ] 、 等候 MSSQLSERVER 服務停止, 並按一下 [ 開始 ] 以重新啟動 MSSQLSERVER 服務。
回此頁最上方
啟用 SQL Server Browser 服務loadTOCNode(2, 'moreinformation');重要事項這些步驟可能會增加您的安全性風險。 這些步驟可能也會使您的電腦或網路更容易遭受惡意使用者或惡意軟體 (例如病毒) 的攻擊。. 我們建議程序本文中所描述來啟用程式到上操作, 它們是設計用來, 或到實作特定的程式功能。 在進行這些變更之前,建議您先評估在特定環境中使用此程序的相關風險。. 如果您決定執行此程序,請採用任何其他的適當步驟,以協助保護您的系統。. 建議您只有在真正需要此程序時,才使用本程序。.
1.
按一下 [ 開始 ] 指向 [ 程式集 ] , 指向 Microsoft SQL Server 2005 , 指到 組態工具 , 然後按一下 [ SQL Server 介面區組態 。
2.
在頁 SQL Server 2005 介面區組態 面, 按一下 [ 為服務 」 和連線 ] 介面區組態 (Surface Area Configuration 。
3.
為服務 」 和連線 ] 介面區組態 (Surface Area Configuration 頁面上按一下 [ 瀏覽器 SQL Server ] , 按一下 [ 自動 為 [ 啟動類型 , 再然後按一下 [ 套用 ] 。會自動注意當您按一下 [自動 ]選項, SQL Server Browser 服務啟動每一次您啟動該 Microsoft Windows。
4.
按一下 [, [ 開始 ] 及 [ 確定 ] 。注意當您在電腦上, 執行 SQL Server Browser 服務電腦上顯示執行個體名稱及對於每個執行個體, 是執行在電腦上的 SQL Server 連線資訊。 由不啟用 SQL Server Browser 服務, 是由連接至的 SQL Server 執行個體直接透過指派的 TCP 通訊埠可以降低這個風險。 直接連線到 SQL Server 的執行個體 (Instance 通過 TCP 連接埠不在範圍內的這個發行項。 如需 SQL Server Browser 伺服器及連線到執行個體的 SQL Server, 請參閱 SQL Server 線上叢書 》 中的下列主題:

SQL Server Browser 服務

連線到 SQL Server 資料庫引擎

用戶端通訊協定網路組態
回此頁最上方
在 Windows 防火牆建立例外狀況loadTOCNode(2, 'moreinformation');如果您在執行 SQL Server 2005, 電腦執行防火牆外部連線至 SQL Server 2005 將無法, 除非 SQL Server 2005 和 SQL Server Browser 服務可以透過防火牆進行通訊。 您必須建立例外為每個執行個體的 SQL Server 2005, 您要接受遠端連線, 並且例外狀況為 SQL Server Browser 服務。當您安裝程式檔案 SQL Server 2005 使用的執行個體識別碼作為一部份的路徑。 您要為每個 <這個 SQL Server, 建立例外狀況必須識別正確的執行個體識別碼。 如果要取得的執行個體識別碼, 請依照下列步驟執行:
1.
按一下 [ 開始 ] 指向 [ 程式集 ] , 指向 Microsoft SQL Server 2005 , 指到 組態工具 , 然後按一下 [ SQL Server 組態管理員 。
2.
在 SQL Server 組態管理員, 按一下 SQL Server Browser 服務在右邊窗格、 以滑鼠右鍵按一下 [ 主視窗, 中的執行個體名稱及 [ 內容 ] 。
3.
在 SQL Server 內容瀏覽器 ] 頁面, 按一下 [ 進階 ] 索引標籤在屬性清單上, 找出執行個體識別碼, 然後按一下 [ 確定 ] 。若要開啟 [ Windows 防火牆, 請按一下 [ 開始 ] 按一下 [ 執行 ] , 鍵入 firewall.cpl , 然後按一下 [ 確定 ] 。
為 SQL Server 2005 在 [ Windows 防火牆 ] 中建立例外狀況loadTOCNode(3, 'moreinformation');1.在 Windows 防火牆, 再按一下 [ 例外 ] 索引標籤, 及 [ 新增程式 。2.在程式視窗, [ 按一下 [ 瀏覽 ] 。3.按一下 [ C: \Program Files \Microsoft SQL Server\ MSSQL.1 \MSSQL\Binn\sqlservr.exe 可執行程式按一下 [ Open , 然後按一下 [ 確定 ] 。注意可能會根據已安裝 SQL Server 2005 的位置不同的路徑。MSSQL.1是預留位置為執行個體識別碼, 您在步驟 3 的前一個程序中取得。4.對於每個執行個體的 SQL Server 2005 所需例外狀況重複步驟 1 到 3。
在 [ Windows 防火牆 ] 中建立為 SQL Server Browser 服務例外loadTOCNode(3, 'moreinformation');1.在 Windows 防火牆, 再按一下 [ 例外 ] 索引標籤, 及 [ 新增程式 。2.在程式視窗, [ 按一下 [ 瀏覽 ] 。3.按一下 [ C: \Program Files \Microsoft SQL Server\90\Shared\sqlbrowser.exe 可執行程式按一下 [ Open , 然後按一下 [ 確定 ] 。注意可能會根據已安裝 SQL Server 2005 的位置不同的路徑。

2008年9月4日 星期四

方便好用的FileSystemObject

方便好用的FileSystemObject

從VB6.0起,VB新增了FileSystemObject物件,這個物件可以取代以往許多要用API才能做到的事,如覆製資料夾、取得磁碟機資訊等,在作一些相關處理時可以節省不少時間。要引用這個項目你必須以設定引用項目將 Microsoft Scripting Runtime手動加入專案,否則是沒有辦法使用的!我來概略說明一下使用的方法和功能

Dim fso as New FileSystemObject
FileSystemObject本身就已經有許多的方法可以使用了
包括資料夾複製、檔案複製
fso.CopyFolder "C:\ABC","C:\DEF"
fso.FileCopy "c:\123.txt","c:\456.txt"
建立資料夾
fso.CreateFolder "C:\ABC"
建立文字檔
fso.CreateTextFile "c:\123.txt"
刪除資料夾、檔案
fso.DeleteFolder "C:\ABC"
fso.DeleteFile "c:\123.txt"
取得Windows路徑,System路徑
fso.GetSpecialFolder(WindowsFolder)
fso.GetSpecialFolder(SystemFolder)


取得所有的磁碟機
磁碟機總數(包含網路磁碟機等) - fso.Drives.Count

取得所有磁碟機物件
Dim Drivetemp As Drive
ReDim DriveObject(1 To fso.Drives.Count)
Dim i As Integer

For Each Drivetemp In fso.Drives
i = i + 1
Set DriveObject(i) = Drivetemp
Next

經由該物件的屬性可以得知許多事,列舉常用的幾個
DriveObject的使用說明
查詢該磁碟機的可用空間
.AvailableSpace .FreeSpace
這兩個屬性都可以查出剩餘空間,我還看不出有什麼不同
查詢該磁碟機的總容量
.TotalSize

磁碟機的代碼
.DriveLetter .RootPath
DriveLetter只有代碼,RootPath則可查出根目錄的路徑
磁碟機的類別
.DriveType
傳回值分別代表
Unknown - "無從判斷"
Removable - "抽取式磁碟"
Fixed - "硬碟"
Remote - "遠端(網路)儲存裝置"
CDRom - "光碟機"
RamDisk - "RAM Disk"



取得資料夾的資料
Dim fs As New FileSystemObject ' 建立 FileSystemObject
Dim fd As Folder ' 宣告 Folder 物件
Dim i As Integer

Set fd = fs.GetFolder("c:\")
取得子資料夾的總數 - fd.SubFolders.Count

ReDim sfd(1 To fd.SubFolders.Count) As Folder
For Each fd In fd.SubFolders
i = i + 1
Set sfd(i) = Folder
List1.AddItem sfd(i).Name
Next

這個方法只能取得一層子資料夾,如果要取得所有資料夾則
須利用遞迴重覆執行

Folder的屬性比較特殊的是ShortPath可以直接取得該
Folder的短檔名及DateCreated、DateLastAccessed、
DateLastModified可取得建立時間及變更時間等

至於File物件只要改用GetFile方法,其餘沒有什麼特別不同的方法

2008年7月3日 星期四

javascript新視窗

經常上網的朋友可能會到過這樣一些網站,一進入首頁立刻會彈出一個視窗,或者按一個連接或按鈕彈出,通常在這個視窗裏會顯示一些注意事項、版權信息、警告、歡迎光顧之類的話或者作者想要特別提示的信息。其實制作這樣的頁面效果非常的容易,只要往該頁面的HTML裏加入幾段Javascript代碼即可實現。下面俺就帶您剖析它的奧秘。
【1、最基本的彈出視窗代碼】

其實代碼非常簡單:

<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html')
-->
</SCRIPT>
因為著是一段javascripts代碼,所以它們應該放在<SCRIPT LANGUAGE="javascript">標簽和</script>之間。<!-- 和 -->是對一些版本低的瀏覽器起作用,在這些老瀏覽器中不會將標簽中的代碼作為文本顯示出來。要養成這個好習慣啊。
window.open ('page.html') 用於控制彈出新的視窗page.html,如果page.html不與主視窗在同一路徑下,前面應寫明路徑,絕對路徑(http://)和相對路徑(../)均可。用單引號和雙引號都可以,只是不要混用。
這一段代碼可以加入HTML的任意位置,<head>和</head>之間可以,<body>間</body>也可以,越前越早執行,尤其是頁面代碼長,又想使頁面早點彈出就盡量往前放。


【2、經過設置後的彈出視窗】

下面再說一說彈出視窗的設置。只要再往上面的代碼中加一點東西就可以了。
我們來定制這個彈出的視窗的外觀,尺寸大小,彈出的位置以適應該頁面的具體情況。
<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
file://寫成一行
-->
</SCRIPT>
參數解釋:
<SCRIPT LANGUAGE="javascript"> js腳本開始;
window.open 彈出新視窗的命令;
'page.html' 彈出視窗的文件名;
'newwindow' 彈出視窗的名字(不是文件名),非必須,可用空''代替;
height=100 視窗高度;
width=400 視窗寬度;
top=0 視窗距離屏幕上方的象素值;
left=0 視窗距離屏幕左側的象素值;
toolbar=no 是否顯示工具欄,yes為顯示;
menubar,scrollbars 表示菜單欄和滾動欄。
resizable=no 是否允許改變視窗大小,yes為允許;
location=no 是否顯示地址欄,yes為允許;
status=no 是否顯示狀態欄內的信息(通常是文件已經打開),yes為允許;
</SCRIPT> js腳本結束


【3、用函數控制彈出視窗】

下面是一個完整的代碼。
<html>
<head>
<script LANGUAGE="JavaScript">
<!--
function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar=
no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
file://寫成一行
}
file://-->
</script>
</head>
<body onload="openwin()">
...任意的頁面內容...
</body>
</html>
這裏定義了一個函數openwin(),函數內容就是打開一個視窗。在調用它之前沒有任何用途。
怎麼調用呢?
方法一:<body onload="openwin()"> 瀏覽器讀頁面時彈出視窗;
方法二:<body onunload="openwin()"> 瀏覽器離開頁面時彈出視窗;
方法三:用一個連接調用:
<a href="#" onclick="openwin()">打開一個視窗</a>
注意:使用的「#」是虛連接。
方法四:用一個按鈕調用:
<input type="button" onclick="openwin()" value="打開視窗">

【4、同時彈出2個視窗】

對源代碼稍微改動一下:
<script LANGUAGE="JavaScript">
<!--
function openwin()
{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
file://寫成一行
window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")
file://寫成一行
}
file://-->
</script>
為避免彈出的2個視窗覆蓋,用top和left控制一下彈出的位置不要相互覆蓋即可。最後用上面說過的四種方法調用即可。

注意:2個視窗的name(newwindows和newwindow2)不要相同,或者幹脆全部為空。OK?

【5、主視窗打開文件1.htm,同時彈出小視窗page.html】

如下代碼加入主視窗<head>區:
<script language="javascript">
<!--
function openwin()
{window.open("page.html","","width=200,height=200")
}
file://-->
</script>
加入<body>區:
<a href="1.htm" onclick="openwin()">open</a>即可。

【6、彈出的視窗之定時關閉控制】

下面我們再對彈出的視窗進行一些控制,效果就更好了。如果我們再將一小段代碼加入彈出的頁面(注意是加入到page.html的HTML中,可不是主頁面中,否則...),讓它10秒後自動關閉是不是更酷了?

首先,將如下代碼加入page.html文件的<head>區:
<script language="JavaScript">
function closeit()
{setTimeout("self.close()",10000) file://毫秒}
</script>
然後,再用<body onload="closeit()"> 這一句話代替page.html中原有的<BODY>這一句就可以了。(這一句話千萬不要忘記寫啊!這一句的作用是調用關閉視窗的代碼,10秒鍾後就自行關閉該視窗。)

【7、在彈出視窗中加上一個關閉按鈕】

<FORM>
<INPUT TYPE='BUTTON' VALUE='關閉' onClick='window.close()'>
</FORM>
呵呵,現在更加完美了!

【8、內包含的彈出視窗-一個頁面兩個視窗】

上面的例子都包含兩個視窗,一個是主視窗,另一個是彈出的小視窗。

通過下面的例子,你可以在一個頁面內完成上面的效果。
<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
function openwin()
{OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");
file://寫成一行
OpenWindow.document.write("<TITLE>例子</TITLE>")
OpenWindow.document.write("<BODY BGCOLOR=#ffffff>")
OpenWindow.document.write("<h1>Hello!</h1>")
OpenWindow.document.write("New window opened!")
OpenWindow.document.write("</BODY>")
OpenWindow.document.write("</HTML>")
OpenWindow.document.close()}
</SCRIPT>
</head>
<body>
<a href="#" onclick="openwin()">打開一個視窗</a>
<input type="button" onclick="openwin()" value="打開視窗">
</body>
</html>
看看 OpenWindow.document.write()裏面的代碼不就是標准的HTML嗎?只要按照格式寫更多的行即可。千萬注意多一個標簽或少一個標簽就會出現錯誤。記得用OpenWindow.document.close()結束啊。

【9、終極應用--彈出的視窗之Cookie控制】

回想一下,上面的彈出視窗雖然酷,但是有一點小毛病(沉浸在喜悅之中,一定沒有發現吧?)比如你將上面的腳本放在一個需要頻繁經過的頁面裏(例如首頁),那麼每次刷新這個頁面,視窗都會彈出一次,是不是非常煩人?:-(有解決的辦法嗎?Yes! ;-) Follow me.

我們使用cookie來控制一下就可以了。

首先,將如下代碼加入主頁面HTML的<HEAD>區:
<script>
function openwin()
{window.open("page.html","","width=200,height=200")}
function get_cookie(Name)
{var search = Name + "="
var returnvalue = "";
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if (offset != -1) {
offset += search.length
end = document.cookie.indexOf(";", offset);
if (end == -1)
end = document.cookie.length;
returnvalue=unescape(document.cookie.substring(offset,end))
}
}
return returnvalue;
}
function loadpopup(){
if (get_cookie('popped')==''){
openwin()
document.cookie="popped=yes"
}
}
</script>
然後,用<body onload="loadpopup()">(注意不是openwin而是loadpop啊!)替換主頁面中原有的<BODY>這一句即可。你可以試著刷新一下這個頁面或重新進入該頁面,視窗再也不會彈出了。真正的Pop-Only-Once!

寫到這裏彈出視窗的制作和應用技巧基本上算是完成了,俺也累壞了,一口氣說了這麼多,希望對正在制作網頁的朋友有所幫助俺就非常欣慰了。

需要注意的是,JS腳本中的的大小寫最好前後保持一致。

javascript只能輸入數字

<body>
<script>
function JHshNumberText()
{
if ( !(((window.event.keyCode >= 48) && (window.event.keyCode <= 57)) (window.event.keyCode == 13) (window.event.keyCode == 46) (window.event.keyCode == 45)))
{window.event.keyCode = 0 ;}
}
</script>
<form name="frm">
<input type="text" name="test" value="" onkeypress="JHshNumberText()">
<input type="button" name="submit" value="submit">
</form>
</body>

啟用/禁用USB

啟用USB將下列機碼儲成enableusb.reg檔
-----------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]"Start"=dword:00000003------------------------------------------------
執行命令regedit /s enableusb.reg

禁用USB將下列機碼儲成disableusb.reg檔
-----------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR]"Start"=dword:00000004------------------------------------------------
執行命令regedit /s disableusb.reg

ASP.NET 如何設定強制下載檔案並正確處理中文檔名的問題


我想一般人的作法都是透過設定 HTTP 回應 Content-Disposition 標頭(Header)的方式告知用戶端(Browser)強制下載檔案的,例如:

string fileName = "ExportData.csv";string strContentDisposition = String.Format("{0}; filename=\"{1}\"", "attachment", fileName);

Response.AddHeader("Content-Disposition", strContentDisposition);

透過上述程式碼,就可以讓 Browser 強制下載此頁的內容,也就是該頁的內容(可能是文件或二進位檔案)不會直接在瀏覽器中開啟或下載後直接開啟相關程式(如:Office)。
其中 Content-Disposition 標頭的第一組參數是 attachment,代表此頁唯一個「附件檔」,如果你將 attchment 改成 inline 的話,就代表這是一個內嵌與其他網頁內檔案(如:圖檔、CSS、JavaScript、Flash、...),而這也是「預設」的設定,所以也就等於不加上 Content-Disposition 標頭的情況。
而 Content-Disposition 標頭的第二組參數是 filename,也就是你可以指定下載檔案時預設的儲存檔名,在此範例中的下載檔名是 ExportData.csv

雖然這個小技巧很好用,不過當你的檔名內含「中文字」的時候,卻會發生以下錯誤:

經測試發現,這個問題只會再 IE 出現,當我在使用 Firefox 的時候並不會有這個問題,嚴格算起來應該算是 IE 的 Bug。
我從 MSDN 的 HttpResponse.HeaderEncoding 屬性 說明文件發現 ASP.NET 在回應 HTTP 標頭的時候預設編碼是用 System.Text.UTF8Encoding 類別,但問題是 IE 瀏覽器無法正確解析 UTF-8 的 HTTP Header。從網路上得到的一般性解法就是特別指定 Response.HeaderEncoding 的編碼,因為 IE 瀏覽器在繁體中文的作業系統下可以支援的編碼是 Big5,所以照理說只要設定正確的編碼就能夠正確下載中文檔名,如下程式片段:
Response.HeaderEncoding = Encoding.GetEncoding("big5");
不過經過我測試的結果,這段 Code 在 ASP.NET Development Server 中執行是「完全無效」的,所有的中文字還是以 UTF-8 編碼輸出,但是同一段程式碼在 IIS 6.0 中卻可以正常執行,雖然可以正確輸出 Big5 編碼的 HTTP Header,但是下載後的檔名竟然有幾台機器會變成亂碼,雖然大多數主機下載的檔名是正確的,但此問題依然困擾著我,因為當你設定了 Big5 編碼後,中國大陸簡體中文的用戶又無法下載了,或是下載後檔名一樣變成亂碼。
為了解決這個問題,我不斷的上網尋找資料,不過都沒有人提出有別於設定 Response.HeaderEncoding 的作法,所以就一直試一直試,試了快 4 個鐘頭,結果看到頭暈眼花,還是放棄了。但今天突然靈機一動想說將中文檔名用 Server.UrlPathEncode 方法編碼看看,結果真的成功了!以下是程式碼範例:

string fileName = Server.UrlPathEncode("匯出資料檔080419.csv");string strContentDisposition = String.Format("{0}; filename=\"{1}\"", "attachment", fileName);Response.AddHeader("Content-Disposition", strContentDisposition);

此技巧不但可以正確下載中文檔名,且也不需要設定任何 Response.HeaderEncoding 就可以正常下載,同一段程式碼同時可以給任何支援 UTF-8 的作業系統下載,包括使用簡體中文的大陸用戶也可以正確下載檔案了,真是大快人心啊。
因為我們的目的是「要讓使用者能正確下載含有中文檔名的檔案」且目的也算是達成了,不過如果使用者直接在檔案下載視窗點選「開啟舊檔(O)」的話(如下圖):

IE 會先將該檔案暫存於 IE 的暫存目錄裡並且直接開啟該檔案,不過檔名卻會變成 %e5%8c%af%e5%87%ba%e8%b3%87%e6%96%99%e6%aa%94080419.csv (編碼過的檔名),如果使用者只是想開啟來看一下不存檔的話,那到沒什麼大礙,如果使用者按下「另存新檔」要儲存檔案時,那檔名就變的亂七八糟了,唉~ 殘念!這點真的無解!
另外我也在 Firefox 瀏覽器中測試,發現另存新檔或開啟檔案的檔名也一樣會變成編碼過的檔名( %e5%8c%af%e5%87%ba%e8%b3%87%e6%96%99%e6%aa%94080419.csv ),所以沒辦法一招半式闖江湖,我又調整了一下程式碼,讓 Content-Disposition 標頭中的檔名可以針對使用者透過 IE 瀏覽器下載時將檔案編碼:
string fileName = "匯出資料檔080419.csv";if (Request.Browser.Browser == "IE") { fileName = Server.UrlPathEncode(fileName);}string strContentDisposition = String.Format("{0}; filename=\"{1}\"", "attachment", fileName);Response.AddHeader("Content-Disposition", strContentDisposition);

2008年7月2日 星期三

javascript string 字串功能



JavaScript 在第四版之後,針對通用表示法增加了數個字串方法,這些字串方法的用途很廣,可以列舉如下:



字串方法功能
string.search(re)通用式 re 在某個字串 string 出現的位置
string.match(re)從字串 string 抽取符合通用式 re 的子字串,並以字串陣列傳回
string.replace(re, newStr)將字串 string 符合通用式 re 的部分,代換為 newStr


使用通用表示法及上述的字串方法,我們對字串的處理能力大增,不但可以進行搜尋比對,還可以立刻修改字串(例如:即時修正表單資料),本節將說明這些功能。


若要尋找某個通用式在一個字串的第一次出現的位置,可用字串的 search 方法,例如:

Example(regExpSearch01.htm):



相關原始碼如下:

原始檔(regExpSearch01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:搜尋並列出位置</h2>
<hr>

<script>
function regExpMatch(string, pattern, flag){
var regexp = new RegExp(pattern, flag);
var index = string.search(regexp);
alert(index);
}
</script>
<center>
 字串:<input size=40 id=strId value="阿輝伯是李登輝,李炳輝是金門王的搭檔"><br>
通用式:<input size=40 id=patId value="李.輝"><br>
 選項:<input size=40 id=flagId value="g"><br>
<input type="button" value="顯示搜尋結果" onClick="regExpMatch(strId.value, patId.value, flagId.value)">
</center>

<hr>
</body>
</html>



其中 str.search(re) 將會傳回符合 re 的第一個位置(此例為 4)。若字串 str 不符合 re,則回傳值為 -1。若只是要判斷輸入字串是否符合某個通用式,也可以使用 re.test(str),這在上一節已經說明過了。

Hint
str.search(re) 只能用來搜尋某個通用式在一個字串的第一次出現的位置,所以在上述範例中,無論選項的輸入值為何,都只有一個搜尋結果。



使用字串的 match 方法,可在一個字串中,取出符合某個通用表示式的所有子字串,例如:

Example(regExpMatch01.htm):



相關原始碼如下:

原始檔(regExpMatch01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:搜尋並列出比對到的字串</h2>
<hr>

<script>
function regExpMatch(string, pattern, flag){
var regexp = new RegExp(pattern, flag);
var matched = string.match(regexp);
alert(matched);
}
</script>
<center>
 字串:<input size=40 id=strId value="阿輝伯是李登輝,李炳輝是金門王的搭檔"><br>
通用式:<input size=40 id=patId value="李.輝"><br>
 選項:<input size=40 id=flagId value="g"><br>
<input type="button" value="顯示搜尋結果" onClick="regExpMatch(strId.value, patId.value, flagId.value)">
</center>

<hr>
</body>
</html>



其中「.」可比對任何一個字元,而傳回的 matched 變數則是一個陣列,包含所比對到的字串。


善用通用表示式及字串的 replace 方法,就可以對字串進行任意修改。例如:

Example(regExpReplace01.htm):



相關原始碼如下:

原始檔(regExpReplace01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:搜尋並代換</h2>
<hr>

<script>
function regExpReplace(strId, pat1id, pat2id, flagId){
var regexp = new RegExp(pat1id.value, flagId.value);
var str = strId.value;
var newString = str.replace(regexp, pat2id.value);
alert(newString);
}
</script>
<center>
 字串:<input size=40 id=strId value="我愛用通用式,通用式功能強大"><br>
通用式:<input size=40 id=pat1id value="通.式"><br>
新字串:<input size=40 id=pat2id value="正規式"><br>
 選項:<input size=40 id=flagId value=""><br>
<input type="button" value="顯示代換結果" onClick="regExpReplace(strId, pat1id, pat2id, flagId)">
</center>

<hr>
</body>
</html>



在上例中,字串的 replace 方法將符合通用式的第一部分代換成「正規式」,並將新字串傳回給變數 newString。若要將所有的「通用式」改成「正規式」,只需將選項改成「g」就可以了。


處理表單資料時,最常用的資料修正方式就是去除前後的空白。這種例行工作就可以由通用表示法及字串的 replace 方法來輕鬆完成。例如:

Example(regExpReplace02.htm):



在上例中,若按下「修正」,JavaScript 即會將所有的空白部分(含中文大五碼)刪除。程式碼如下:

原始檔(regExpReplace02.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:修正中文姓名</h2>
<hr>

<script>
function checkChineseName(uiControl) {
uiControl.value = uiControl.value.replace(/[\s ]+/g, ""); // \s & 全形空白
}
</script>
中文大名:<input id=chineseName value=" 金   城  武 ">
<input type=button value="修正" onClick="checkChineseName(chineseName)">

<hr>
</body>
</html>



在上述範例中,[\s ] 是代表英文空白字元或大五碼的全形空白字元,因此 [\s ]+ 就是代表中文中可能出現的空白字串,而 replace(/[\s ]+/g, "") 則是將此類字串全部刪除,也就是代換為空字串。


對於英文的輸入,我們通常要消除字頭及字尾的空白,並將句中的多個空白合成一個空格,例如:

Example(regExpReplace03.htm):



程式碼如下:

原始檔(regExpReplace03.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:修正英文姓名</h2>
<hr>

<script>
function checkEnglishName(uiControl) {
var str = uiControl.value;
str = str.replace(/^[\s ]+/g, ""); // 刪除頭部的空白字串
str = str.replace(/[\s ]+$/g, ""); // 刪除尾部的空白字串
str = str.replace(/[\s ]+/g, " "); // 將其他空白字串帶換成單一半形空格
uiControl.value = str;
}
</script>
英文大名:<input id=englishName value=" Michael   Jordan ">
<input type=button value="修正" onClick="checkEnglishName(englishName)">

<hr>
</body>
</html>



我們可以使用 "|" 來代表「或」,因此在上述範例中,刪除頭部和尾部的空白字串,可以合成一個敘述,如下:

<br />str = str.replace(/^[\s&#12288;]+|[\s&#12288;]+$/g, "");<br />


如果在通用式使用重複字元時(例如「*」代表重複0次或多次,「+」代表重複至少1次等。),比對之後可能會出現兩種不同的結果,這兩種結果都滿足原來的通用式。此時我們必須知道通用式在進行比對時所採取的原則,才能得到符合我們期望的結果。一般而言,比對原則可以概述如下:


  • 遇到重複字元時,通用表示法會採取「貪心比對」(Greedy Match)來「貪」到越多的字元越好。
  • 若要進行「最小比對」(Minimum Match),則我們必須在重複字元後面加上一個問號,代表「在可能比對成功的情況下,比對越少越好」。

下面是一個範例:

Example(regExpGreedy01.htm):



在上述範例中,第一個通用式是採取預設的「貪心比對」,因此比對到的字串會是 batbetbitbotbut,此字串是在比對成功的情況下、最長的字串。而在第二個通用式中,我們在星號後面加了一個問號,代表採取「最小比對」,因此比對到的字串是 bat,此字串是在比對成功的情況下、最短的字串。此範例的程式碼如下:

原始檔(regExpGreedy01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式的「貪心比對」與「最小比對」</h2>
<hr>

<script>
str = "fred batbetbitbotbut barney"
document.write("str = "+str+"<br>");
document.write("貪心比對:<br>");
re = /b.*t/;
document.write("re = "+re+"<br>");
document.write("str.match(re) = "+str.match(re)+"<br>");
document.write("最小比對:<br>");
re = /b.*?t/;
document.write("re = "+re+"<br>");
document.write("str.match(re) = "+str.match(re)+"<br>");
</script>

<hr>
</body>
</html>



在使用「貪心比對」時,會採用「越左越貪」的原則,若要推翻此原則,可以適時使用問號,以採用「最小比對」,例如:

Example(regExpGreedy02.htm):



此範例的程式碼如下:

原始檔(regExpGreedy02.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式的「越左越貪」比對方式</h2>
<hr>

<script>
str = "a xx b xxx b xxxx d";
document.write("str = "+str+"<br>");
document.write("越左越貪:<br>");
re = /a(.*)b(.*)d/;
document.write("re = "+re+"<br>");
found = str.match(re);
document.write("RegExp.$1 = "+RegExp.$1+", RegExp.$2 = "+RegExp.$2+"<br>");
document.write("推翻越左越貪:<br>");
re = /a(.*?)b(.*)d/;
document.write("re = "+re+"<br>");
found = str.match(re);
document.write("RegExp.$1 = "+RegExp.$1+", RegExp.$2 = "+RegExp.$2+"<br>");
</script>

<hr>
</body>
</html>



在上例中,我們在通用式中加了括號,符合括號中的比對條件者,將被設定至 RegExp.$1、RegExp.$2 等變數中,以便後續處理。
(為簡化起見,RegExp.$1 可以簡寫成 $1,RegExp.$2 可以簡寫成 $2,依此類推。)此外,在第一個通用式中,由於採取預設的「越左越貪」,所以 RegExp.$1 = "xx b xxx" 且 RegExp.$2 = "xxxx";但在第二個通用式中,由於我們適時使用了問號來進行「最小比對」,所以得到 RegExp.$1 = "xx" 且 RegExp.$2 = "xxx b xxxx"。


以下這個範例,利用 replace() 將一句英文中的前兩個字彙對調:

Example(regExpReplace04.htm):



程式碼如下:

原始檔(regExpReplace04.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:對調兩個英文字</h2>
<hr>

<script>
function exchangeWord(id) {
var regexp = /(\w+)\s+(\w+)/;
var newString = id.innerHTML.replace(regexp, "$2 $1");
alert("First matched word = " + RegExp.$1);
alert("Second matched word = " + RegExp.$2);
id.innerHTML = newString;
}
</script>
請點選下列文字以對調前兩個英文字:<p>
<div onClick='exchangeWord(this)'>we are the world!</div>

<hr>
</body>
</html>



以下這個範例,利用 replace() 在 onBlur 事件時,先修正文字欄位,再進行驗證:

Example(regExpReplace05.htm):




說明:在 onBlur 事件後,JavaScript 會以通用式來對以下表單元素的值進行修正與驗證。。




Your English name:

value=" Michael J. Fox " onBlur="trimtext(this); checkName(this)">

Your email:

value="test@cs.nthu.edu.twww" onBlur="trimtext(this); checkEmail(this)">


Your password (5 to 8 characters only):

value="123" onBlur="checkPassword(this, 5, 8)">


Your social security number (9 digits):

value="123" onBlur="trimtext(this); checkDigit(this, 9, 9)">



資料驗證


「通用表示法」或「通用式」(Regular expressions)是在 UNIX 世界中發展出來的字串比對技巧,其基本概念是用一套格式簡單、但功能強大的符號來比對複雜的字串,並可對符合比對條件的字串進行修改或其他運算。事實上,UNIX 的許多軟體或指令都支援通用表示法,例如 grep、sed、awk、ed、vi、emacs 等。(但是這些東西大概只有像我這樣的 LKK 才會用吧。)

Hint
若按照字面來翻譯,Regular expressions 應該翻成「正規表示法」或「正規式」,但是我們使用「通用表示法」或「通用式」似乎更能適切地表達其功能。



Netscape 及 IE 在第四版後都支援 JavaScript/VBScript 的通用表示法,特別適用於表單資料的驗證與修改。事實上,JavaScript/VBScript 的通用表示法和 Perl 以及其他 UNIX 相關指令幾乎一模一樣,因此,在本章學到的通用表示法,也可以完全適用於 Perl 或 UNIX 相關指令。(一魚兩吃,真是太棒了!)


由於篇幅限制,我們僅介紹 JavaScript 的通用式;VBScript 的通用式在功能上完全相同,只不過命令格式有所不同,有興趣的讀者,可以參考網路相關資料。


JavaScript 的通用式是一個內建的物件,其建構函數(Construction functoin)為 RegExp,典型用法如下:


re = new RegExp("pattern", "flag")<br />

上述用法也可以簡寫成下列格式:
<br />re = /pattern/flag<br />

其中,pattern 是通用表示法的字串,flag 則是比對的方式。flag 的值可能有三種,分別解釋如下:

  • g:全域比對(Global match)
  • i:忽略大小寫(Ignore case)
  • gi:全域比對並忽略大小寫


舉例來說,我們的身份證字號的基本格式,是由一個英文字母加上九個數字組合而成,如果我們要求使用者輸入身份證字號,就可以使用 JavaScript 的通用表示法來驗證其格式的正確性。例如,我們可用下列表單來要求使用者輸入身份證字號:

Example(regExpID01.htm):



在上例中,我們只要按下「驗證」的按鈕,就會呼叫 checkID() 函數來對文字欄位中的身份證字號進行驗證。相關原始碼如下:

原始檔(regExpID01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:簡易身份證字號驗證</h2>
<hr>

<script>
function checkID(string) {
re = /^[A-Z]\d{9}$/;
if (re.test(string))
alert("成功!符合「" + re + "」的格式!");
else
alert("失敗!不符合「" + re + "」的格式!");
}
</script>
身份證字號(第一個英文字母需大寫):<input id=idNumber value=A12345678>
<input type=button value="驗證" onClick="checkID(idNumber.value)">

<hr>
</body>
</html>



在上述範例中,/^[A-Z]\d{9}$/ 就是一個通用式,說明如下:


  • 若要比對數個字元中的任一個字元,可用中括號,並可用「-」來代表字母或是數字的範圍,因此 [A-Z] 代表由 A 至 Z 的任一個英文字母。(若不嫌煩,當然也可以寫成 [ABCDEFGHIJKLMNOPQRSTUVWXYZ]。)
  • \d 代表由 0 至 9 的數目字,事實上也可以寫成 [0-9] 或 [0123456789]。
  • {9} 代表前一個字元的重複次數,因此 \d{9} 代表需要有九個數目字。
  • ^ 代表字串開始位置,$ 代表字串結束位置。(若沒有這兩個符號,那麼只要任一個字串中間含有身份證字號,也可以比對成功。)

由上述說明,可知 /^[A-Z]\d{9}$/ 就代表可以比對身份證字號的通用式。此外,idNumber.value 代表使用者輸入的字串,re.test(string) 則是通用式 re 的一個方法,會傳回 true 或 false,代表比對是否成功。若要不限定是大寫英文字母,只需將上述範例的通用式改成 /^[a-zA-Z]\d{9}$/ 就可以了!

Hint
注意:若不加入 ^ 和 $,那麼 /[A-Z]d{9}/ 就會比對到其他不合法的身份證字號,例如 AGF123456789 或是 F1234567890 等。因此,加入 ^ 和 $ 可保證比對正確的字串一定是由一個大寫英文字母加上九個數字所構成。



事實上,身份證字號本身就有內在的編碼規則,這些規則和使用者的性別有關,因此若要實現完整的表單驗證,就必須應用完整的身份證編碼規則,讀者可參考本章的最後一節。


另一個簡單的例子,是要求使用者輸入信用卡號碼,這是一組 16 個數字的號碼,例如:

Example(regExpCreditCardNumber01.htm):



當我們按下「驗證」按鈕時,JavaScript 會呼叫函數 checkCreditCard( ) 來對填入的資料進行驗證。相關原始碼如下:

原始檔(regExpCreditCardNumber01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:簡易信用卡卡號驗證</h2>
<hr>

<script>
function checkCreditCard(string) {
re = /^\d{4}-\d{4}-\d{4}-\d{4}$/;
// re = /^(\d{4}-){3}\d{4}$/; // 這種寫法也可以!
if (re.test(string))
alert("成功!符合「" + re + "」的格式!");
else
alert("失敗!不符合「" + re + "」的格式!");
}
</script>
信用卡號碼:<input id=creditCardNumber value=1234-5678-9012-3456>
<input type=button value="驗證" onClick="checkCreditCard(creditCardNumber.value)">

<hr>
</body>
</html>



在上例中,很顯然地,/^\d{4}-\d{4}-\d{4}-\d{4}$/ 就代表正確的信用卡格式。很明顯的,使用通用式會讓程式碼簡潔很多,而且會大大提高程式碼的正確性。(請和前面章節的類似範例 formValidation02.htm 比較看看。)但要注意的是,信用卡卡號本身就有內在的較複雜編碼規則,因此若要實現完整的表單驗證,就必須應用完整的信用卡卡號編碼規則,讀者可參考本章的最後一節。


如果重複的部分多於一個字母,我們就必須將需要重複的部分放在小括號內,再加上由大括號包夾的重複次數,例如,上述範例的通用式 /^\d{4}-\d{4}-\d{4}-\d{4}$/,也可以寫成 /^(\d{4}-){3}\d{4}$/,請試試看!


下一個例子,則是用通用表示法來驗證使用者的英文名字,例如:

Example(regExpEnglishName01.htm):



當我們按下「驗證」按鈕時,JavaScript 會呼叫函數 checkEnglishName( ) 來對填入的資料進行驗證。相關原始碼如下:

原始檔(regExpEnglishName01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:簡易英文名字驗證</h2>
<hr>

<script>
function checkEnglishName(string) {
re1 = /^[A-Za-z\-]+\s+[A-Za-z\-]+$/;
re2 = /^[A-Za-z\-]+\s+[A-Za-z\-]+\s+[A-Za-z\-]+$/;
if (re1.test(string) || re2.test(string))
alert("成功!符合「" + re1 + "」或「" + re2 + "」的格式!");
else
alert("失敗!不符合「" + re1 + "」或「" + re2 + "」的格式!");
}
</script>
你的英文全名(格式:First Last 或 First Middle Last):<input id=englishName value="Jyh-Shing Roger Jang">
<input type=button value="驗證" onClick="checkEnglishName(englishName.value)">

<hr>
</body>
</html>



對於上述範例程式,我們說明如下:


  • [A-Za-z\-] 代表一個英文字母(可以大寫或小寫),或是字元「-」。特別要注意的是,由於「-」在中括號內部已經有特殊意義,若要避掉此特殊意義,就必須在「-」之前加上反斜線(「\」)。
  • 加號代表重複前一個字元一次或多次,因此 [A-Za-z\-]+ 就代表由英文字母或是減號所形成的字串,且其長度至少是一。
  • \s 代表空白字元,可以是空格、定位鍵、換列字元等等。因此 \s+ 就表示由一個或多個空白字元所形成的字串。

因此 re1 = /^[A-Za-z\-]+\s+[A-Za-z\-]+$/ 可以比對由兩個字彙所形成的英文名字,例如 Michael Jordan;而 re2 = /^[A-Za-z\-]+\s+[A-Za-z\-]+\s+[A-Za-z\-]+$/ 則可以比對由三個字彙所形成的英文名字,例如,Jyh-Shing Roger Jang。


下一個例子,則是用通用表示法來驗證電子郵件,例如:

Example(regExpEmail01.htm):



相關原始碼如下:

原始檔(regExpEmail02.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:電子郵件格式驗證(可以避開含有空白的電子郵件帳號)</h2>
<hr>

<script>
function checkEmail(string) {
re = /^[^\s]+@[^\s]+\.[^\s]{2,3}$/;
if (re.test(string))
alert("成功!符合「" + re + "」的格式!");
else
alert("失敗!不符合「" + re + "」的格式!");
}
</script>
電子郵件:<input id=email value="jang@cs.n thu.edu.tw">
<input type=button value="驗證" onClick="checkEmail(email.value)">

<hr>
</body>
</html>



對於此範例所用到的通用式 /^[^\s]+@[^\s]+\.[^\s]{2,3}$/,說明如下:


  • \s 代表所有可能的空白字元,包含空白、定位鍵、換列字元等。(但並不包含全形的空白,請特別注意!)
  • ^ 在中括弧內是代表「否定」,因此 [^\s]+ 代表「由一個或多個非空白字元」所形成的字串。

Hint
請注意:^ 在一般通用表示法的意義是「字串開始的位置」,但是一旦放在中括弧內,則是代表「否定」或「非」。




在以下的範例中,我們設計了一個表單,可以讓使用者輸入任意字串、通用式,以及比對選項,並在通用式比對後,列出比對到的字串,讀者們可以利用此範例,反覆演練,以增進對於通用式的瞭解:

Example(regExpTest01.htm):



上述範例的原始檔如下:

原始檔(regExpTest01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>通用式:完整測試頁</h2>
<hr>

<script>
function showMatched(form){
var regexp = new RegExp(form.pattern.value, form.flag.value);
var str = form.string.value;
var matched = str.match(regexp);
if (matched) {
var dispstr = matched.length + " 個比對到的字串:";
for (var i=0; i<matched.length; i++)
dispstr = dispstr + "\n" + matched[i];
alert(dispstr);
} else
alert("沒有比對到任何字串!");
}
</script>
<form>
<table align=center>
<tr><td align=right>字串:
<td><input type=text size=30 name=string value="There are 10 rookies coming at 3 o'clock!">
<tr><td align=right>通用式:
<td><input type=text size=30 name=pattern value=" \w+ "> (範例:\d{2,3}, T.*a, T.*?a)
<tr><td align=right>選項:
<td><input type=text size=30 name=flag value="g"> (g, i, or gi)
<tr><td align=right><br>
<td><input type="button" value="顯示比對到的字串" onClick="showMatched(this.form)"><input type="reset">
</table>
</form>

<hr>
</body>
</html>



在上述範例中,我們使用了字串的 match() 方法,來對通用式進行比對,因此 matched = str.match(regexp) 可將比對到的字串送到一個陣列,以便後續處理。


在進行表單資料驗證之前,我們應先進行表單資料修改,例如拿掉不必要的空格、英文字母大小寫轉換等,這些工作也可以由字串的 replace() 方法或通用式的 exec() 方法來達成,這是我們下一節的主題。

2008年6月29日 星期日

在指定的目錄下開啟 Command Prompt

在〔開始〕→〔執行〕→鍵入〔regedit〕→選〔HKEY_CLASSES_ROOT〕→〔Directory〕→〔shell〕→增加一個機碼〔CommandPrompt〕預設值為〔在 Command Prompt 打開〕再在〔CommandPrompt〕下增加一個機碼〔command〕預設值為〔cmd.exe cd %1〕完成後在檔案總管任何資料夾下右點鼠標便會出現〔在 Command Prompt 打開〕的選項

2008年6月17日 星期二

ASP.NET+javascript

RegisterStartupScript("","<SCRIPT>alert('更新比重成功');");

2008年6月5日 星期四

DataGrid轉Excel

Dim sw As New System.IO.StringWriter Dim hw As New System.Web.UI.HtmlTextWriter(sw)
DataGrid1.RenderControl(hw) Response.Clear() Response.AppendHeader("Content-Disposition", "attachment; filename=excel.xls") Response.ContentType = "application/vnd.ms-excel" Response.Write(sw.ToString()) Response.End()

2008年6月3日 星期二

網頁表單元素Input的高級用法11例

網頁表單元素Input的高級用法11例

http://big5.chinaz.com:88/www.chinaz.com/Design/Pages/0521YI2007.html


網頁表單元素Input的高級用法11例[ 來源:網頁教學網 作者: 時間:2007-05-21 09:13:51 收藏本文 ] 【大 中 小】

1.取消按鈕按下時的虛線框

在input裏添加屬性值 hideFocus 或者 HideFocus=true

2.只讀文本框內容

在input裏添加屬性值 readonly



3.防止退後清空的TEXT文檔(可把style內容做做為類引用)

<INPUT style=behavior:url(#default#savehistory); type=text id=oPersistInput>

4.ENTER鍵可以讓光標移到下一個輸入框



<input onkeydown="if(event.keyCode==13)event.keyCode=9" >

5.只能為中文(有閃動)


<input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9">


6.只能為數字(有閃動)



<input onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">



7.只能為數字(無閃動)

<input style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9" onKeyPress="if ((event.keyCode<48 event.keyCode>57)) event.returnValue=false">




8.只能輸入英文和數字(有閃動)




<input onkeyup="value=value.replace(/[\W]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))">

9.屏蔽輸入法

<input type="text" name="url" style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9"> Www@Chinaz@com

10. 只能輸入 數字,小數點,減號(-) 字符(無閃動)

<input onKeyPress="if (event.keyCode!=46 && event.keyCode!=45 && (event.keyCode<48 event.keyCode>57)) event.returnValue=false">

11. 只能輸入兩位小數,三位小數(有閃動)

<input maxlength=9 onkeyup="if(value.match(/^\d{3}$/))value=value.replace(value,parseInt(value/10)) ;value=value.replace(/\.\d*\./g,'.')" onKeyPress="if((event.keyCode<48 event.keyCode>57) && event.keyCode!=46 && event.keyCode!=45 value.match(/^\d{3}$/) /\.\d{3}$/.test(value)) {event.returnValue=false}" id=text_kfxe name=text_kfxe>

2008年5月19日 星期一

.Net 2003 Excel2003

這份文件示範如何為 Visual Basic . NET 設定適當的專案參照至 Excel 型別程式庫並提供範例程式碼來自動化 Excel。
建立在 Microsoft Excel 的 Automation 用戶端
1. 啟動 Microsoft Visual Studio .NET。.
2. 在 [ 檔案 ] 功能表, 再按一下 [ New , 及 專案 。 從 Visual Basic 專案類型選取 [ Windows 應用程式 。 根據預設會建立 Form1。.
3. 將參考加入至 Microsoft Excel Object Library 。 如果要執行這項操作,請依照下列步驟執行。: a. 在 [ 專案 ] 功能表, 按一下 [ 加入參考 。
b. 在 [ COM ] 索引標籤, 找出 Microsoft Excel Object Library , 並按一下 選取 。

請注意 Microsoft Office 2003 包括 Primary Interop Assemblies (PIA)。 並未包含 Microsoft Office XP PIA, 但是他們可以下載。 如需有關 Office XP PIA 的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件::
328912 (http://support.microsoft.com/kb/328912/) Microsoft Office XP 主要 Interop 組件 (PIA) 可供下載
c. 按一下 [ 確定 ] 以接受您的選項在 [ 加入參考 ] 對話方塊。

4. 在 [ 檢視 ] 功能表, 選取 工具箱 ] 以顯示 [ 工具箱 ], 然後新增按鈕至 Form 1。
5. 連按兩下 Button 1 。 即會出現在表單的程式碼視窗。
6. 在程式碼視窗中,找出下列程式碼: Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

End Sub

以下列程式碼取代前一個程式碼: Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim oXL As Excel.Application
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
Dim oRng As Excel.Range

' Start Excel and get Application object.
oXL = CreateObject("Excel.Application")
oXL.Visible = True

' Get a new workbook.
oWB = oXL.Workbooks.Add
oSheet = oWB.ActiveSheet

' Add table headers going cell by cell.
oSheet.Cells(1, 1).Value = "First Name"
oSheet.Cells(1, 2).Value = "Last Name"
oSheet.Cells(1, 3).Value = "Full Name"
oSheet.Cells(1, 4).Value = "Salary"

' Format A1:D1 as bold, vertical alignment = center.
With oSheet.Range("A1", "D1")
.Font.Bold = True
.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
End With

' Create an array to set multiple values at once.
Dim saNames(5, 2) As String
saNames(0, 0) = "John"
saNames(0, 1) = "Smith"
saNames(1, 0) = "Tom"
saNames(1, 1) = "Brown"
saNames(2, 0) = "Sue"
saNames(2, 1) = "Thomas"
saNames(3, 0) = "Jane"

saNames(3, 1) = "Jones"
saNames(4, 0) = "Adam"
saNames(4, 1) = "Johnson"

' Fill A2:B6 with an array of values (First and Last Names).
oSheet.Range("A2", "B6").Value = saNames

' Fill C2:C6 with a relative formula (=A2 & " " & B2).
oRng = oSheet.Range("C2", "C6")
oRng.Formula = "=A2 & "" "" & B2"

' Fill D2:D6 with a formula(=RAND()*100000) and apply format.
oRng = oSheet.Range("D2", "D6")
oRng.Formula = "=RAND()*100000"
oRng.NumberFormat = "$0.00"

' AutoFit columns A:D.
oRng = oSheet.Range("A1", "D1")
oRng.EntireColumn.AutoFit()

' Manipulate a variable number of columns for Quarterly Sales Data.
Call DisplayQuarterlySales(oSheet)

' Make sure Excel is visible and give the user control
' of Excel's lifetime.
oXL.Visible = True
oXL.UserControl = True

' Make sure that you release object references.
oRng = Nothing
oSheet = Nothing
oWB = Nothing
oXL.Quit()
oXL = Nothing

Exit Sub
Err_Handler:
MsgBox(Err.Description, vbCritical, "Error: " & Err.Number)
End Sub

Private Sub DisplayQuarterlySales(ByVal oWS As Excel.Worksheet)
Dim oResizeRange As Excel.Range
Dim oChart As Excel.Chart
Dim oSeries As Excel.Series
Dim iNumQtrs As Integer
Dim sMsg As String
Dim iRet As Integer


' Determine how many quarters to display data for.
For iNumQtrs = 4 To 2 Step -1
sMsg = "Enter sales data for" & Str(iNumQtrs) & " quarter(s)?"
iRet = MsgBox(sMsg, vbYesNo Or vbQuestion _
Or vbMsgBoxSetForeground, "Quarterly Sales")
If iRet = vbYes Then Exit For
Next iNumQtrs

' Starting at E1, fill headers for the number of columns selected.
oResizeRange = oWS.Range("E1", "E1").Resize(ColumnSize:=iNumQtrs)
oResizeRange.Formula = "=""Q"" & COLUMN()-4 & CHAR(10) & ""Sales"""

' Change the Orientation and WrapText properties for the headers.
oResizeRange.Orientation = 38
oResizeRange.WrapText = True

' Fill the interior color of the headers.
oResizeRange.Interior.ColorIndex = 36

' Fill the columns with a formula and apply a number format.
oResizeRange = oWS.Range("E2", "E6").Resize(ColumnSize:=iNumQtrs)
oResizeRange.Formula = "=RAND()*100"
oResizeRange.NumberFormat = "$0.00"

' Apply borders to the Sales data and headers.
oResizeRange = oWS.Range("E1", "E6").Resize(ColumnSize:=iNumQtrs)
oResizeRange.Borders.Weight = Excel.XlBorderWeight.xlThin

' Add a Totals formula for the sales data and apply a border.
oResizeRange = oWS.Range("E8", "E8").Resize(ColumnSize:=iNumQtrs)
oResizeRange.Formula = "=SUM(E2:E6)"
With oResizeRange.Borders(Excel.XlBordersIndex.xlEdgeBottom)
.LineStyle = Excel.XlLineStyle.xlDouble
.Weight = Excel.XlBorderWeight.xlThick
End With

' Add a Chart for the selected data.
oResizeRange = oWS.Range("E2:E6").Resize(ColumnSize:=iNumQtrs)
oChart = oWS.Parent.Charts.Add
With oChart
.ChartWizard(oResizeRange, Excel.XlChartType.xl3DColumn, , Excel.XlRowCol.xlColumns)
oSeries = .SeriesCollection(1)
oSeries.XValues = oWS.Range("A2", "A6")
For iRet = 1 To iNumQtrs
.SeriesCollection(iRet).Name = "=""Q" & Str(iRet) & """"
Next iRet
.Location(Excel.XlChartLocation.xlLocationAsObject, oWS.Name)
End With

' Move the chart so as not to cover your data.
With oWS.Shapes.Item("Chart 1")
.Top = oWS.Rows(10).Top
.Left = oWS.Columns(2).Left
End With

' Free any references.
oChart = Nothing
oResizeRange = Nothing
End Sub


7. 將下列程式碼新增至 Form1.vb 頂端::Imports Microsoft.Office.Core



測試自動化用戶端
1. 按下 F5 以建置並執行程式。.
2. 在表單, 按一下 Button 1 。 這個程式會啟動 Excel 並填入新的工作表上的資料。
3. 當出現提示要輸入每季的銷售資料, 請按一下 [ 是 ] 。 一個圖表為連結至每季的資料加入至工作表。

2008年5月1日 星期四

Word 開啟文件自動執行

Sub AutoOpen()

2008年4月25日 星期五

IE-檢視原始檔

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name]
@="C:\\Program Files\\MadEdit\\MadEdit.exe"

2008年4月8日 星期二

指定檔案總管的路徑

%SystemRoot%\explorer.exe /n,/e, d:\tmp\nov

加入右鍵選單

當在〔檔案總管〕瀏覽檔案時很多時後需要用〔記事本〕來開啟文件,
XP
[HKEY_CLASSES_ROOT\*\shell]

[HKEY_CLASSES_ROOT\*\shell\EmEdit]

[HKEY_CLASSES_ROOT\*\shell\EmEdit\command]
@="\"D:\\PROG\\emed800epx_portable\\EmEditor.exe\" \"%1\""

[HKEY_CLASSES_ROOT\*\shell\MadEdit]

[HKEY_CLASSES_ROOT\*\shell\MadEdit\command]
@="\"D:\\PROG\\MadEdit-0.2.8\\MadEdit.exe\" \"%1\""



修改以下機碼後即可隨時右點鼠標,便出現〔使用記事本開啟〕的選擇
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*
1.在此新增一個 [機碼] 名為 shell
2.在 shell 下再增加一個 機碼 名為 [OpenInNotepad]
3.在 [OpenInNotepad] 增加一個字串值數值資料為 [用記事本開啟]
4.再在 [OpenInNotepad] 下再增加一個 機碼 名為 [command]
5.在 [command] 增加一個字串值數值資料為 [notepad.exe %1]

 

有時候在 Command Prompt (命令提示字元) 下,需要進入較深層的目錄或是
進入中文的目錄時,真是打字要打個半死,如果可以在檔案總管中,直接選擇
想要進入的目錄,然後就可以自動變換到Command Prompt 那該有好呢~~~~

修改以下機碼後即可

HKEY_CLASSES_ROOT\SOFTWARE\Classes\Directory\shell
1.新增一個 [機碼] [CommandPrompt]
2.將 [CommandPrompt] 預設值設定為 [在 Command Prompt 開啟]
3.在 [Command Prompt]下再增加一個機碼 [command]
4.將 [command] 預設值設定為設定為cmd.exe cd %1

2008年4月7日 星期一

IIS-建立FTP

1.IIS-預設的FTP站台-新增-虛擬目錄-ftpa-路徑-要開放的路徑--讀取或寫入
2.新增USER--ftpa--設定檔(主資料夾-本機位置)--要開放的路徑
3.測試過若站台名稱和USER名稱不同會失敗

DTS-執行處理序工作

C:\WINDOWS\system32\cmd.exe /C

2008年4月6日 星期日

2008年4月1日 星期二

BAT-DOS

MS-DOS的批次檔

早期在DOS系統工作下,都可能需要使用批次檔來執行電腦工作,當文字介面的系統逐漸被Windows、Unix系統(圖形介面)所取代時,現今一般使用電腦的人,可能也不是很清楚什麼是批次檔,我們今天就來介紹何謂批次檔。

批次檔是一種文字檔案(ASCII檔案),由一連串的MS-DOS命令所組成的。批次檔的命名規則與一般檔案相同,但其副檔名固定為".BAT",即"將一連串的命令"儲存在檔案中,該批次檔的指令可無限制的重覆使用,永遠得到相同的執行結果。究竟批次檔又該如何使用呢?以下介紹批次檔的常用指令。

批次檔的常用指令如下:

一、 ECHO
在正常的情況下,批次檔中的每道命令執行前都會先出現螢幕上。有了ECHO命令,就可以任意控制是否列印出命令列。
用法:在批次檔中鍵入echo on/off ,on:表示要印出命令列,off:則不印出命令列,若要禁止批次檔的命令顯示在螢幕上,則使用隱藏echo off(@ECHO OFF),用法在命令列的開頭上加上@符號
Ex:
@echo off 表示資料隱藏
echo .... 測試ECHO指令
echo .... 請稍後
echo .... 完成.....

結果:


二、 代換參數
代換參數的標記是一個百分號(%)再跟著一個阿拉伯數字,最多可使用10個代換參數,這些變數的值,則由呼叫批次檔的命令所指定。
Ex:
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
echo %1 %2 %3 %4

結果:


三、 PAUSE:是暫停批次檔的執行。當MS-DOS執行到PAUSE時就暫時中止目前的工作,並印出下列訊息:
press any key to contunue ……
Ex:
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
echo %1 %2 %3 %4
pause
echo %5 %6

結果:


四、 REM(REMark)用來在批次檔執行中顯示某些訊息,用法是在批次檔中鍵入rem,後面跟著所要顯示的字串
Ex:
@echo off
echo .... 測試代換參數指令
echo .... 請稍後
echo .... 完成.....
rem 下面指令,開始做代換參數
echo %1 %2 %3 %4
pause
echo %5 %6

五、 IF
IF命令在批次檔中用來測試特定的條件,以決定是否執行某些命令。絛件的型態分為四種:
(1) IF EXIST
此條件是用來檢查某一檔案是否存在,若存在則條件成立,便執行指定的命令
Ex:
@echo off
if exist test1.bat type test1.bat
echo 執行程式結束

結果:


(2) IF String1 = = String2(= = 表相等性的比較)
Ex:
@echo off
echo .... 測試IF指令
echo %1
if %1 == a goto first
if %1 == b goto second
if %1 == c goto three
:first
echo 執行first (a)
goto finish
:second
echo 執行second (b)
goto finish
:three
echo 執行three (c)
goto finish
:finish

結果:


(3) IF ERRORLEVEL
ERRORLEVEL是由MS-DOS所管理的一個系統變數,目的是監視所有錯誤發生的情況。(類似ErrorMessage)

(4) IF NOT
IF NOT是當測試條件不成立時才執行後面命令

Ex:
@echo off
if not exist test1.bat type test1.bat
echo 執行程式結束

結果:


六、 GOTO
GOTO命令在批次檔中用來轉移控制權,可以指示批次檔跳至某一標記(line label)由一個冒號(:)跟著字元符號所組成的;label也可使用代換變數
Ex:
goto first 或 goto %1

七、 FOR
FOR命令允許批次檔中的其他命令,可以重覆地執行
for %%a IN (file1 file2 file3) DO del %%a
虛擬變數必須以兩個百分號(%%)起頭,in後面著參數列,do後面跟著要執行的命令

Ex:
@echo off
echo .... 測試FOR指令
echo .... 請稍後
echo .... 完成.....
echo ....
for %%a IN (test_a.bat test_b.bat test_c.bat) do copy %%a prn

結果:


八、 SHIFT
SHIFT命令允許在批次檔的起動命令中,使用超過10以上的實際參數
(%0~%9)
九、 CALL
模組化的程式設計,是將一個完整的程式分割成一個個獨立的模組(module),每個模組負責一項功能
Ex:
@echo off
echo .... 測試CALL指令
echo .... 請稍後
echo %1 %2
call test_b
echo %3 %4
echo 程式模組已執行完畢 (test_a.bat)

@echo off
echo 執行test_b程式
echo 即將執行test_c .....
call test_c
echo 執行test_b程式完畢~~~ (test_b.bat)

@echo off
echo 執行test_c程式
if exist test2.bat type test2.bat
echo 執行test_c程式完畢~~~ (test_b.bat)

執行 test_a

結果:


有興趣的讀者,不妨逛個書局找本MS-DOS書籍看看唄!

FTP-DOS-3

在 Windows 的 DOS命令提示號下使用 FTP



首先要從 Windows 視窗下進入到 DOS模式 :


Windows 95或98 選取 「開始」/ 「程式集」/ 「MS-DOS模式」
Windows NT 選取 「開始」/ 「程式集」/ 「命令提示列」

使 用 方 法 實 例 說 明:


首先請用 cd 指令切換到檔案存放的目錄,也就是

您要上傳的檔案放在那個目錄?
下載後的檔案要放在那個目錄?
請輸入: cd \data


Microsoft(R) Windows 95
(C)Copyright Microsoft Corp 1981-1996.

C:\WINDOWS>cd\data

C:\data>





用 ftp 指令連線到檔案伺服主機,並輸入帳號資料

請輸入: ftp ftp.mold.net.tw
ftp指令後接著檔案伺服主機的網址或 IP位址

輸入您的帳號名稱
輸入您的密碼

C:\data>ftp ftp.mold.net.tw <---- ftp指令後接著檔案伺服主機的網址或 IP位址
Connected to hirat153.mold.net.tw.
220- Welcome to the MOLD NET Taiwan
220-the CAD/CAM communication center of mold industry
220-Local Time: Tue Oct 13 15:21:57 1998
220-
220 mail.mold.net FTP server (Version wu-2.4.2-academ[BETA-18](1) Sun Sep 20 15:
29:39 CST 1998) ready.
User (hirat153.mold.net.tw:(none)): ratcc <---- 輸入您的帳號名稱

331 Password required for ratcc.
Password: <---- 輸入您的密碼

230 User ratcc logged in. Access restrictions apply.
ftp>




通過身份認證後,就可以使用各種ftp指令,

請輸入: ls -al

這個「列出檔案」指令相當於 DOS 下的 DIR 指令
可顯示遠端檔案伺服主機上的目錄及檔案名稱及其大小

ftp> ls -al <---- 輸入「列出檔案」指令
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 24
drwx------ 9 234 igs 512 Oct 13 07:18 .
drwxr-x--- 193 root igs 3584 Oct 13 07:05 ..
drwxr-xr-x 2 234 igs 512 Oct 13 07:17 dialup
drwxr-xr-x 2 234 igs 512 Oct 13 07:17 email
drwxr-xr-x 4 234 igs 512 Oct 13 07:18 ftp
drwxr-xr-x 5 234 igs 512 Oct 13 07:19 netscape
drwxr-xr-x 2 234 igs 512 Oct 13 07:18 telnet
drwxr-xr-x 2 234 igs 512 Oct 13 07:18 www
drwxr-xr-x 4 234 igs 512 Oct 13 07:18 zip
226 Transfer complete.
551 bytes received in 0.44 seconds (1.25 Kbytes/sec)
ftp>

切換目錄指令 cd

請輸入: cd zip

這個指令相當於 DOS 下的 cd 指令
切換到指定的目錄名稱下

ftp> cd zip <---- 輸入「切換目錄」指令
250 CWD command successful.
ftp> ls -al <---- 再輸入「列出檔案」指令
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 4152
drwxr-xr-x 4 234 igs 512 Oct 13 07:18 .
drwx------ 9 234 igs 512 Oct 13 07:18 ..
-rw-r--r-- 1 234 igs 1149558 Oct 13 07:18 PZIP40.EXE
-rw-r--r-- 1 234 igs 943949 Oct 13 07:18 WINZIP70.EXE
drwxr-xr-x 2 234 igs 512 Oct 13 07:18 Winzip63
drwxr-xr-x 2 234 igs 512 Oct 13 07:18 winRar
226 Transfer complete.
387 bytes received in 0.00 seconds (387000.00 Kbytes/sec)




設定傳送模式指令 bin 或 asc

請輸入: bin

這個指令設定傳送的檔案為二進位檔(Binary)
若傳送的檔案為純文字檔(ASCII)請輸入: asc
ftp> bin <---- 輸入bin 設定下一步驟將要傳送的檔案為二進位檔
200 Type set to I.




下載檔案指令 get

請輸入: get WINZIP70.EXE
get 指令後接著 想要下載的檔案名稱

請注意檔案名稱的大小寫,否則會找不到檔案
您也可以用 mget *.exe 一次下載多個檔案

ftp> get Winzip70.exe <----輸入下載檔案指令
200 PORT command successful.
550 Winzip70.exe: No such file or directory. <----因大小寫錯誤產生的訊息
ftp> get WINZIP70.EXE <----再輸入下載檔案指令及正確檔案名稱
200 PORT command successful.
150 Opening BINARY mode data connection for WINZIP70.EXE (943949 bytes).
<---- 等待傳輸

226 Transfer complete. <---- 傳輸完成
943949 bytes received in 1.10 seconds (858.14 Kbytes/sec)
ftp>





上傳檔案指令 put

請輸入: put uedit32i.exe
put 指令後接著 想要上傳的檔案名稱

請注意檔案名稱的大小寫,否則會找不到檔案
您也可以用 mput *.exe 一次上傳多個檔案
ftp> put uedit32i.exe <----輸入上傳檔案指令
200 PORT command successful.
150 Opening BINARY mode data connection for uedit32i.exe. <----等待傳輸
226 Transfer complete. <---- 傳輸完成
842528 bytes sent in 1.10 seconds (765.93 Kbytes/sec)
ftp>





刪除檔案指令 delete

請輸入: delete uedit32i.exe
delete 指令後接著 想要刪除檔案的名稱

請注意檔案名稱的大小寫,否則會找不到檔案
您也可以用 mdelete *.exe 一次刪除多個檔案
ftp> delete uedit32i.exe
250 DELE command successful.
ftp>




求助指令 help 或 ?

請輸入: help

此指令將列出所有可用的指令
請輸入: ? mput
此指令將顯示 mput 指令的說明
ftp> help <----輸入求助指令
Commands may be abbreviated. Commands are:

! delete literal prompt send
? debug ls put status
append dir mdelete pwd trace
ascii disconnect mdir quit type
bell get mget quote user
binary glob mkdir recv verbose
bye hash mls remotehelp
cd help mput rename
close lcd open rmdir

ftp> ? mput <----輸入求助指令並接著想查詢的指令
mput send multiple files
ftp>


傳輸完畢後請記得輸入「斷線」指令 bye,就可直接回到 DOS 的提示號

ftp> bye
221 Goodbye.

C:\data>


--------------------------------------------------------------------------------

FTP-DOS-2

一、前言

在 Internet 上的資源有許多種儲存方式,以大量檔案資料集中並分門別類儲存在
電腦主機內,提供網路上使用者上線取用,此種方式是為 FTP 檔案傳輸,而這一台存
有大量資料的電腦主機稱為檔案傳輸伺服器(FTP Server)。

在透過電話線使用 BBS 作檔案的上傳 (Upload) 與下載 (Download) 時必須經由
某種特別的傳輸協定 (如Xmodem,Ymodem,Kermit等) 來達成,而兩台在 Internet 上的
電腦主機也必須經由共同的網路檔案傳輸協定來進行檔案傳輸,FTP (File Transfer
Protocol) 即為網路檔案傳輸協定的原名,現在經由網路傳送接收檔案的動作亦可稱為
FTP。

在 Internet 上有許多的檔案伺服器,大部份是無條件地開放給使用者 (或稱作
Anonyimous FTP) ,使用者可利用在工作站上的 ftp 程式 (當然您必須要有帳號)
或是 NCSATEL 軟體內的 ftp 程式來存取檔案, 亦有些檔案伺服機會要求您輸入您
的 E'mail Address 作為密碼。

二、FTP 的使用

NCTUCCCA 是 Internet 上相當有名的網路檔案伺服機,IP-ADDRESS 是 140.113.
250.2,儲存的資料量非常大,以下就以此站為例解說 FTP 之使用:



1. 連接檔案伺服機:

UNIX 命令格式: ftp FTP-Server-Name/IP-address

即 unix> ftp NCTUCCCA 或
unix> ftp 140.113.250.2

DOS 命令格式: ftpbin FTP-Server-Name/IP-address

即 c:\ncsatel\ftpbin NCTUCCCA 或
c:\ncsatel\ftpbin 140.113.250.2

若有設定 Name-Server 或 IP-address 有加入 /etc/hosts (或config.tel) 中,
可以直接使用 FTP-Server-Name,否則就必須使用 IP-address。連接之後將出現如下
訊息:
Connected to Servers.nctu.edu.tw.
220 NCTUCCCA.NCTU.edu.tw(FTP.NCTU.edu.tw) Anonymous FTP Archives, WELCOME from
ccsun34.csie.nctu.edu.tw.
Name (NCTUCCCA:hschang): anonymous
^^^^^^^^^
在此輸入 username,在這裡是 anonymous FTP

331 Send your complete e-mail address (user@host.subdomain.domain) as password.
Password:hschang@csie.nctu.edu.tw
^^^^^^^^^^^^^^^^^^^^^^^^
若是使用 anonymous FTP,則會要求您輸入 E'mail Address,若正確則有下面訊息:

230- Welcome hschang@csie.nctu.edu.tw. Local time: Aug 30 21:52:42 1994.
230- It seems you are a newcomer.
230-
...
...
230-
230-Please read the file 00README.FTP
230- it was last modified on Sat Apr 2 01:40:37 1994 - 150 days ago
230 Guest login ok, access restrictions apply.
ftp>
上面的訊息提供一些對該站的說明,並告知使用者已經成功的連接到該站,假如上
面的步驟有錯誤,則可能出現如下的訊息:

530-
530- Sorry, the response 'Wrong E'mail Address' is not a valid e-mail
^^^^^^^^^^^^^^^^^^^^
這指您輸入的 E'mail Address 不是正確的

530- It is an anonymous ftp archive convention that you might be asked to
530- use your COMPLETE E-MAIL ADDRESS as your password. .......
...
...
530 Login incorrect.
Login failed.
ftp>

則指輸入之 password 不是所指定的 username 的。此時可利用 FTP 提供的 user
命令重新輸入 username 及 password。

FTP 命令格式: user [username]

即: ftp> user [username]

打入 user anonymous 後,FTP 會再要求 password (E'mail address),如果輸入
正確,則會再出現上列 login 成功的訊息。



2. FTP 常用指令說明:


ls 查看 Server 端的目錄或檔案

pwd 查看 Server 端目前所在的目錄

cd 變更 Server 端目前的目錄

cdup 變更 Server 端目前的目錄到上一目錄

lls 查看 Local 端的目錄或檔案

lcd 變更 Local 端目前的目錄

asc 設定傳輸模式為文字檔方式

bin 設定傳輸模式為二進位檔方式
get 將 Server 端的檔案拷貝至 Local 端現在目錄下

mget 拷貝多個 Server 端的檔案至 Local 端現在目錄下

put 將 Local 端的檔案拷貝至 Server 端現在目錄下

mput 拷貝多個 Local 端的檔案至 Server 端現在目錄下

delete 刪除 Server 端的檔案

mkdir 在 Server 端建立目錄

rmdir 刪除 Server 端的目錄

! shell 指令

!ls 查看 Local 端的目錄或檔案

prompt 變換交談模式 (on/off),

?,help 指令使用說明

bye 結束 FTP


下表是 FTP 的命令列表,可用 help 指令查詢用法:

! cr macdef proxy send
$ delete mdelete sendport status
account debug mdir put struct
append dir mget pwd sunique
ascii disconnect mkdir quit tenex
bell form mls quote trace
binary get mode recv type
bye glob mput remotehelp user
case hash nmap rename verbose
cd help ntrans reset ?
cdup lcd open rmdir
close ls prompt runique


3. 常用命令使用之例子:


ftp> pwd -- 顯示所在目錄
^^^
257 "/" is current directory.


ftp> ls -- 顯示所在目錄下的檔案或目錄
^^
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
00README.FTP
Chinese
Macintosh
NCTU
NeXT
Operating-Systems
PC
UNIX
USENET
X
ccc
computing-languages
documents
images
misc
packages
vendors
archive-info
00ls-lR
00ls-lR.gz
...tmp
...home
226 Transfer complete.
208 bytes received in 0.021 seconds (9.8 Kbytes/s)

上面所列出的目錄名是 NCTUCCCA 主要的資料分類,每個目錄底下都還有許多數
層的子目錄,有些目錄下還會再放有說明檔 (如 readme.txt 之類的檔名) 來說明該
目錄下的檔案或子目錄內容。在根目錄裡有幾個說明檔如下:

00README.FTP 對 NCTUCCCA FTP-Server 的簡單說明
00ls-lR 整個 FTP-Server 的目錄/檔案列表
00ls-lR.gz 00ls-lR 的壓縮檔
archive-info 內有 FTP-Server 的使用狀況說明及新增檔案列表

以下為主目錄的分類:

/Chinese 中文資料、軟體及文件,包含 Big5、CCCII、GB、HZ、
CNS 中文碼。
/Macintosh Macintosh 軟體區。
/NCTU 交通大學軟體區。
/NeXT NeXT 軟體區。
/Operating-Systems 各式作業系統,Linux,386BSD,NetBSD,bsd-sources。
/PC MSDOS 各式應用軟體。
/PC/os2 IBM OS2 軟體。
/PC/windows MicroSoft Windows 各式應用軟體。
/UNIX UNIX 及 GNU 軟體。
/USENET USENET archive 及 USENET 的問答集 (FAQ)。
/X X Windows 應用程式及 X11R4,X11R5 原始程式。
/archive-info 檔案資料庫的說明資料。
/computing-languages 各式電腦語言編譯程式。
/images GIF 圖形檔案及應用程式。
/packages hytelnet,kermit,news system,mail 等軟體。
/vendors 軟硬體供應商提供之軟體區。


ftp> cd PC -- 變更到 /PC 目錄下
^^^^^
250 Change exactly to the directory "/PC".


依次進入 /PC/windows/desktop 目錄下



ftp> cd windows -- 變更到 /PC/windows 目錄下
^^^^^^^^^^
250 Change to the parent of current working directory "/PC/windows".

ftp> cd desktop -- 變更到 /PC/windows/desktop 目錄下
^^^^^^^^^^
250 Change exactly to the directory "/PC/windows/desktop".



或直接進入 /PC/windows/desktop 目錄下



ftp> cd /PC/windows/desktop -- 變更到 /PC/windows/desktop 目錄下
^^^^^^^^^^^^^^^^^^^^^^^


ftp> ls -- 顯示目錄 /PC/windows 下的檔案或目錄
^^
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
vuepri31.zip
.
. skipped
.
tclock.zip
wmigr.zip
sspw31.zip
freedock.zip
cuseemez.exe
slideshw.zip
diamond.zip
colscr.zip
.
.
226 Transfer complete.
7625 bytes received in 0.98 seconds (7.6 Kbytes/s)

ftp> bin -- 設定二進位方式
^^^
200 Type set to I.
ftp> get freedock.zip -- 拷貝 freedock.zip 到 Local 端來
^^^^^^^^^^^^^^^^
200 PORT command successful.
150 Opening BINARY mode data connection for /PC/windows/desktop/freedock.zip
(114433 bytes).
226 Transfer complete.
local: freedock.zip remote: freedock.zip
114433 bytes received in 0.79 seconds (1.4e+02 Kbytes/s)

上面的訊息說明了被傳輸的檔名(含路徑)、傳輸模式、檔案大小、花費時間(傳輸
率) , remote 端即指 Server 端。若一次要拷貝多檔可用 mget,在 prompt on 的
情況下會要求您對每個符合的檔案作確認,回答 y(yes) 或 n(no) 確認。或可設定成
prompt off,則所有符合的檔案皆會被拷貝。

ftp> mget *.zip -- 拷貝所有 .zip 檔名的檔案
^^^^^^^^^^
mget vuepri31.zip?y -- Yes 拷貝
^
.
.

ftp> prompt -- 變更交談模式
^^^^^^
Interactive mode off -> 預設為 on,經 prompt 命令變更為 off

有些 FTP Server 會提供使用者上載 (upload)檔案的權力,put/mput 是將 Local
端的檔案拷貝到 Server 端的命令,使用方法如同 get/mget。



4. 尋找檔案

在龐大的檔案資料中,如何尋找到所需檔案呢? ls 命令亦提供檔案搜尋的功能,
可已檔名或部份檔名作為搜尋的關鍵字, ls 會從根目錄開使查詢,並根據設定的停止
搜尋條件停止搜尋。quote 是 FTP 內特別的命令,他會把 quote 後所接的字串傳送
到 Server 端,由 Server 端再處裡。搜尋命令用法如下:

FTP 命令格式:ls --關鍵字

FTP 命令格式:quote site find 關鍵字

設定停止的條件是以搜尋到的檔案數目計算,必須以 quote 指令設定最大搜尋數,
命令用法如下:

FTP 命令格式:quote site findmax #number


ftp> quote site findmax 4 -- 搜尋四個後停止
^^^^^^^^^^^^^^^^^^^^
200 Maximum (ftp) find hits set to 4.


ftp> ls --freedock.zip -- 尋找名為 freedock.zip 的檔案
^^^^^^^^^^^^^^^^^
200 PORT command successful.
200- starting locator of ftp.nctu.edu.tw Anonymous FTP Archives

Location: /PC/windows/desktop
FILE -r--r--r-- 114433 Jun 15 08:00 freedock.zip

200 end (max hits: 4. use 'quote site findmax your_max_hits' to change).

搜尋結果會將檔案所在目錄及檔案大小、更動時間顯示出,如果不只一個也會一
一列出。 ls 提供的檔案查詢是 ARCHIVE Server 提供的一部份,Archive Server
將在後面章節中介紹。


三、即時壓縮/解壓縮功能
為了節省儲存空間,大部份的檔案是經壓縮後儲存的。主要的壓縮檔型態為:

延伸檔名 (解)壓縮程式 作業系統
----------------------------------------------
.Z uncompress/compress UNIX
.gz or .z gunzip/gzip UNIX
.tar tar, tar.exe UNIX,DOS
.zip pkunzip.exe/pkzip.exe DOS
.arj arj.exe DOS
----------------------------------------------


對於 .Z .gz (.z) 兩種壓縮檔案型態,FTP 提供即時壓縮/解壓縮功能,Server
端原來的檔名若有 .Z .gz 的延伸檔名,若要直接拷貝解壓縮之後的檔則 get 後的
檔名不須再加 .Z .gz,FTP 會先解壓縮後再傳送過來。反之若 Server 端檔名原無
.Z .gz 延伸檔名,而在 get 後檔名加延伸名,FTP 就會先壓縮後再傳送過來。詳見
下表:

Server 端的檔名 get 的檔名 壓縮動作
------------- ------------- -----------------------------------
.Z Decompress file before transmitting
.Z Compress file before transmitting
.gz GUNZIP file before transmitting
.z GUNZIP file before transmitting
.gz GZIP file before transmitting
.z GZIP file before transmitting



四、ARCHIVE 檔案資料庫檢索系統簡介


Archive Server 能提供快速的檔案查詢,並將查詢結果回寄(E'mail)給使用者。
在交大亦有個 Archive Server 名為 ARCHIVE(192.83.166.10),須使用 telnet 的方
式連接進入。如同 FTP,使用者可利用在工作站上的 telnet 程式或是 NCSATEL
內的 telbin/nctutel 程式連接,並使用 Archive Server 提供之帳號。連接的指令
如下:

unix> telnet ARCHIVE (ARCHIVE.edu.tw)
^^^^^^^^^^^^^^

unix> telnet 192.83.166.10
^^^^^^^^^^^^^^^^^^^^
此時您可輸入之帳號有三個,hytelnet、archie、www 分別是三個查詢系統,
若輸入 archie 則進入檔案資料庫檢索系統:



NCTUCCCA.edu.tw Login:archie
^^^^^^

login 之後會出現簡單的使用說明,如 find、help、set、list、mail、bye 等常
用指令及系統初設值。

指令說明:

set search sub 設定不考慮英文字母大小寫

set search subcase 設定考慮英文字母大小寫

set search exact 設定完全一致的比對

set search regex 設定為一般字串比對

set maxhits 設定最大檢索數目

set mailto 設定寄發的 E'mail Address

list 列出本系統支援之所有檔案資料庫 (FTP Server)

find 檔案關鍵字檢索

help 輔助說明

whatis 檢索相關軟體名稱

mail 寄發檢索結果

nopager 取消分頁讀取

bye,quit,exit 離開本系統


Archie.TWNIC.NET> set search subcase -- 設定考慮英文字母大小寫
^^^^^^^^^^^^^^^^^^
Archie.TWNIC.NET> set maxhits 10 -- 設定最大檢索數目 10
^^^^^^^^^^^^^^
Archie.TWNIC.NET> find freedock -- 檢索檔案 freedock
^^^^^^^^^^^^^
# Search type: subcase.
# Your queue position: 1
# Estimated time for completion: 5 seconds.
working...

Host NCTUCCCA.edu.tw (192.83.166.10)
Last updated 16:39 31 Aug 1994

Location: /PC/windows/desktop
FILE -r--r--r-- 114433 bytes 16:00 15 Jun 1994 freedock.zip

Host ftp.ccu.edu.tw (140.123.1.3)
Last updated 20:58 29 Aug 1994

Location: /pub/msdos/windows/desktop
FILE -r--r--r-- 114433 bytes 03:51 16 Jun 1994 freedock.zip

Host ftp.nsysu.edu.tw (140.117.11.3)
Last updated 21:27 29 Aug 1994

Location: /pub1/nsysu/pc/win3/desktop
FILE -rw-r--r-- 114433 bytes 03:51 16 Jun 1994 freedock.zip

在三個 FTP Sever 內都找到名為 freedock* 的檔名,分別為:

Host NCTUCCCA.edu.tw (192.83.166.10) /PC/windows/desktop/freedock.zip
Host ftp.ccu.edu.tw (140.123.1.3) /pub/msdos/windows/desktop/freedock.zip
Host ftp.nsysu.edu.tw (140.117.11.3) /pub1/nsysu/pc/win3/desktop/freedock.zip


Archie.TWNIC.NET> mail hschang@csie.nctu.edu.tw -- 寄發檢索結果
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Archie.TWNIC.NET> list -- 列出本系統支援之所有檔案資料庫 (FTP Server)
^^^^
您可利用此命令找出其它的 ftp server 或 archive server


Archie.TWNIC.NET> quit -- 離開本系統
^^^^
# Bye.

FTP-DOS

? 列出 ftp 指令功能,即「線上輔助說明」。
格式為" ? [指令]",如省略指令,則列出所有 ftp 指令。

! 暫時回到 DOS 狀態,在 DOS 下鍵入" exit "後回到 ftp狀態。您也
可以利用" ! "連著 DOS 指令在 ftp 狀態下執行 DOS 功能。
例如: " !dir "可列出 DOS 的目錄內容、" !type readme.txt " 可
顯示 readme.txt 的內容。

ascii 進入文字檔的傳輸方式。

binary 進入二進位檔的傳輸方式。

※ 請勿利用文字檔的方式傳輸二進位檔,否則檔案會傳輸失敗。

bye 切線並離開 ftp 狀態。

close 切線但不離開 ftp 狀態。可鍵入" open "開啟另一連線。

dir 列出目錄內容。

get 拮取一個檔案。
格式為" get [對方機器的檔名] [自己機器的檔名]",如自己機器的
檔名省略,則使用原來的檔名存檔。

help 和 ? 的功能一樣。

lls 列出自己機器的目錄內容。
格式為" lls [檔名或目錄名] ",可用萬用字元。如不可使用此指令
,可鍵入" !dir "列出目錄。

ls 列出對方機器的目錄內容。
格式為" ls [檔名或目錄名] ",可用萬用字元。

mget 一次抓取多個檔案。
格式為" mget [檔名或目錄名]",檔名可使用萬用字元。

※ 如欲拮取所有檔案,請用" mget * "而非" mget *.* "。

more 一次顯示一個螢幕。對" ls "及" dir "的顯示非常有用。

mput 一次放入數個檔案。
格式為" mput [檔名或目錄名]",檔名可使用萬用字元。如欲放入所
有檔案,請用" mput * "而非" mput *.* "。

open 開啟一個連線。
格式為" open [ IP address ]"。

put 一次放入一個檔案。
格式為" put < 自己機器的檔名 > < 對方機器的檔名 >"。

pwd 顯示連線機器目前所在目錄。

quit 和 bye 的功能一樣。

status 列出 ftp 目前狀態。

user 重新簽入。當第一次簽入失敗時可用此指令重新簽入。

2008年3月27日 星期四

工作管理員TAB不見如何處理

把滑鼠游標移到工作管理員的視窗邊框上-->按兩下就行了(double-click),工作管理員的功能表就會出現,恢復到傳統外觀。

2008年3月21日 星期五

VB.NET 發信

Dim mailmsg As New System.Net.Mail.MailMessage
mailmsg.To.Add(New System.Net.Mail.MailAddress("maxx31@xx.com.tw", "助理"))
mailmsg.Bcc.Add(New System.Net.Mail.MailAddress("rowxx@xx.com.tw", "電腦"))
Dim smtp As New System.Net.Mail.SmtpClient
smtp.Host = "10.20.xx.2xx"
smtp.Send(mailmsg)

2008年3月20日 星期四

用Vbscript 改檔名

Set objFSO = CreateObject("Scripting.FileSystemObject")
SourceFile=Server.MapPath("c:/test.asp") '要改的原始檔
TargetFile=Server.MapPath("c:/test1.asp") '新的檔名
objFSO.MoveFile SourceFile, TargetFile

在DTS中使用Activex 工作處理檔案--Copy

'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************

Function Main()
dim fs,strfullpath,f
set fs=createobject("Scripting.FileSystemObject")



Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim f2
dim yyymm

Set f2 = fs.OpenTextFile("D:\SKBANK\BISsys\DATA\lnctbfy.dat", ForReading, True)

yyymm = f2.Read(5)



'Main=DTSTaskExecResult_Failure


fs.CopyFile "D:\SKBANK\BISsys\DATA\lnctbfy.dat", "D:\SKBANK\BISsys\DATA\"+yyymm+"lnctbfy.dat"

set fs=nothing
Main=DTSTaskExecResult_Success
End Function

在DTS中使用Activex 工作處理檔案

'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************

Function Main()
dim fs,strfullpath,f
set fs=createobject("Scripting.FileSystemObject")
if (fs Is Nothing) then

Main=DTSTaskExecResult_Failure
'msgbox "1"
exit function

end if
strfullpath="D:\SFBAFK\BISsys\DATA\lnctbtt.dat"
if not fs.fileexists(strfullpath) then

Main=DTSTaskExecResult_Failure
'msgbox "2"
set fs=nothing
exit function
end if

Set f = fs.GetFile(strfullpath)


if f.size =0 then

Main=DTSTaskExecResult_Failure
'msgbox ""
set fs=nothing
exit function
end if
set fs=nothing
'msgbox "4"
'Main=DTSTaskExecResult_Failure
Main=DTSTaskExecResult_Success
End Function

在DTS中使用Active 工作執行DTS

'**********************************************************************
' Visual Basic ActiveX Script
'************************************************************************

Function Main()

dtsname="ImportBISTwd"
usrname="sa"
servername="MA03XXBXX"
pwd="sapwd"
DTSSQLStgFlag_Default2=0


dim objDTSPackage
dim objDTSStep
dim strResult
dim blnSucceeded

const DTSSQLStgFlag_Default = 0
const DTSStepExecResult_Failure = 1

set objDTSPackage = CreateObject("DTS.Package")

objDTSPackage.LoadFromSQLServer servername, usrname, pwd, DTSSQLStgFlag_Default2, "", "", "", dtsname
objDTSPackage.Execute

Main = DTSTaskExecResult_Success
End Function

2008年3月17日 星期一

DROP TABLE

IF EXISTS(SELECT name FROM sysobjects WHERE name = N'CUST'
AND type = 'U')
DROP TABLE CUST

Create Table Index

SET NOCOUNT OFF
USE MegaCenter
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'custid_idx')
DROP INDEX CUST.custid_idx
GO
USE MegaCenter
CREATE INDEX cust1id_idx
ON CUST (CID)
GO

2008年3月14日 星期五

BULK INSERT

BULK INSERT Cloris.dbo.Not3 FROM 'C:\Not3_2007.txt' WITH
( FIELDTERMINATOR =',' , ROWTERMINATOR =',\n' )
C:\Not3_2007.txt------------------------00118,黃河泉,1,
Cloris.dbo.Not3資料欄位
C1 varchar(5) C2 varchar(20) C3 varchar(1)

SQL Query-Dos命令

start isqlw -S ma0xxxxx02 -d Northwind -U sa -P sapwd

ADDLINKEDSERVER

USE master
--連到外部資料庫
EXEC sp_addlinkedserver @server='HR', @srvproduct='',
@provider='SQLOLEDB', @datasrc='MKxxxS0001'
--建立Login資料
EXEC sp_addlinkedsrvlogin 'HR', 'false', NULL, 'M6692', 'ssspwd'
--查詢已連結資料庫
EXEC sp_linkedservers
--刪除已連結資料庫
EXEC sp_dropserver ''HR'', 'droplogins'

2008年3月13日 星期四

用VB開啟檔案(IE,記事本)

Set ob = CreateObject("WScript.Shell")
ob.Run "Notepad D:\SKBANK\SendMail\HRPL.htm"
ob.Run "IEXPLORE " + App.Path + "\HRPL.htm"

2008年3月10日 星期一

用VB控制Excel

Dim ExcelApp As Excel.Application

Set ExcelApp = CreateObject("Excel.Application")
With ExcelApp
.Application.DisplayAlerts = False '抑制刪除警告提示訊息
.Workbooks.Open FileName:=App.Path + "\Sample.xls"
.Visible = True

.Workbooks.Open FileName:=strFileName + ".xls"

.Range("D" + CStr(i)).Select
strTmp = .ActiveCell.FormulaR1C1

.Range("A3:S" + CStr(i)).Select
.Selection.Copy
.Windows("Sample.xls").Activate
.Range("A" + CStr(m)).Select
.ActiveSheet.Paste
.Windows(FileName + ".xls").Close

.ActiveSheet.PageSetup.PrintArea = "$D$1:$K$" + CStr(m - 1)

.Columns("T:T").Select
.Selection.WrapText = True

'另存新檔
.ActiveWorkbook.SaveAs FileName:=App.Path + "\Merge.xls",FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
'關閉檔案
.ActiveWindow.Close

Set ExcelApp = Nothing

用VB控制ADODB.Connection

Set cnKPI = New ADODB.Connection

cnSQL = "Provider=SQLOLEDB.1;Persist Security Info=False;" & _
"USER ID = sa;password=xxxxx;initial catalog=KPxxxS;" & _
"Data Source=maxx05kxxxb"

cnKPI.ConnectionString = cnSQL

cnKPI.Open

用VB控制OutLookExchange發信

Dim olApp As Object
Dim Itm As Object


Dim FileName As String
Dim strBody As String

Set olApp = CreateObject("Outlook.Application")
Set Itm = olApp.CreateItem(0)
With Itm
.Subject = "薪資清冊及其它"
.To = strMail
.Body = "薪資清冊及其它"

.Attachments.Add strFileName1
.Attachments.Add strFileName2
'直接發信
' .Send
'儲存
' .Save
'啟動視窗

.Display

用VB控制FileSystem--開啟,建立文字檔

Dim fs, FileName, txtf
Set fs = CreateObject("Scripting.FileSystemObject")
FileName = "D:\Bank\" + strFileName

If fs.FileExists(FileName) Then
'資料加在文字檔後面
Set txtf = fs.OpenTextFile(FileName, 8, False)
Else
Set txtf = fs.CreateTextFile(FileName, True)
End If
txtf.WriteLine CStr(strString)
Set fs = Nothing
'刪除檔案
fs.DeleteFile (strFileName)