Feeds:
文章
留言

Archive for the ‘Windows Script’ Category

#2012/05/18#

 

幫同事寫雙認證的sftp的批次檔,在Put的批次檔是順利的,但在Get的批次檔則遇到麻煩。

首先是psftp沒有像ftp的mls的指令,所以SFTP上的抓檔清單要自行想辦法產生。

其二是psftp在批次檔使用Get抓檔時,要指定一個檔名給它儲存。

本來用底下的語法產生psftp抓檔指令:

echo cd %sftpdir% >> %ftpcmd2%

for /f "tokens=1" %%a in (%list2%) do echo get "%%a" >> %ftpcmd2% && echo mv "%%a" "./bak/%%a-%strdt%" >> %ftpcmd2%

產生的%ftpcmd2%檔案內容如下:

cd /DPK
get "DPK-20120415.txt"
mv "DPK-20120415.txt" "./bak/DPK-20120415.txt-20120518-171154"
get "DPK-20120416.txt"
mv "DPK-20120416.txt" "./bak/DPK-20120416.txt-20120518-171154"
quit

執行psftp指令列

psftp.exe %sftpuser%@%sftpip% -pw %sftppass% -i %sftpkey% -bc -b "%ftpcmd2%" >> "%log%"

查看%log%檔案,出現錯誤訊息:

local: unable to open

用手動登入執行%ftpcmd2%檔案內容的指令,能正常抓檔及移檔。

心想會不會是psftp的版本bug問題,於是換不同的版本,但狀況如前。

心想這一定是bug了。

後來在官方網站再次查看psftp的使用方法時,看到這種psftp的語法:

psftp> get "spacey file name.txt" "save it under this name.txt"
Link:http://ftp.gnome.org/pub/putty/putty-0.57/htmldoc/Chapter6.html

心想,會不會加個儲存檔名給它就可以了呢?於是把語法改成如下:

for /f "tokens=1" %%a in (%list2%) do echo get "%%a" "%%a" >> %ftpcmd2% && echo mv "%%a" "./bak/%%a-%strdt%" >> %ftpcmd2%

產生的%ftpcmd2%檔案內容如下:

cd /DPK

get "DPK-20120415.txt" "DPK-20120415.txt"

mv "DPK-20120415.txt" "./bak/DPK-20120415.txt-20120518-171154"

get "DPK-20120416.txt" "DPK-20120416.txt"

mv "DPK-20120416.txt" "./bak/DPK-20120416.txt-20120518-171154"

quit

這樣就閃過bug了,山不轉,路轉啊!

 

同樣的put也是一樣,有時會遇到open for write: failure,解決辦法如同get。

 

Read Full Post »

#2011/08/07#

今天有同事反應說找資料夾會有Error,於是我去看資料夾裡的檔案在前幾天就應該搬走了,但卻沒搬走,手動執行批次檔後出現如下錯誤:

不正確的數字。數字常數必須是十進位(17),
十六進位(0x11)或八進位(021)。

查看set的說明,發現字串中前面若有0的話,會被看成是八進位,因八進位最多只到07,所以用08就會出錯。於是加了二行來處理這種情況。

set year=%date:~4,4%
set month=%date:~9,2%

if %month% == 08 set month=8
if %month% == 09 set month=9

set /a zero=%month%-1
if %zero% EQU 0 ( goto 1 ) else ( goto 2 )

01~07則不用設定,雖然被視為八進位值,但剛好是要的十進位值。

#2011/03/21#

現在很少寫指令碼來批次工作,今日有個需求要搬一堆檔案,在Unix script是很方便的,但在Windows因指令不常用的關係,所以就不太能立即寫出來使用。

以下是臨時寫來用的,有空再來想想如何寫才能丟給排程做。

c:
cd C:\Trans\Aaa
dir /t:c | find "2011/02" > move.txt
for /f "tokens=4" %%a in (move.txt) do move /y %%a bak
del /q move.txt

————————–

下午找了個空重寫如下(Server: Windows 2000 advance):

set year=%date:~4,4%
set month=%date:~9,2%

set /a zero=%month%-1
if %zero% EQU 0 ( goto 1 ) else ( goto 2 )

:1
set /a mvyear=%year%-1
set mvmonth=12
goto end

:2
set mvyear=%year%
set /a mvmonth=%month%-1

:end
if %mvmonth% LSS 9 set mvmonth=0%mvmonth%
set str=%mvyear%/%mvmonth%
c:
cd C:\Trans\Aaa
dir /t:c | find "%str%" > move.txt
for /f "tokens=4" %%a in (move.txt) do move /y %%a bak
del /q move.txt

Read Full Post »

VBE解碼

太久沒用了,今日用Google搜尋,於是順便記上部落格。

微軟發佈的編碼器:

Microsoft Script Encoder

解碼程式:(C,有原始碼)

Windows Script Decoder

Breaking The Windows Script Encoder

使用VBS解碼:

Paul’s Blog Spot: Decoding VBE and Re-Coding VBS Files

參考:

VBS加密& VBE解密| Demon’s Blog
 

Read Full Post »

#2011/1/4#

最近我有一個需求是某個資料夾底下有一些資料檔,例如:

20110103.xps
20110104.xps
20110105.xps
20110106.xps
20110107.xps
….

現在我需要在裡面產生相同名稱的word範本檔,例如:

20110103.docx
20110104.docx
20110105.docx
20110106.docx
20110107.docx
….

