2010年3月2日

          原創(chuàng),轉(zhuǎn)載請注明出處。

          今天都在折騰project explorer,主要是在RCP里加入project explorer以后,不能正常顯示,同時刷新的時候又清空那個view,非常奇怪。

          最后按照eclipse.org的help的指導(dǎo)設(shè)置成功,
          http://help.eclipse.org/ganymede/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/cnf.htm

          主要是要在自己的WorkbenchAdvisor類里面重寫的initialize(IWorkbenchConfigurer configurer)的方法。

           1     public void initialize(IWorkbenchConfigurer configurer) {
           2         IDE.registerAdapters();
           3         final String ICONS_PATH = "icons/full/";
           4         final String PATH_OBJECT = ICONS_PATH + "obj16/";
           5         Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);
           6         declareWorkbenchImage(configurer, ideBundle,
           7                 IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif",
           8                 true);
           9         declareWorkbenchImage(configurer, ideBundle,
          10                 IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
          11                         + "cprj_obj.gif"true);
          12 
          13         super.initialize(configurer);
          14         configurer.setSaveAndRestore(true);    
          15     }
          16 
          17     private void declareWorkbenchImage(IWorkbenchConfigurer configurer_p,
          18             Bundle ideBundle, String symbolicName, String path, boolean shared) {
          19         URL url = ideBundle.getEntry(path);
          20         ImageDescriptor desc = ImageDescriptor.createFromURL(url);
          21         configurer_p.declareImage(symbolicName, desc, shared);
          22     }

          然后是覆蓋getDefaultPageInput方法如下

          1 @Override
          2 public IAdaptable getDefaultPageInput() {
          3         return ResourcesPlugin.getWorkspace().getRoot();
          4      }


          這次得到的教訓(xùn)就是以后有什么問題首先查詢eclipse.org,要不浪費(fèi)太多時間了。

          posted @ 2010-09-16 17:02 Li Ya Qiang 閱讀(2265) | 評論 (0)編輯 收藏

          第4章 準(zhǔn)備

          準(zhǔn)備階段最重要是關(guān)于HTML/CSS和Javascript如何協(xié)作的問題。

          瀏覽器初始化順序是首先腳步,然后是statements,最后是html。

          如果在js里面直接引用body里面的element就會報錯,最好是把執(zhí)行腳本放到函數(shù)里調(diào)用


          function initializePage() {
                 
          var x = document.getElementById('test');
                 x.onclick 
          = function () {alert('Hello world!')};
          }
          window.onload 
          = initializePage;



          一些常見的鉤子

          id:創(chuàng)建鉤子最簡單的方法,每個id在文檔中只能使用一次。


          var x = document.getElementById('hook');

          class:可以為一系列的元素初始化相同的行為。

          var lists = document.getElementsByTagName('ul');
          for (var i=0; i<lists.length; i++) {
              
          if (lists[i].className != 'menutree') continue;
              
          //初始化行為
          }


          自定義屬性:即不屬于(X)HTML規(guī)范的屬性,這是不合法的,但有時為了腳本的方便使用它。

          var maxLength = this.getAttribute('maxlength');


          名/值對:即寫成如下的形式,然后從className中通過操作字符串獲取狀態(tài)。

          <textarea class="maxlength=300"></textarea>


          準(zhǔn)備頁面:設(shè)置事件處理程序,確定訪問者狀態(tài),設(shè)置訪問,產(chǎn)生內(nèi)容,定義關(guān)系(relatedElement),修改文檔結(jié)構(gòu)。

          <script>標(biāo)簽

          defer屬性:表示正在加載中的腳本不包含任何會改變HTML的指令(如document.write)。Explorer僅在頁面已經(jīng)完全加載之后才會執(zhí)行擁有defer屬性的腳本。

          XHTML規(guī)定包含內(nèi)容的script標(biāo)簽必須定義成CDATA,它會告訴XML/HTML解釋器不要解析這些內(nèi)容,而是直接送給腳本引擎。

          <script type="text/javascript">
          //<![CDATA[
          alert('Hello World!');
          //]]>
          </script>


          所有的腳本都被注冊到HTML的全局對象中,同一個變量可以在多個腳本中使用,且為最后定義的那個。

          當(dāng)瀏覽器遇到script標(biāo)簽時,發(fā)送一個HTTP請求去獲取腳本文件,解析其中的腳本,對HTML頁面的分析和渲染暫停,直到腳本加載完成。

          load事件會在頁面完全加載時觸發(fā),window.onload = ; 多次設(shè)置onload會覆蓋之前的設(shè)置,需要編寫函數(shù)在同一個元素上設(shè)置多個事件處理程序。

          等待load時會因為圖片等造成延遲,這個問題很難解決,目前只有Mozilla支持的DOMContentLoaded事件,在文檔加載完成后執(zhí)行,不必等待圖片。




          posted @ 2010-08-21 22:42 Li Ya Qiang 閱讀(194) | 評論 (0)編輯 收藏

          第3章 瀏覽器

          每種瀏覽器都包含一個代碼引擎或渲染引擎,它負(fù)責(zé)解釋W(xué)eb頁面上的代碼,javascript解釋器是其中的一部分。

          Netscape4慘敗之后,網(wǎng)景公司于1998年創(chuàng)立了Mozilla項目,開發(fā)了Gecko引擎,現(xiàn)在它支持著Mozilla, Firefox, Netscape, Camino等瀏覽器。

          Explorer的代碼引擎叫做Trident,1999年3月發(fā)布的Explorer5.0是第一個支持W3C DOM和XMLHttpRequest的瀏覽器,但也是最后一個包含了主要Javascript更新的Explorer版本。

          Safari于2003年發(fā)布,它使用KHTML代碼引擎,它是Macintosh平臺的默認(rèn)瀏覽器。

          Opera是一個獨(dú)立的瀏覽器,在瀏覽器大戰(zhàn)期間,它沒有實現(xiàn)DHTML,現(xiàn)在看來,這是一個相當(dāng)英明的決定。

          4種兼容性問題

          不支持:這些出現(xiàn)問題的功能不是“不可或缺”的基礎(chǔ)功能,都能夠通過對象檢測判斷,而且瀏覽器也在努力消除這些問題,如document.sytleSheets來讀寫整個樣式表,目前Safari和Opera也增加了對其的支持。

          合理的不同看法:如defer屬性對加載腳本的要求,Exploer有獨(dú)特的理解,幸好這種問題是最少有的。

          有意為之的兼容性問題:通常是瀏覽器大戰(zhàn)的遺留問題,也可以通過對象檢測來判斷,一旦微軟著手實現(xiàn)W3C事件標(biāo)準(zhǔn),最后一批被故意造成的兼容性問題也將得到解決。

          瀏覽器bug:這是由于編程的缺陷造成的不可預(yù)見的錯誤,它是無法解決也是無法衡量的。如Exploer6會被normalize()方法導(dǎo)致崩潰。

          瀏覽器兼容性問題是單純的生活的事實,它不會輕易消失,應(yīng)該盡快地習(xí)慣它,至少聽任它。

          在任何情況下都不要先為某一個瀏覽器寫腳本,然后增加其他瀏覽器的支持。在項目支出就應(yīng)該解決這些兼容性問題,而不是放在最后。

          對象檢測

          對象檢測是避免兼容性問題的最佳助手。它的一般方法是檢查想使用的對象,看它們是否存在,如果不存在,就結(jié)束函數(shù)。(if(!對象)),從技術(shù)上說,對象檢測是把一個對象轉(zhuǎn)換成一個布爾值。

          檢查W3C DOM:


          var W3CDOM = document.createElement && document.getElementsByTagName;


          對W3C DOM的檢測使我們可以總是假設(shè)瀏覽器也支持相關(guān)的功能,如appendChild,而省去對它的檢查。

          事件處理測試:


          function addEventSimple(obj, evt, fn) {
              
          if (obj.addEventListener) //W3C
                  obj.addEventListener(evt, fn, false);
              
          else if (obj.attachEvent) //微軟
                obj.attachEvent('on' + evt, fn);
          }

          我們期望未來的版本使用標(biāo)準(zhǔn),所以對標(biāo)準(zhǔn)的支持應(yīng)該最先檢查,事實上先檢查attachEvent,F(xiàn)x等瀏覽器會報錯。

          瀏覽器檢測

          為什么瀏覽器檢測行不通?瀏覽器兼容性模式是不斷變化的,今天不支持的屬性,明天可能會支持;而且瀏覽器常常會偽裝自己的身份,以便通過瀏覽器檢測。

          瀏覽器檢測的軍備競賽

          navigator.userAgent中保存了每一個瀏覽器的識別字符串。1995年前后的Mosaic和Netscape年代中,由于 Netscape的cookie和<center>標(biāo)簽等的支持,服務(wù)器端的程序員決定使用瀏覽器檢測來區(qū)分兩種瀏覽器,他們檢測識別字符串 是否從Mozilla/開始,這給javascript世界帶來了不必要的磨難。瀏覽器廠商被迫將自己的識別字符串變成從Mozilla/開始,即便是 Explorer最初進(jìn)入市場時也將自己偽裝成了Netscape。瀏覽器大戰(zhàn)開始后,Web開發(fā)者們做出反應(yīng),他們創(chuàng)建了更多的瀏覽器程序來區(qū)分 Netscape和Exploer,而當(dāng)戰(zhàn)爭結(jié)束時,已經(jīng)有數(shù)不清的網(wǎng)站設(shè)置了檢測腳本只允許Explorer訪問,歷史重演了,一些瀏覽器如 Opera,又不得不修改自己的識別字符串來匹配Explorer,甚至將識別字符串的設(shè)置開放給用戶。

          拆解瀏覽器字符串

          Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915
          Mozilla
          /4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
          Mozilla
          /5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.6
          Mozilla
          /4.0 (compatible; MSIE 6.0; Windows NT 5.2)

          第一個是Mozilla1.7.12,第二個是NT5.1(即XP)的Explorer6.0,第三個是Safari1.3.2,第四個是偽裝后的Safari1.3.2。

          userAgent:使用navigator.userAgent,而不是navigator.appName和navigator.appVersion。前者尚有一些遵循,后者都是謊言;

          Mozilla/:只能證明瀏覽器是1994年后發(fā)布的;

          /[version number]:沒有意義,每一個現(xiàn)代瀏覽器都生命是第4版或第5版的Mozilla;

          不規(guī)則字符串:通常被圓括號包圍,包含這非常復(fù)雜的縮寫;

          Opera:唯一支持window.opera屬性,可以檢測這個對象來判斷;

          Safari, iCab和Konqueror:不像Opera那樣勇于承擔(dān)風(fēng)險,它們可以完全地偽裝自己;

          Gecko:Mozilla識別串通常都會包含Gecko,但不幸Safari等也包含;

          MSIE:沒有意義,絕大多數(shù)的瀏覽器都包含MSIE;

          版本號:Exploer和Opera允許在名字后面找到自己的版本號,而其他瀏覽器都無效,比如Mozilla的隱藏版本;

          操作系統(tǒng):Windows操作系統(tǒng)都以Win開始,當(dāng)然這不適用于偽裝的串。

          (http://www.quirksmode.org/js/detect.html)

          瀏覽器檢測的正確使用

          當(dāng)你需要知道訪問者的瀏覽器,如站點統(tǒng)計時,這些檢測不會影響腳本邏輯。

          當(dāng)我們用對象檢測時需要排除瀏覽器bug等時,可以將對象檢測和瀏覽器檢測一起使用。

          調(diào)試

          Mozilla有最好的錯誤信息,因此多在Mozilla中調(diào)試;

          使用return,alert,confirm是不錯的方法,復(fù)雜的調(diào)試可以自己創(chuàng)建一個錯誤控制臺;

          將bug報告給瀏覽器廠商。

          posted @ 2010-08-21 22:27 Li Ya Qiang 閱讀(167) | 評論 (0)編輯 收藏

          第二章 大背景

          javascript嵌入在一個還同時使用著HTML和CSS的環(huán)境中。

           

          2002年,Stuart Langridge提出無侵入腳本編程(unobtrusive scripting)。它代表了向基于CSS的、兼容標(biāo)準(zhǔn)的Web站點的新理論中嵌入Javascript的首次認(rèn)真的嘗試。

          它應(yīng)該是可用的。即給網(wǎng)站帶來明確的可用性好處。

          它應(yīng)該是可訪問的。如果javascript失效,網(wǎng)頁應(yīng)該依然是可閱讀和可理解的。

          它應(yīng)該是容易實現(xiàn)的。Web開發(fā)者只需要在頁面中引入腳本本身和一個Javascript鉤子,腳本就能運(yùn)行。

          它應(yīng)該是分離的。只存在于自己的.js文件中,而不是散落在HTML中。

           

          一個Web頁面由如下三個層組成:HTML結(jié)構(gòu)層、CSS表現(xiàn)層、Javascript行為層。

           

          表現(xiàn)與結(jié)構(gòu)的分離

          所有的表現(xiàn)定義在一個單獨(dú)的CSS文件中,HTML中不再出現(xiàn)<font>標(biāo)簽和用于表現(xiàn)的表格。一般通過腳本改變className來引用不同的

          CSS元素。CSS (display: none)用來表示文檔中的某個元素隱藏,也可以通過腳本從文檔中刪除這個元素。至于采用哪種方式,PPK推薦采用后一種方式。特別是對于form表單的時候,采用第一種方式就會提交很多無用的信息。

           

          行為與結(jié)構(gòu)的分離

          所有的javascript函數(shù)都被放在一個獨(dú)立.js文件中,然后把它鏈入所需要它的HTML頁面中,HTML移除所有的事件處理程序。

          鉤子(hook)用來生命“在這里準(zhǔn)備部署行為”的ID,它是注冊事件處理程序的一種方法。

          javascript:偽協(xié)議是復(fù)雜而骯臟的(<a href="javascript:dosomeaction()">),應(yīng)該放到腳步文件中。

           

          行為和表現(xiàn)的分離

          行為和表現(xiàn)的分離是復(fù)雜的,尚沒有任何的標(biāo)準(zhǔn)。

          當(dāng)若干元素部署相同的效果時,CSS是有效的,而需要創(chuàng)建相似但不完全相同的效果時,javascript是最有效的方法。

           

          可訪問性規(guī)則

          條理分明的HTML,如硬編碼的鏈接必須有href。

          產(chǎn)生對腳本用戶有意義的內(nèi)容,如:

          一條發(fā)送ajax請求的鏈接可以完全用javascript生成,這樣無腳本用戶就不會看到href為#的a標(biāo)簽而產(chǎn)生不解;

          用javascript來隱藏一段內(nèi)容,而不是用css,否則無腳本用戶將永遠(yuǎn)看不到那是什么;

          判斷是否腳本可用,然后跳轉(zhuǎn)到一個無腳本頁面時,要用location.replace而不是location.href,這樣在后退時不會再返回到有腳本頁面,事實上location.href產(chǎn)生了一條歷史記錄;

          針對鍵盤用戶,我們對觸發(fā)事件的元素增加focus動作;

          由于各瀏覽器都支持(但不完全支持)javascript,因此<noscript>標(biāo)簽就顯得沒有意義,最好完全不用。

           

          posted @ 2010-08-21 22:21 Li Ya Qiang 閱讀(189) | 評論 (0)編輯 收藏

          第一章:目標(biāo)

          javascript的目標(biāo)是給Web頁面增加一個額外的可用性層。

           

          js分為6個部分:javascript核心、BOM(瀏覽器對象模型)、事件、DOM(文檔對象模型)、CSS修改、數(shù)據(jù)檢索(XMLHttpRequest)。

          他們的任務(wù):核心使得js成為一門編程語言的基礎(chǔ),控制結(jié)構(gòu)變量函數(shù)和對 象;BOM給瀏覽器窗口下達(dá)指令,讀取cookie,與其他窗口進(jìn)行通信;事件找出用戶執(zhí)行的動作,并定義這些動作將觸發(fā)的函數(shù);DOM學(xué)習(xí)和改變 HTML文檔的結(jié)構(gòu);CSS學(xué)習(xí)和改變HTML文檔的CSS表現(xiàn);數(shù)據(jù)檢索從服務(wù)器下載新的數(shù)據(jù)而不刷新頁面。

          所有的腳本都是用核心語言、事件和DOM:等待行動,并更新頁面。

           

          ECMA(歐洲計算機(jī)制造聯(lián)合協(xié)會)對javascript核心進(jìn)行標(biāo)準(zhǔn)化(ECMA1.5),這個標(biāo)準(zhǔn)應(yīng)用到flash、瀏覽器、服務(wù)器以及其他尚未產(chǎn)生的應(yīng)用上。

          W3C(萬維網(wǎng)協(xié)會)創(chuàng)建了DOM規(guī)范,它也包括事件處理和CSS修改的內(nèi)容。微軟仍然沒有實現(xiàn)W3C的事件規(guī)范,卻使用它自己專有的事件模型。

          WHAT-WG(Web超文本應(yīng)用技術(shù)工作組)正為BOM標(biāo)準(zhǔn)而工作。

          數(shù)據(jù)檢索使用的則是微軟的事實標(biāo)準(zhǔn),W3C為數(shù)據(jù)檢索推出了XMLHttpRequest規(guī)范的第一部草案。

           

          <script標(biāo)簽中允許在language="javascript1.2"中指定版本號,但自1.2版本開始Netscape和Explorer 4都宣稱支持,因此設(shè)置版本號沒有意義,事實上根本不需要這個屬性。

           

          js遵循嚴(yán)格的安全規(guī)范

          不允許訪問宿主計算機(jī):不能讀寫除cookie外的文件系統(tǒng)

          同源策略:兩個窗口的頁面的Web域名必須相同,才允許跨窗口通信。同子域下可以通過設(shè)置相同的document.domain(必須設(shè)置為真實域名的一部分)進(jìn)行通信。

          其他限制:不能讀取歷史對象的屬性(當(dāng)可以在歷史中后退);不能設(shè)置文件上傳表單域的值;試圖關(guān)閉窗口時會詢問用戶;不允許打開一個小于100x100或處于屏幕之外或沒有標(biāo)題欄的新窗口。

           

          javascript的歷史

          創(chuàng)始人Brendan Eich當(dāng)時在Netscape工作,js公開的歷史從1996.3的Netscape2發(fā)布開始。

          Eich最初的目標(biāo)是為Web開發(fā)者提供一種簡單的方式為頁面增加一些交互,這些 腳本從其他頁面復(fù)制過來并稍作調(diào)整就可以使用。最初命名為LiveScript。但Netscape出于市場的考慮選取了一個與當(dāng)時流行的Java相似的 一個名字,并倉促地要求Eich“使這個語言看起來想Java”,從而誤導(dǎo)人們將js視為輕量級的Java版本,看成一個可以拿來搬弄技巧而不值得引起嚴(yán) 謹(jǐn)?shù)某绦騿T注意的輕巧的腳本語言。

           

          第一瘦時期

          早期的日子里,瀏覽器是一個瘦客戶端,表單驗證和鼠標(biāo)滑過的效果是令人驚艷的,但它們不允許在客戶端大量進(jìn)行交互,用戶被迫與服務(wù)端交互。

          1996~1999間Netscape與微軟的瀏覽器大戰(zhàn)開始,雙方都推出自己的 第4版,為爭奪CSS規(guī)范各不相讓。兩個瀏覽器廠商都讓javascript可以控制這些CSS聲明,于是就可以使用position:absolute 創(chuàng)建一個“層”,然后通過持續(xù)地改變top和left似的它在屏幕上移動,這才叫酷!這些小伎倆被冠以DHTML為人所知,即通過javascript來 改變css屬性。

          為此雙方都推出了自己專有的DOM(又稱過渡DOM,介于Netscap3DOM和W3CDOM之間),Netscape4支持document.layers,而Explorer支持document.all。

           

          第一個胖階段

          有了這些新特性,客戶端增加大量的互動:動畫、隱藏和其他視覺效果,javascript的目標(biāo)轉(zhuǎn)向技術(shù),而不是可用性,js進(jìn)入胖階段。

          微軟在1999年發(fā)布Explorer5,相當(dāng)好地支持了CSS和新的W3CDOM標(biāo)準(zhǔn)。盡管公司和Web開發(fā)者盡力挽救,Netscape4還是滅亡了,差不多同一時間,js的第一個胖階段結(jié)束,人們發(fā)現(xiàn)的不過是少量的javascript和大量的空話。

          CSS變革開始。

           

          第二個瘦階段

          瀏覽器大戰(zhàn)接近尾聲的時候,Web開發(fā)者們厭倦了大量的編程和變通做法,極度地想從頭開始。CSS,而不是javascript,給了他們最好的機(jī)會來完全突破過去的束縛。

          大概從2003年開始,一部分先鋒開始用一種深受CSS革命理念影響的新方式寫javascript,javascript第一次深深地潛入到全面的Web開發(fā)理論中去,而可訪問性問題終于被認(rèn)識到并著手解決。

          無侵入腳本編程提出,但并沒有立即征服世界。

           

          第二個胖階段

          從服務(wù)器端悄悄地載入小塊的數(shù)據(jù),喚醒了沉睡多年的技術(shù)構(gòu)思和可用性觀 念,Jesse James Garrett的文章《Ajax:Web應(yīng)用程序的新方法》開創(chuàng)了Ajax時代,javascript的用途又一次被重新定義,傳統(tǒng)web開發(fā)者創(chuàng)建的是 瘦的可訪問的亂糟糟的js代碼,而來自服務(wù)端開發(fā)的“資深程序員們”創(chuàng)建的是面向?qū)ο蟮模值模稍L問性差的ajax客戶端。焦點又被集中在技術(shù)方面,可 用性及為什么要用ajax仍很少被關(guān)注,臃腫的庫(即框架)與日俱增。

          所幸人們都開始同意并遵循已經(jīng)存在的標(biāo)準(zhǔn)。

           

          2006.5數(shù)據(jù)顯示,目前共有至少134中Ajax框架,我個人認(rèn)為這股熱潮已經(jīng)到達(dá)了頂峰,有誰需要134種程序去做本質(zhì)上是一樣的事呢?

          javascript將調(diào)整回瘦階段,那時它的用途也將再次被重新定義,當(dāng)然某個時期第三個瘦階段結(jié)束后會迎來第三個胖階段.. 從根本上,這種情況只有當(dāng)每個人都只認(rèn)同唯一的javascript用途時才會被打破。

          posted @ 2010-08-21 22:14 Li Ya Qiang 閱讀(205) | 評論 (0)編輯 收藏

          1 echo 和 @
          回顯命令
          @                     #關(guān)閉單行回顯
          echo off              #從下一行開始關(guān)閉回顯
          @echo off             #從本行開始關(guān)閉回顯。一般批處理第一行都是這個
          echo on               #從下一行開始打開回顯
          echo                  #顯示當(dāng)前是 echo off 狀態(tài)還是 echo on 狀態(tài)
          echo.                 #輸出一個”回車換行”,空白行
                                   #(同echo, echo; echo+ echo[ echo] echo/ echo)


          2 errorlevel
          echo %errorlevel%
          每個命令運(yùn)行結(jié)束,可以用這個命令行格式 查看返回碼
          默認(rèn)值為0,一般命令執(zhí)行出錯會設(shè) errorlevel 為1


          3 dir
          顯示文 件夾內(nèi)容
          dir                  #顯示當(dāng)前目錄中的文件和子目錄
          dir /a               #顯示當(dāng)前目錄中的文件和子目錄,包括隱藏文件和系統(tǒng)文件
          dir c: /a:d          #顯示 C 盤當(dāng)前目錄中的目錄
          dir c: /a:-d         #顯示 C 盤根目錄中的文件
          dir c: /b/p         #/b只顯示文件名,/p分頁顯示
          dir *.exe /s         #顯示當(dāng)前目錄和子目錄里所有的.exe文件


          4 cd
          切換目錄
          cd                  #進(jìn)入根目錄
          cd                   #顯示當(dāng)前目錄
          cd /d d:sdk         #可以同時更改盤符和目錄


          5 md
          創(chuàng)建目錄
          md d:abc          #如果 d:a 不存在,將會自動創(chuàng)建中級目錄
          #如果命令擴(kuò)展名被停用,則需要鍵入 mkdir abc。

          6 rd
          刪除目錄
          rd abc               #刪除當(dāng)前目錄里的 abc 子目錄,要求為空目錄
          rd /s/q d:temp      #刪除 d:temp 文件夾及其子文件夾和文件,/q安靜模式


          7 del
          刪除文 件
          del d:test.txt      #刪除指定文件,不能是隱藏、系統(tǒng)、只讀文件
          del /q/a/f d:temp*.*
          刪除 d:temp 文件夾里面的所有文件,包括隱藏、只讀、系統(tǒng)文件,不包括子目錄
          del /q/a/f/s d:temp*.*
          刪除 d:temp 及子文件夾里面的所有文件,包括隱藏、只讀、系統(tǒng)文件,不包括子目錄


          8 ren
          重命名命令
          ren d:temp tmp      #支持對文件夾的重命名

          9 cls
          清屏

          10 type
          顯 示文件內(nèi)容
          type c:boot.ini     #顯示指定文件的內(nèi)容,程序文件一般會顯示亂碼
          type *.txt           #顯示當(dāng)前目錄里所有.txt文件的內(nèi)容


          11 copy
          拷 貝文件
          copy c:test.txt d:test.bak
          復(fù)制 c:test.txt 文件到 d: ,并重命名為 test.bak
          copy con test.txt
          從屏幕上等待輸入,按 Ctrl+Z 結(jié)束輸入,輸入內(nèi)容存為test.txt文件
          con代表屏幕,prn代表打印機(jī),nul代表空設(shè)備
          copy 1.txt + 2.txt 3.txt
          合并 1.txt 和 2.txt 的內(nèi)容,保存為 3.txt 文件
          如果不指定 3.txt ,則保存到 1.txt
          copy test.txt +
          復(fù)制文件到自己,實際上是修改了文件日期


          12 title
          設(shè) 置cmd窗口的標(biāo)題
          title 新標(biāo)題         #可以看到cmd窗口的標(biāo)題欄變了


          13 ver
          顯示系統(tǒng)版本

          14 label 和 vol
          設(shè) 置卷標(biāo)
          vol                  #顯示卷標(biāo)
          label                #顯示卷標(biāo),同時提示輸入新卷標(biāo)
          label c:system       #設(shè)置C盤的卷標(biāo)為 system

          15 pause
          暫停命令

          16 rem 和 ::
          注 釋命令
          注釋行不執(zhí)行操作

          17 date 和 time
          日 期和時間
          date           #顯示當(dāng)前日期,并提示輸入新日期,按"回車"略過輸入
          date/t         #只顯示當(dāng)前日期,不提示輸入新日期
          time           #顯示當(dāng)前時間,并提示輸入新時間,按"回車"略過輸入
          time/t         #只顯示當(dāng)前時間,不提示輸入新時間


          18 goto 和 :
          跳 轉(zhuǎn)命令
          :label         #行首為:表示該行是標(biāo)簽行,標(biāo)簽行不執(zhí)行操作
          goto label     #跳轉(zhuǎn)到指定的標(biāo)簽?zāi)且恍?/span>

          19 find (外部命令)
          查 找命令
          find "abc" c:test.txt
          在 c:test.txt 文件里查找含 abc 字符串的行
          如果找不到,將設(shè) errorlevel 返回碼為1
          find /i “abc” c:test.txt
          查找含 abc 的行,忽略大小寫
          find /c "abc" c:test.txt
          顯示含 abc 的行的行數(shù)


          20 more (外部命令)
          逐 屏顯示
          more c:test.txt     #逐屏顯示 c:test.txt 的文件內(nèi)容


          21 tree
          顯 示目錄結(jié)構(gòu)
          tree d:             #顯示D盤的文件目錄結(jié)構(gòu)


          22 &
          順序執(zhí)行多條命令,而不管命令是否執(zhí)行成功

          23 &&
          順 序執(zhí)行多條命令,當(dāng)碰到執(zhí)行出錯的命令后將不執(zhí)行后面的命令
          find "ok" c:test.txt && echo 成功
          如果找到了"ok"字樣,就顯示"成功",找不到就不顯示


          24 ||
          順 序執(zhí)行多條命令,當(dāng)碰到執(zhí)行正確的命令后將不執(zhí)行后面的命令
          find "ok" c:test.txt || echo 不成功
          如果找不到"ok"字樣,就顯示"不成功",找到了就不顯示

          25 |
          管 道命令
          dir *.* /s/a | find /c ".exe"
          管道命令表示先執(zhí)行 dir 命令,對其輸出的結(jié)果執(zhí)行后面的 find 命令
          該命令行結(jié)果:輸出當(dāng)前文件夾及所有子文件夾里的.exe文件的個數(shù)
          type c:test.txt|more
          這個和 more c:test.txt 的效果是一樣的


          26 > 和 >>
          輸 出重定向命令
          > 清除文件中原有的內(nèi)容后再寫入
          >> 追加內(nèi)容到文件末尾,而不會清除原有的內(nèi)容
          主要將本來顯示在屏幕上的內(nèi)容輸出到指定文件中
          指定文件如果不存在,則自動生成該文件
          type c:test.txt >prn
          屏幕上不顯示文件內(nèi)容,轉(zhuǎn)向輸出到打印機(jī)
          echo hello world>con
          在 屏幕上顯示hello world,實際上所有輸出都是默認(rèn) >con 的
          copy c:test.txt f: >nul
          拷 貝文件,并且不顯示"文件復(fù)制成功"的提示信息,但如果f盤不存在,還是會顯示出錯信息
          copy c:test.txt f: >nul 2>nul
          不顯示”文件復(fù)制成功”的提示信息,并且f盤不存在的話,也不顯示錯誤提示信息
          echo ^^W ^> ^W>c:test.txt
          生成的文件內(nèi)容為 ^W > W
          ^ 和 > 是控制命令,要把它們輸出到文件,必須在前面加個 ^ 符號

          27 <
          從 文件中獲得輸入信息,而不是從屏幕上
          一般用于 date time label 等需要等待輸入的命令
          @echo off
          echo 2005-05-01>temp.txt
          date <temp.txt
          del temp.txt
          這 樣就可以不等待輸入直接修改當(dāng)前日期

          28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
          命 令行傳遞給批處理的參數(shù)
          %0 批處理文件本身
          %1 第一個參數(shù)
          %9 第九個參數(shù)
          %* 從第一個參數(shù)開始的所有參數(shù)

          批參數(shù)(%n)的替代已被增強(qiáng)。您可以使用以下語法:

               %~1          - 刪除引號("),擴(kuò)充 %1
               %~f1         - 將 %1 擴(kuò)充到一個完全合格的路徑名
               %~d1         - 僅將 %1 擴(kuò)充到一個驅(qū)動器號
               %~p1         - 僅將 %1 擴(kuò)充到一個路徑
               %~n1         - 僅將 %1 擴(kuò)充到一個文件名
               %~x1         - 僅將 %1 擴(kuò)充到一個文件擴(kuò)展名
               %~s1         - 擴(kuò)充的路徑指含有短名
               %~a1         - 將 %1 擴(kuò)充到文件屬性
               %~t1         - 將 %1 擴(kuò)充到文件的日期/時間
               %~z1         - 將 %1 擴(kuò)充到文件的大小
               %~$PATH : 1 - 查找列在 PATH 環(huán)境變量的目錄,并將 %1
                             擴(kuò)充到找到的第一個完全合格的名稱。如果環(huán)境
                             變量名未被定義,或者沒有找到文件,此組合鍵會
                             擴(kuò)充到空字符串

          可以組合修定符來取得多重結(jié)果:

              %~dp1        - 只將 %1 擴(kuò)展到驅(qū)動器號和路徑
              %~nx1        - 只將 %1 擴(kuò)展到文件名和擴(kuò)展名
              %~dp$PATH:1 - 在列在 PATH 環(huán)境變量中的目錄里查找 %1,
                             并擴(kuò)展到找到的第一個文件的驅(qū)動器號和路徑。
              %~ftza1      - 將 %1 擴(kuò)展到類似 DIR 的輸出行。
          可以參照 call/? 或 for/? 看出每個參數(shù)的含意
          echo load "%%1" "%%2">c:test.txt
          生成的文 件內(nèi)容為 load "%1" "%2"
          批處理文件里,用這個格式把命令行參數(shù)輸出到文件

          29 if
          判 斷命令
          if "%1"=="/a" echo 第一個參數(shù)是/a
          if /i "%1" equ "/a" echo 第一個參數(shù)是/a
          /i 表示不區(qū)分大小寫,equ 和 == 是一樣的,其它運(yùn)算符參見 if/?
          if exist c:test.bat echo 存在c:test.bat文件
          if not exist c:windows (
               echo 不存在c:windows文件夾
               )
          if exist c:test.bat (
               echo 存在c:test.bat
               ) else (
               echo 不存在c:test.bat
               )

          30 setlocal 和 endlocal
          設(shè)置”命令擴(kuò)展名”和”延緩環(huán)境變量擴(kuò)充”
          SETLOCAL ENABLEEXTENSIONS             #啟用"命令擴(kuò)展名"
          SETLOCAL DISABLEEXTENSIONS            #停用"命令擴(kuò)展名"
          SETLOCAL ENABLEDELAYEDEXPANSION       #啟用"延緩環(huán)境變量擴(kuò)充"
          SETLOCAL DISABLEDELAYEDEXPANSION      #停用"延緩環(huán)境變量擴(kuò)充"
          ENDLOCAL                              #恢復(fù)到使用SETLOCAL語句以前的狀態(tài)
          “命令擴(kuò)展名”默認(rèn)為啟用
          “延 緩環(huán)境變量擴(kuò)充”默認(rèn)為停用
          批處理結(jié)束系統(tǒng)會自動恢復(fù)默認(rèn)值
          可以修改注冊表以禁用"命令擴(kuò)展名",詳見 cmd /? 。所以用到"命令擴(kuò)展名"的程
          序,建議在開頭和結(jié)尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確
          保程序能在其它系統(tǒng)上正確運(yùn)行
          "延緩環(huán)境變量擴(kuò)充"主要用于 if 和 for 的符合語句,在 set 的說明里有其實用例程

          31 set
          設(shè)置變量
          引用變量可在變量 名前后加 % ,即 %變量名%
          set                     #顯示目前所有可用的變量,包括系統(tǒng)變量和自定義的變量
          echo %SystemDrive%      #顯示系統(tǒng)盤盤符。系統(tǒng)變量可以直接引用
          set p                   #顯示所有以p開頭的變量,要是一個也沒有就設(shè)errorlevel=1
          set p=aa1bb1aa2bb2      #設(shè)置變量p,并賦值為 = 后面的字符串,即aa1bb1aa2bb2
          echo %p%                #顯示變量p代表的字符串,即aa1bb1aa2bb2
          echo %p:~6%             #顯示變量p中第6個字符以后的所有字符,即aa2bb2
          echo %p:~6,3%           #顯示第6個字符以后的3個字符,即aa2
          echo %p:~0,3%           #顯示前3個字符,即aa1
          echo %p:~-2%            #顯示最后面的2個字符,即b2
          echo %p:~0,-2%          #顯示除了最后2個字符以外的其它字符,即aa1bb1aa2b
          echo %p:aa=c%           #用c替換變量p中所有的aa,即顯示c1bb1c2bb2
          echo %p:aa=%            #將變量p中的所有aa字符串置換為空,即顯示1bb12bb2
          echo %p:*bb=c%          #第一個bb及其之前的所有字符被替換為c,即顯示c1aa2bb2
          set p=%p:*bb=c%         #設(shè)置變量p,賦值為 %p:*bb=c% ,即c1aa2bb2
          set /a p=39             #設(shè)置p為數(shù)值型變量,值為39
          set /a p=39/10          #支持運(yùn)算符,有小數(shù)時用去尾法,39/10=3.9,去尾得3,p=3
          set /a p=p/10           #用 /a 參數(shù)時,在 = 后面的變量可以不加%直接引用
          set /a p=”1&0″          #”與”運(yùn)算,要加引號。其它支持的運(yùn)算符參見set/?
          set p=                  #取消p變量
          set /p p=請輸入
          屏幕上顯示”請輸入”,并會將輸入的字符串賦值給變量p
          注意這條可以用來取代 choice 命令
          注意變量在 if 和 for 的復(fù)合語句里是一次性全部替換的,如
          @echo off
          set p=aaa
          if %p%==aaa (
               echo %p%
               set p=bbb
               echo %p%
               )
          結(jié)果將顯示
          aaa
          aaa
          因 為在讀取 if 語句時已經(jīng)將所有 %p% 替換為aaa
          這里的"替換",在 /? 幫助里就是指"擴(kuò)充"、"環(huán)境變量擴(kuò)充"
          可以啟用” 延緩環(huán)境變量擴(kuò)充”,用 ! 來引用變量,即 !變量名!
          @echo off
          SETLOCAL ENABLEDELAYEDEXPANSION
          set p=aaa
          if %p%==aaa (
               echo %p%
               set p=bbb
               echo !p!
               )
          ENDLOCAL
          結(jié)果將顯示
          aaa
          bbb
          還 有幾個動態(tài)變量,運(yùn)行 set 看不到
          %CD%                   #代表當(dāng)前目錄的字符串
          %DATE%                 #當(dāng)前日期
          %TIME%                 #當(dāng)前時間
          %RANDOM%               #隨機(jī)整數(shù),介于0~32767
          %ERRORLEVEL%           #當(dāng)前 ERRORLEVEL 值
          %CMDEXTVERSION%        #當(dāng)前命令處理器擴(kuò)展名版本號
          %CMDCMDLINE%           #調(diào)用命令處理器的原始命令行
          可以用 echo命令查看每個變量值,如 echo %time%
          注意 %time% 精確到毫秒,在批處理需要延時處理時可以用到

          32 start
          批 處理中調(diào)用外部程序的命令,否則等外部程序完成后才繼續(xù)執(zhí)行剩下的指令

          33 call
          批處理中調(diào)用另外一個批處理的命令,否則剩下的批處理指令將不會被執(zhí) 行
          有時有的應(yīng)用程序用start調(diào)用出錯的,也可以call調(diào)用

          34 choice (外部命令)
          選 擇命令
          讓用戶輸入一個字符,從而選擇運(yùn)行不同的命令,返回碼errorlevel為1234……
          win98 里是choice.com
          win2000pro里沒有,可以從win98里拷過來
          win2003里是choice.exe
          choice /N /C y /T 5 /D y>nul
          延時5秒


          35 assoc 和 ftype
          文件關(guān) 聯(lián)
          assoc 設(shè)置'文件擴(kuò)展名'關(guān)聯(lián),關(guān)聯(lián)到'文件類型'
          ftype 設(shè)置'文件類型'關(guān)聯(lián),關(guān)聯(lián)到'執(zhí)行程序和參數(shù)'
          當(dāng) 你雙擊一個.txt文件時,windows并不是根據(jù).txt直接判斷用 notepad.exe 打開
          而是先判斷.txt屬于 txtfile '文件類型'
          再調(diào)用 txtfile 關(guān)聯(lián)的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
          可 以在"文件夾選項"→"文件類型"里修改這2種關(guān)聯(lián)
          assoc            #顯示所有'文件擴(kuò)展名'關(guān)聯(lián)
          assoc .txt       #顯示.txt代表的'文件類型',結(jié)果顯示 .txt=txtfile
          assoc .doc       #顯示.doc代表的'文件類型',結(jié)果顯示 .doc=Word.Document.8
          assoc .exe       #顯示.exe代表的'文件類型',結(jié)果顯示 .exe=exefile
          ftype            #顯示所有'文件類型'關(guān)聯(lián)
          ftype exefile    #顯示exefile類型關(guān)聯(lián)的命令行,結(jié)果顯示 exefile="%1" %*
          assoc .txt=Word.Document.8
          設(shè)置.txt為word類型的文檔,可以看到.txt文件的圖標(biāo)都變了
          assoc .txt=txtfile
          恢復(fù).txt的正確關(guān)聯(lián)
          ftype exefile="%1" %*
          恢復(fù) exefile 的正確關(guān)聯(lián)
          如 果該關(guān)聯(lián)已經(jīng)被破壞,可以運(yùn)行 command.com ,再輸入這條命令

          36 pushd 和 popd
          切 換當(dāng)前目錄
          @echo off
          c: & cd & md mp3        #在 C: 建立 mp3 文件夾
          md d:mp4                #在 D: 建立 mp4 文件夾
          cd /d d:mp4             #更改當(dāng)前目錄為 d:mp4
          pushd c:mp3             #保存當(dāng)前目錄,并切換當(dāng)前目錄為 c:mp3
          popd                     #恢復(fù)當(dāng)前目錄為剛才保存的 d:mp4

          37 for
          循 環(huán)命令
          這個比較復(fù)雜,請對照 for/? 來看
          for %%i in (c: d: e: f:) do echo %%i
          依次調(diào)用小括號里的每個字符串,執(zhí)行 do 后面的命令
          注意%%i,在批處理中 for 語句調(diào)用參數(shù)用2個%
          默 認(rèn)的字符串分隔符是"空格鍵","Tab鍵","回車鍵"
          for %%i in (*.txt) do find "abc" %%i
          對 當(dāng)前目錄里所有的txt文件執(zhí)行 find 命令
          for /r . %%i in (*.txt) do find "abc" %%i
          在 當(dāng)前目錄和子目錄里所有的.txt文件中搜索包含 abc 字符串的行
          for /r . %%i in (.) do echo %%~pni
          顯 示當(dāng)前目錄名和所有子目錄名,包括路徑,不包括盤符
          for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
          把 d:mp3 及其子目錄里的mp3文件的文件名都存到 d:mp3.txt 里去
          for /l %%i in (2,1,8) do echo %%i
          生成2345678的一串?dāng)?shù)字,2是數(shù)字序列的開頭,8是結(jié)尾,1表示每次加1
          for /f %%i in ('set') do echo %%i
          對 set 命令的輸出結(jié)果循環(huán)調(diào)用,每行一個
          for /f "eol=P" %%i in ('set') do echo %%i
          取 set 命令的輸出結(jié)果,忽略以 P 開頭的那幾行
          for /f %%i in (d:mp3.txt) do echo %%i
          顯示 d:mp3.txt 里的每個文件名,每行一個,不支持帶空格的名稱
          for /f "delims=" %%i in (d:mp3.txt) do echo %%i
          顯示 d:mp3.txt 里的每個文件名,每行一個,支持帶空格的名稱
          for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
          對 dir 命令的結(jié)果,跳過前面5行,余下的每行取第4列
          每列之間的分隔符為默認(rèn)的"空格"
          可以注意到 dir 命令輸出的前5行是沒有文件名的
          for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
               echo %%a
               echo %%b
               echo %%c
               )
          對 date /t 的輸出結(jié)果,每行取1、2、3列
          第一列對應(yīng)指定的 %%a ,后面的 %%b 和 %%c 是派生出來的,對應(yīng)其它列
          分 隔符指定為 - 和"空格",注意 delims=- 后面有個"空格"
          其中 tokens=1,2,3 若用 tokens=1-3 替換,效果是一樣的
          for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
          取 第2列給 %%a ,其后的列都給 %%b


          38 subst (外部命令)
          映射磁盤。
          subst z: serverd      #這樣輸入z:就可以訪問serverd了
          subst z: /d              #取消該映射
          subst                    #顯示目前所有的映時

          39   xcopy (外部命令)
          文 件拷貝
          xcopy d:mp3 e:mp3 /s/e/i/y
          復(fù)制 d:mp3 文件夾、所有子文件夾和文件到 e: ,覆蓋已有文件
          加 /i 表示如果 e: 沒有 mp3 文件夾就自動新建一個,否則會有詢問

          posted @ 2010-06-22 11:20 Li Ya Qiang 閱讀(739) | 評論 (0)編輯 收藏

          來自http://www.aygfsteel.com/fingki/archive/2010/03/02/314268.html

          在使用Iterator處理Collection時,注意java.util.ConcurrentModificationException。
          1.如果你僅僅是對collection進(jìn)行遍歷查詢,那么不必?fù)?dān)心什么。
          2.但如果你在遍歷過程中要對collection進(jìn)行刪除,那么你就要注意了。
          For example:
          private void testDel() {  
          1.     List<String> list = new ArrayList<String>();  
          2.     for (int i = 0; i < 10; i++) {  
          3.         String str = "td" + i;  
          4.         list.add(str);  
          5.     }  
          6.   
          7.     for (Iterator it = list.iterator(); it.hasNext();) {  
          8.         String str = (String) it.next();  
          9.         if (str.equals("td5")) {  
          10.             // list.remove(str);  // 刪除方法一 
          11.             it.remove();  // 刪除方法二 
          12.         }  
          13.     }  

          上面的代碼運(yùn)行沒有問題,但如果你用“方法一”替代“方法二”,則會出現(xiàn) java.util.ConcurrentModificationException。
          (用for-each遍歷也會出個類似問題)
          具體原因是可以看一下先看看List中的remove方法源碼:
          1. public boolean remove(Object o) {  
          2.     if (o == null) {  
          3.         for (int index = 0; index < size; index++)  
          4.             if (elementData[index] == null) {  
          5.                 fastRemove(index);  
          6.                 return true;  
          7.             }  
          8.     } else {  
          9.         for (int index = 0; index < size; index++)  
          10.             if (o.equals(elementData[index])) {  
          11.                 fastRemove(index);  
          12.                 return true;  
          13.             }  
          14.     }  
          15.     return false;  
          16. }  
          17.   
          18. private void fastRemove(int index) {  
          19.     modCount++; // 特別注意這里,這里只增加了modCount的值  
          20.     int numMoved = size - index - 1;  
          21.     if (numMoved > 0)  
          22.         System.arraycopy(elementData, index + 1, elementData, index,  
          23.                 numMoved);  
          24.     elementData[--size] = null; // Let gc do its work  

          接著看。刪除后得到下一個元素的代碼,it.next():  it為AbstractList的內(nèi)部類Iterator的一個實例。
          1. public E next() {  
          2.     checkForComodification();  
          3.     try {  
          4.         E next = get(cursor);  
          5.         lastRet = cursor++;  
          6.         return next;  
          7.     } catch (IndexOutOfBoundsException e) {  
          8.         checkForComodification();  
          9.         throw new NoSuchElementException();  
          10.     }  
          11. }  
          12.   
          13. final void checkForComodification() {  //注意這個方法
          14.     if (modCount != expectedModCount)  //檢查這兩個值是否相同
          15.         throw new ConcurrentModificationException();  

          最后看Iterator的remove()方法的源代碼:
          1. public void remove() {  
          2.     if (lastRet == -1)  
          3.         throw new IllegalStateException();  
          4.     checkForComodification();  
          5.     try {  
          6.         AbstractList.this.remove(lastRet);  
          7.         if (lastRet < cursor)  
          8.             cursor--;  
          9.         lastRet = -1;  
          10.         expectedModCount = modCount; // 設(shè)置expectedModCount  
          11.     } catch (IndexOutOfBoundsException e) {  
          12.         throw new ConcurrentModificationException();  
          13.     }  
          14. }  
          15.   
          16. final void checkForComodification() {  
          17.     if (modCount != expectedModCount)  
          18.         throw new ConcurrentModificationException();  

          這下就明白了,list的remove方法只修改了modCount值,而iterator的remove能同步modCount和 expectedModCount.

          posted @ 2010-03-02 16:50 Li Ya Qiang 閱讀(210) | 評論 (0)編輯 收藏


          posts - 10, comments - 0, trackbacks - 0, articles - 2

          Copyright © Li Ya Qiang

          主站蜘蛛池模板: 隆尧县| 定日县| 凤山市| 于都县| 登封市| 和硕县| 武隆县| 青海省| 岑巩县| 沈阳市| 河津市| 芦溪县| 寿光市| 宁化县| 嫩江县| 博野县| 酉阳| 庆城县| 中方县| 绥滨县| 吴旗县| 宜阳县| 满城县| 临湘市| 页游| 海南省| 徐水县| 罗山县| 宝鸡市| 临汾市| 微山县| 子长县| 明星| 正镶白旗| 四川省| 资阳市| 舟曲县| 会理县| 宣威市| 德江县| 定结县|