今天下午專案經理老蔡同志分配給我一個光榮任務,做一個批次檔把某個檔案夾下的.exe檔案和所有子目錄下的.exe檔案複製到另外一個檔案夾,並且不複製檔案夾結構,也就是所有都放到目標目錄下不分級。
上網找了會資料沒找著,後來在命令提示字元下隨便輸入幾個自己知道的命令看看協助,發現XCopy很容易就可以實現複製指定目錄下檔案與所有子目錄下檔案到目標目錄中,於是簡單寫了一段:
xcopy F:\A\*.exe F:\B\ /S
運行了下,好像可以哦~~於是就跟老蔡說OK啦!結果自己再測試下發現xcopy會把子目錄結構也複製過去。。。。暈,那還不如自己複製粘貼呢。於是在命令列提示符視窗下又看了會xcopy的參數說明,就是找不到不複製目錄結構的。。。
怎麼辦。。。還不如我寫個C#程式來得快呢。。。可是要用這個程式的同事機器上好像沒有.NET運行時啊,.NET運行時有時候就是很氣人,關鍵時候經常發現對方沒有裝.NET運行環境,比如有時候要跟人家吹牛我做了什麼好玩的,運行不了興緻都沒了。
用C寫吧,開啟VS,建了個命令列項目,然後。。。。怎麼寫?忘記啦。。。寫C語言已經是快3年前的事情了,擷取目錄和子目錄我都不記得用什麼函數了。上網找了會,各式各樣都有,唉,真煩~~不用C寫了。
想起昨天晚上翻舊電子書時看到《Windows指令碼技術》裡有講到用JScript操作檔案呢,於是趕快找出這本書。模仿裡面的代碼寫了一段
var fso, f1;
fso = new ActiveXObject("Scripting.FileSystemObject");
f1 = fso.GetFile("c:\\test.txt");
儲存為.js檔案, 雙擊,怎麼又是用編輯器開了。。。右擊,裡面有個“在命令列中運行”,這個應該不是預設的吧,不管了,運行看看。結果啥也沒有出現。。。
趕緊再看看書上怎麼說,原來下一章才開始講Windows指令碼舍主,嘿嘿,還有一節叫:運行指令碼,看來我太心急了,再繼續看看。
原來可以做一個.wsf檔案運行啊,而且還可以混合不同語言的指令碼。。神奇啊。
裡面有這樣一段範例程式碼:
<job id="IncludeExample">
<script language="JScript" src="FSO.JS"/>
<script language="VBScript">
' 獲得磁碟機 C 的可用空間。
s = GetFreeSpace("c:")
WScript.Echo s
<sScript>
</job>
於是我舉一反三,自己做了一個,嘿嘿,經過一番調試,終於做了一個可以複製目錄和子目錄下所有.exe檔案到指定目錄的wsf檔案,哈哈。
<job id="IncludeExample">
<script language="JScript" >
var file = "*.exe"; //要複製的檔案
var des = "F:\\B"; //目標目錄
var fso, f, fs, fc;
fso = new ActiveXObject("Scripting.FileSystemObject"); //檔案系統控制項
try
{
fso.CopyFile(file, des);
}
catch(ex)
{
}
f = fso.GetFolder(".\\");
fc = new Enumerator(f.SubFolders);
for ( ; !fc.atEnd(); fc.moveNext())
{
try
{
fso.CopyFile(fc.item().Path + "\\" + file, des);
}
catch(ex)
{
}
}
</script>
</job>
複製一段《Windows指令碼技術》中對WSF檔案的定義:
Windows 指令檔 (*.wsf) 是含有可延伸標記語言 (XML) (XML) 代碼的文字文件。它綜合了幾個可增強指令碼靈活性的功能。由於 Windows 指令檔不是特定於引擎的,因此它們可包含與 Windows 指令碼相容的任何指令碼引擎中的指令碼。它們充當容器。
使用 .wsf 檔案,可以在建立指令碼時使用以下功能:
| .wsf 檔案支援 |
實現 |
| Include 語句 |
將函數從 VBScript 或 JScript 檔案合并到 Windows 指令碼宿主專案中。 |
| 多引擎 |
每個檔案使用多種指令碼語言。 |
| 類型庫 |
將常數添加到代碼中。 |
| 工具 |
使用任何 XML 編輯器編輯檔案。 |
| 一個檔案中的多項作業 |
將所有的代碼儲存在一個位置。 |