於是利用一支windows script來達到這種需求,如下:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set colFileList = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name=’G:\201101′} Where ResultClass = CIM_DataFile")

For Each objFile In colFileList
    objFSO.CopyFile "G:\範本\空白範本.docx" , objFile.Path & "\" &objFile.FileName & ".docx"
Next

—————————————————

#2011/03/28#

修改成自動抓磁碟機、自動抓月份、自動建月份資料夾。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objFSO = CreateObject("Scripting.FileSystemObject")

‘取得windows script執行的路徑目錄
vbsPath = objFSO.GetFolder(".")

‘計算日期
today = Date()
iY = Year(today)
iM = Month(today) + 1
‘月份若是12月則處理年月要往前算
if iM = 12 then
    iY = Year(today) + 1
    iM = 1
end if
‘補零
if iM < 10 then iM = "0" & iM

‘若目錄不存在則建立
folder = vbsPath & "\" & iY & iM
if not objFSO.FolderExists(folder) then
    objFSO.CreateFolder(folder)
end if

‘列出folder目錄下的檔案清單
Set colFileList = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name=" & "’" & folder & "’" & "} Where ResultClass = CIM_DataFile")

‘迴圈處理
For Each objFile In colFileList
    srcDoc = vbsPath & "\空白範本.docx"
    tarDoc = objFile.Path & "\" & objFile.FileName & ".docx"
    if not objFSO.FileExists(tarDoc) then objFSO.CopyFile srcDoc, tarDoc
Next

Read Full Post »

#2010/10/28#

1.

說是隱藏,其實是沒有顯示前景視窗而已,應稱為背景執行,在工作管理員裡可以看到process。使用Windows Script達此目的:

Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c c:\bat_delTemp.bat",vbhide

2.

如果有輸出結果,則可用縮小至工作列的方式,這與上面的方式都要寫另外一支的批次檔來呼叫執行。

cmd /c start /min c:\bat_delTemp.bat

Read Full Post »

第一種做法:
參考:CODE-使用Outlook VBA列出所有人員信箱

當然也不一定要把巨集寫在Outlook裡,用Excel的巨集也行,用指令碼檔(.vbs)也是可以,不過要改成符合指令碼的執行格式。

第二種做法:
在Outlook中打開通訊錄,在全域通訊清單中全選所有人員加入連絡人,然後再由連絡人匯出到檔案。

補記:
顯示指定連絡人的資訊盒
Set oAddressEntry = oAddressEntries.Item(5000)
oAddressEntry.Details

#2010/8/16#

Read Full Post »

Export All User’s Properties to Excel Spreadsheet

只要改Excel檔案儲存位置,程式碼一行都不用改。

限制:只能用在用戶所屬的網域。

#2010/8/16#

Read Full Post »

#2009/12/28#

Set objWord = CreateObject("Word.Application")
objWord.Visible = False
Set objDoc = objWord.Documents.Open("C:Documentsreport.doc")
objDoc.PrintOut()
objDoc.Close
Set objDoc = Nothing
objWord.Quit
Set objWord = Nothing

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:Documentsreport.xls")
‘Set objWorksheet = objWorkbook.Worksheets(1)
objWorkbook.PrintOut()
objExcel.Quit

使用問題:
Word會開始檔案,而且會詢問Normal.dot是否要覆蓋,要按「否」,否則下次開啟word會看到沒有預設工具的word。

#2010/1/9#

由於上方的script會有winword.exe留在系統中,必須從工作管理員才能刪除,所以只好強制關閉。
‘強制關閉word檔案
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.rootcimv2")
Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = ‘winword.exe’")
For Each objProcess in colProcess
  objProcess.Terminate()
Next

Read Full Post »

如果要安裝V2(CTP3)版本,先要移除1.0的版本,否則開啟會出現諸多類似下列的錯誤訊息:

Microsoft.PowerShell.Core,在 C:WINDOWSsystem32WindowsPowerShellv1.0Help.format.ps1xml 檔案中的 XPath /Configuratio n/ViewDefinitions/View[4]/CustomControl/CustomEntries/CustomEntry[1]/CustomItem/Frame[5] 有錯誤: 遺失節點 CustomItem。

若已出現這樣情形,先移除V2(CTP3),再執行C:Windows$NtUninstallKB926139$spuninstspuninst.exe這個檔案移除1.0版的PowerShell,之後再裝回V2(CTP3)即可。

順便紀錄一些連結:
Download Windows PowerShell
Hey, Scripting Guy! Blog
PowerShell Code Repository
PowerShell Pack
PowerShell@HungYuWu
Windows PowerShell What Not to Script
Don Jones: TechNet Magazine Articles

#2009/12/25#

Read Full Post »

#2009/04/25#

‘Filename: emptyFolder.vbs
‘Description: 每隔60秒清空指定資料夾中的檔案。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")
emptyFolder = "C:DownloadsTEMP"
Do While True
Set colFileList1 = objWMIService.ExecQuery _
            ("ASSOCIATORS OF {Win32_Directory.Name=’" & emptyFolder & "’} Where " _
                & "ResultClass = CIM_DataFile")
        If colFileList1.Count <> 0 Then
            For Each objFile In colFileList1
                objFile.Delete
            Next
        End If
        Set  colFileList1 = nothing
        Wscript.Sleep 60000
Loop

*這個Script不會刪之下的目錄,只會刪除檔案。
*執行之後會常駐在系統裡,要停止執行請用工作管理員刪除wscript.exe的行程。
範例下載

Read Full Post »

Older Posts »