顯示具有 Script 標籤的文章。 顯示所有文章
顯示具有 Script 標籤的文章。 顯示所有文章

Windows 作業系統的【啟動】目錄位置

這次,讓我們來了解一個話題:Windows 作業系統的【啟動】目錄位置

image

從上圖的圖形資料可以看到,Windows 作業系統的的【啟動】目錄,可以分成兩種:

  1. 所有使用者 (All Users)
  2. 現有使用者 (Current User)

因為使用者不同,所以相對【啟動】目錄的存取路徑,也就會不一樣!!


有的基本認識後,再來談談要如何切換到【啟動】目錄區的位置中?

要進入、切換【啟動】目錄,需要執行【執行 Run】程式;
方法:Window 功能鍵 + R 
參考:Win10 的23個功能按鍵與電腦“行動熱點”的設定

並且,下指令:

  1. 所有使用者 (All Users)         ──  shell:common startup
  2. 現有使用者 (Current User)   ──  shell:startup

接下來,談論的內容和程式自動化、批次處理有關,看不懂的話,也不用太在意!!


因為要 程式自動化、批次處理,所以就不可能“手動”切換到相對的目錄區裡。
因此,就一定要知道【啟動】目錄的“路徑”所在。

  1. 所有使用者 (All Users)         ──  %programdata%\Microsoft\Windows\Start Menu\Programs\Startup
  2. 現有使用者 (Current User)   ──  %appdata%\Microsoft\Windows\Start Menu\Programs\Startup

是『迦勒』,不是『狗』!卻是同【字根】

這又是一個 為什麼 要學習希伯來文原文的範例!

迦勒(希伯來語 כָּלֵב‎ 英文Caleb)是希伯來聖經中的一位重要人物,以其在希伯來人拒絕進入「應許之地」迦南時,對耶和華的信心著稱。

摩西帶領希伯來人逃避埃及的奴役,來到上帝應許給他們的迦南地的邊界。摩西派遣12名偵探(希伯來語meraglim)進入迦南,回來報告那裡的情況,每個偵探 代表12個支派中的一個。其中10名偵探回來報告說不可能得到那塊土地,住在那裡的巨人將會碾碎希伯來人的軍隊。只有2人——約書亞(以法蓮支派)和耶孚尼的兒子—迦勒(代表猶大支派,一作基尼洗人[1])返回說,耶和華將要把迦南交在希伯來人的手中。

聖經記載道,由於那10名偵探的陳述,希伯來人選擇不要進入迦南;由於違背耶和華的意志,使他們在曠野中漂流40年之久。成年希伯來人中,唯有約書亞和迦勒得以活到40年後,進入迦南。

許多書籍和網站將迦勒名字的希伯來文拼寫與「狗」(כֶּ֫לֶב‎,kéleḇ)混淆,其實迦勒名字的希伯來文是 Caleb,而不是 Celeb。

image

網路資源:

Excel VBA 處理圖片(Picture)的基本知識

本文的緣由,是期望在Excel VBA 的環境裡,處理製作出好看的【單字卡】,希望字卡中有文字、圖片等元素。
例如:
Toronto

在此介紹一些處理文字、圖片(Picture)的基本知識:

上圖中所有的文字、圖片名稱或是網路URL位置都是記錄在同一檔案的另一個工作表裡,它被條列成清單形式,如此資料也可以容易被維護。

  1. 要將【工作表A】中【儲存格A】的文字資料,寫到存放單字卡的【工作表Form】裡面。
    srcRow = ActiveCell().Row
    srcCol = ActiveCell().Column
  2. Sheets("Form").Cells(2, "C") = Cells(srcRow, "C")
    Sheets("Form").Cells(3, "C") = Cells(srcRow, "G")

圖片資料的處理,有些觀念要知道!

  1. 已經存在的圖片,無法直接以”更改“圖片名稱或是網路URL位置方式,來變幻圖片。
    需要改以刪除舊圖片,再新加圖片來處理。
  2. 得知工作表中圖片數量
    ActiveSheet.Shapes.Count
    --> 2            表示該工作表中,有兩張”圖片“。
  3. 得知工作表中”特定“圖片的名稱
    ActiveSheet.Shapes(1).Name
    --> Picture 1               在中文環境中,你可能會看到的名稱是【圖片1】
    ActiveSheet.Shapes(2).Name
    --> Picture 2               在中文環境中,你可能會看到的名稱是【圖片2】
  4. 要更改圖片名稱
    ActiveSheet.Shapes(1).Name = ”BackGroup”
  5. 刪除特定圖片
    ActiveSheet.Shapes(2).Delete
  6. 要刪除工作表中的所有圖片!
    ActiveSheet.Shapes.SelectAll
    Selection.Delete
  7. 新增圖片
    Sheets("Form").Select
    ActiveSheet.Pictures.Insert(strPicName).Select

    變數 strPicName 是圖片的檔案路徑或是該圖片存放在網路中的URL位置。
    例如:
    D:\Hebrew_Learning\Hebrew@TW\imags\Quran.jpg
    https://d1pra95f92lrn3.cloudfront.net/media/thumb/9722_fit160.jpg
  8. 控制圖片的尺寸大小
    ActiveSheet.Pictures.Insert(strPicName).Select

    sImageCell = "B3"
    With Selection.ShapeRange
             .Top = Range(sImageCell).Top + 2
             .Left = Range(sImageCell).Left + 4
             .Height = 100   ' Range(sImageCell).Height - 40
             .Width = 100    ' Range(sImageCell).Width - 40
    End With

Download a File from an FTP–Use PowerShell

使用過 FTP 的人,一定知道在 FTP 環境中,需要有 帳號/密碼 的確認過程,才能處理檔案。
當這個處理過程要改用 PowerShell 來控制時,該如何下指令?
假設,有一 FTP ,IP = 10.1.2.71
該網站上有一個檔案,檔名:RFQC100485.zip
希望下載這個檔案,改存放成 D:\Test\PowerShell\backup.zip
依據上述情況,處理方法可以有兩種:

# 方法 1
$source = "ftp://10.1.2.71/RFQC100485.zip"
$destination = "D:\Test\PowerShell\backup.zip"
# 需要在輸入 密碼 訊息!
Invoke-WebRequest $source -OutFile $destination -Credential myFtp


















# 方法 2
$source = "ftp://10.1.2.71/RFQC100485.zip"
$destination = "D:\Test\PowerShell\backup.zip"
$username = "myFtp"
$password = "myPassword" | ConvertTo-SecureString -asPlainText –Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)Invoke-WebRequest $source -OutFile $destination -Credential $cred

在 PowerShell 中,探討 Excel 的架構

藉由 http://www.lazywinadmin.com/2014/03/powershell-read-excel-file-using-com.html 網路資源一文,來探究 Excel 架構該如何在 PowerShell 中表現出來!

首先來看個 Excel 範例:VIDEOSERVER01-BuildSpecs.xlsx

接下來的問題,就是該如何使用 PowerShell 來讀取該檔案的內容?及如何隨心所欲的控制 Excel 的數據!

  • 使用 COM 來建置 Excel.Application 的物件
    $objExcel = New-Object -ComObject Excel.Application
  • 顯示 Excel.Application 的物件
    $objExcel.Visible = $true
  • 使用 quit() 來移除 Excel.Application 的物件
    $objExcel.quit()
  • 使用 Open() 來開啟 Excel 檔案
    $FilePath = "D:\Test\PowerShell\VIDEOSERVER01-BuildSpecs.xlsx"
    $WorkBook = $objExcel.Workbooks.Open( $FilePath )
  • 得知 WordBook 中,含有幾個 WorkSheet
    $WorkBook.sheets
  • 存取特定的 Sheet
    $SheetName = "BuildSpecs"
    $WorkSheet = $WorkBook.sheets.item( $SheetName )
  • 其他相關指令
    $objExcel.WorkBooks | Select-Object -Property name, path, author
    $objExcel.WorkBooks
    $objExcel.WorkBooks | Get-Member
    $WorkBook
    $WorkBook | Get-Member -Name *sheet*
    $WorkBook.sheets | Select-Object -Property Name


對於儲存格的存取,可以有很多種方式,擇一使用即可:

$worksheet.Range("C3").Text
$worksheet.Range("C3:C3").Text
$worksheet.Range("C3","C3").Text
$worksheet.cells.Item(3, 3).text
$worksheet.cells.Item(3, 3).value2
$worksheet.Columns.Item(3).Rows.Item(3).Text
$worksheet.Rows.Item(3).Columns.Item(3).Text
$worksheet.UsedRange.Range("c3").Text

網路資源:Microsoft.Office.Interop.Excel.ApplicationClass

Win 7 環境下,如何更新 PowerShell 的版本?

在 Win 7 環境下,作業系統會內定安裝 PowerShell 的功能,只不過它的版本只有 2.0,若是需要更新地版本(目前最新版本是 4.0),就要下載 Windows Management Framework 4.0 來安裝!(記得要重新開機!)

在還未更新版本之前,先來了解目前系統中 PowerShell 是什麼版次?

1. 進入 Command Line

2. 切換目錄到 C:\Windows\System32\WindowsPowerShell\v1.0

3. 執行指令 $PSVersionTable

4. 查看版本 PSVersion ---> 2.0

未命名

更新後,可以看到是 4.0 版本。

image


若是你使用 Win 8,那麼它就內定安裝 PowerShell 4.0 !

擷取

 

接下來,讓我們了解 PowerShell 4.0 有哪些功能?

Windows PowerShell 4.0 is part of the Windows Management Framework 4.0, which includes the following:

  • Windows PowerShell
  • Windows PowerShell Integrated Scripting Environment (ISE)
  • Windows PowerShell Web Services (Management OData IIS Extension)
  • Windows Remote Management (WinRM)
  • Windows Management Infrastructure (WMI)
  • Server Manager WMI provider
  • Windows PowerShell Desired State Configuration (DSC)


網路資源:

PowerShell Snapin (嵌入式管理單元)

PowerShell Snapin (嵌入式管理單元),內建有七種。若有需要可再以外掛方式來增加。

內建的七種單元:

  • Microsoft.PowerShell.Diagnostics
    這個 Windows PowerShell 嵌入式管理單元包含 Windows Eventing 及 效能計數器 Cmdlet。
  • Microsoft.WSMan.Management
    這個 PS 嵌入式管理單元包含 Cmdlet (例如 WSManInstance 和 Set-WSManInstance),Windows PowerShell 主機會使用這些 Cmdlet 管理 WsMan 作業。
  • Microsoft.PowerShell.Core
    這個 Windows PowerShell 嵌入式管理單元包含用於管理 Windows PowerShell 元件的 Cmdlet。
  • Microsoft.PowerShell.Utility
    這個 Windows PowerShell 嵌入式管理單元包含用於操控資料的公用程式 Cmdlet。
  • Microsoft.PowerShell.Host
    這個 Windows PowerShell 嵌入式管理單元包含供 Windows PowerShell 主控台主機使用的 Cmdlet (例如 Start-Transcript 和 Stop-Transcript )。
  • Microsoft.PowerShell.Management
    這個 Windows PowerShell 嵌入式管理單元包含用於管理 Windows 元件的管理 Cmdlet。
  • Microsoft.PowerShell.Security
    這個 Windows PowerShell 嵌入式管理單元包含用來管理 Windows PowerShell 安全性的 Cmdlet。

上述單元內容,可執行 Get-PSSnapin 得知。

 

若是要增加,使用指令:Add-PSSnapin。
    Add-PSSnapin SqlServerProviderSnapin100
    Add-PSSnapin SqlServerCmdletSnapin100

若是要移除,使用指令:Move-PSSnapin。
    Move-PSSnapin SqlServerProviderSnapin100
    Move-PSSnapin SqlServerCmdletSnapin100

可執行 Get-PSSnapin –Registered 得知,目前所有外掛的 Snapin 有哪些?

使用 T-SQL 深入了解 SQL Server 的基本資料

EXECUTE xp_regread @rootkey='HKEY_LOCAL_MACHINE',
                   @key='SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL',
                   @value_name='MSSQLSERVER'

Value Data
MSSQLSERVER MSSQL10_50.MSSQLSERVER

 

可使用 SELECT SERVERPROPERTY() 得到 Server 的相關資料。
如:

  • SELECT SERVERPROPERTY('ServerName')
  • SELECT SERVERPROPERTY('InstanceName')
  • SELECT SERVERPROPERTY('productversion')
  • SELECT SERVERPROPERTY ('productlevel')
  • SELECT SERVERPROPERTY ('edition')
  • GC-IT-N01
  • NULL
  • 10.50.1600.1
  • RTM
  • Standard Edition (64-bit)
  • SELECT @@servername
  • SELECT @@VERSION
  • GC-IT-N01
  • Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)   Apr  2 2010 15:48:46   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

 

SELECT SERVERPROPERTY('InstanceName') 的資料,來自於:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL

 

SELECT SERVERPROPERTY('productversion') 的資料,來自於:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\100\Tools\ClientSetup\CurrentVersion

 

SQL Server Instances

In order to really understand what versions of SQL Server are installed, you have to understand SQL Server Instances. Each instance of SQL Server operates independently and contains its own collection of databases and settings. There are two types of instances:

Default Instance a single instance named MSSQLSERVER. You connect to this instance using only the server name (ex: localhost)
Named Instance one or more instances. You connect to these instances uing the server name + instance name (ex: localhost\SQLEXPRESS)

 

It's possible have only one instance installed on your machine. But it's also possible to have many instances. And each of those instances could be a different version of SQL Server!

To understand your scenario, use the SQL Server Configuration Manager tool that installs with both SQL Server 2005 and 2008.
On the start menu, expand the "Microsoft SQL Server [YOURVERSION]" menu, and then expand the "Configuration Tools" submenu. Launch the SQL Server Configuration Manager tool.
Here is a screen shot to use as an example:

image

點選右側 SQL Server (MSSQLSERVER) 選項後,按右鍵/內容,可以看到如下結果:

image

 

對於軟體版本的進一步訊息,可參考

 

更多資訊可參考:
http://technet.microsoft.com/en-us/library/ms174396.aspx
http://learningsqlserver.wordpress.com/2011/01/21/what-version-of-sql-server-do-i-have/
SQLSecurity.com http://www.sqlsecurity.com/faqs-1/sql-server-versions/2008-r2

PowerShell 要如何與 SQL Server 配搭?

首先,就以文章標題來探討,PowerShell 是不是可以和 SQL Server 整合,配搭在一起使用?
答案:Yes。

接下來是要如何使用呢?

你是可以在 SQL Server 環境中,執行、使用 PowerShell。共有四種方法:

  • 使用 SQLPS.exe 工具程式
  • 在 SQL Server Management Studio 環境中,指定需處理物件後,按右鍵 / PowerShell。
  • SQL Server Agent Job 中,Agent Job 的形態(Type)設定,就可以指定為 PowerShell。
  • 若是已在 PowerShell 的環境中,還可以再載入 PowerShell provider 進來,以增強功能。

 

使用 SQLPS.exe 工具程式,需了解:

  1. SQLPS 工具程式,需要將該程式的存放路徑設置到環境變數 PATH 中。
  2. 32位元電腦, SQLPS.exe 存放位置: \Program Files\Microsoft SQL Server\100\Tools\Binn
  3. 64位元電腦, SQLPS.exe 存放位置: \Program Files (x86)\Microsoft SQL Server\100\Tools\Binn

以什麼身份權限在執行 PowerShell

執行 PowerShell 會因不同的身份權限與執行方式,而有不同的結果。(請注意:視窗的抬頭文字)例如:

● 系統管理員, 以系統管理員身份執行

image

● 目前的開機使用者,在『執行』對話方塊中,鍵入 PowerShell

image

● Normal(All User / Non-elevated),在『開始』功能表中,執行 PowerShell

image

image

** 因為權限上有所不同,將會產生同一個程式,有的權限可以執行,有的不能執行的情形。

第一次執行 PowerShell @ Win 7

在 Win 7 環境,第一次執行 PowerShell 程式時,遇到下列運行錯誤:
Get-PowerShellRequirements.ps1 檔案無法載入,因為這個系統上已停用指令碼執行。如需詳細資訊,請參閱 "get-help about_signing"。
At line:0 char:0


運行 get-help about_signing 指令後,得知 Windows PowerShell 執行原則的預設值 Restricted,也就是在這原則下,系統是不會允許任何指令碼執行。
所以要修改它的執行原則設定值。

用下列命令將電腦的執行原則變更為 RemoteSigned:
    set-executionpolicy remotesigned


不過,沒想到執行 set-executionpolicy remotesigned 指令後,又遇到另外一個錯誤訊息:
    Set-ExecutionPolicy : 拒絕存取登錄機碼 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'。
    位於 行:1 字元:20
    + set-executionpolicy <<<<  remotesigned
        + CategoryInfo          : NotSpecified: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand


原來是電腦的註冊機碼,無法正常被修正;這時只好已手工方式來調整。
開始/執行/RegEdit,在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell] 處,新增一個機碼 ExecutionPolicy,機碼值為 RemoteSigned。

你也可以把下列指令,寫成 ps1-RemoteSigned.reg 檔案 (文字檔格式),再執行之,以便直接匯入機碼值。

ps1-RemoteSigned.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="RemoteSigned"

 

因為 set-executionpolicy 有多種設定選項:Restricted、AllSigned、RemoteSigned、Unrestricted,
為了日後使用上的方便,可以先行建制好相關的註冊檔,如:
ps1-Restricted.reg、ps1-AllSigned.reg、ps1-RemoteSigned.reg、ps1-Unrestricted.reg
只要將註冊檔中的機碼值,改成和註冊檔名一樣的文字即可。
例如:ps1-Restricted.reg 它的機碼值,就是 Restricted。

ps1-Restricted.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
"Path"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
"ExecutionPolicy"="Restricted"

PowerShell 入門資源

Windows PowerShell 是以 .NET 技術為基礎,並且與現有的 WSH 保持回溯相容;Windows PowerShell 的腳本程式不僅能存取 .NET CLR,也能使用現有的 COM 技術。
Windows PowerShell 安裝完成後,可以利用以下三種方式執行 Windows PowerShell:
  • 位於『開始 / 所有程式』的『Windows PowerShell』捷徑。
  • 在『開始 / 執行』的『執行』交談窗輸入 powershell。
  • 在任何『命令提示字元』視窗的命令提示符號輸入 powershell。
 
入門學習資源:
Owner's Manual  http://technet.microsoft.com/zh-tw/library/ee221100(en-us).aspx
易學易用的 Windows PowerShell  http://technet.microsoft.com/zh-tw/library/dd125460.aspx
 
作者:賴榮樞   http://www.goodman-lai.idv.tw
講座 (1)—指令、重導、別名 http://technet.microsoft.com/zh-tw/library/dd125489.aspx
講座 (2)—自訂工作環境 http://technet.microsoft.com/zh-tw/library/dd125497.aspx
講座 (3)— PS 磁碟機 http://technet.microsoft.com/zh-tw/library/dd125498.aspx
講座 (4)—變數 http://technet.microsoft.com/zh-tw/library/dd125499.aspx
講座 (5)—儲存資料的其他方式及編寫指令碼的前置準備 http://technet.microsoft.com/zh-tw/library/dd125500.aspx
講座 (6)—運算子(上) http://technet.microsoft.com/zh-tw/library/dd125501.aspx
講座 (7)—運算子(下) http://technet.microsoft.com/zh-tw/library/dd125502.aspx
講座 (8)—迴圈與流程控制 http://technet.microsoft.com/zh-tw/library/dd125503.aspx
講座 (9)—模組化 http://technet.microsoft.com/zh-tw/library/dd125504.aspx


Google Script - 網路應用程式的指令碼

要建立 Google Script code,先前有提到可以由 https://script.google.com 來建立。

image

但是,現今使用 Google 雲端硬碟 的人數也不段增加,所以學會由 雲端硬碟 來建置 Script (指令碼),也就有其必要性。
image
image
image

學會如何進入建立指令碼的啟始畫面後,接下來是學習如何建立、發佈 “網路應用程式的指令碼”;
請在啟始畫面中,點選 做為網路應用程式的指令碼 項目。

此時,系統會自動產生一些預設的程式碼;我們先不修改這些程式,直接來看看它的效果是什麼,如此就可以學到網頁程式的基本操作動作。
image

程式碼片段中,有一個doGet function,這是 Web base 指令碼的進入點。就像C語言的 main() 一樣。

接下來,就來運行看看網頁預設程式碼運行的效果,
首先,要發佈這個網頁程式

image

因為是新建網頁,還沒有命名及存檔,所以系統詢問
image

先按 確定 鍵,系統運行一會兒後,另一畫面產生,請記得
按下 儲存新版本 按鈕,再按 部署 鍵。
 image

之後,看到下列畫面

image

點擊 最新的程式碼,即可看到網頁的運作效果。
image

** 直到目前為止,網頁程式還是沒有被發佈出去,因為 確定 鍵還沒有被按下。

若是,重新再執行發佈的作業,會看到下列結果,查看效果只要點選”最新的程式碼”即可,不要做”更新”,除非你真的要發佈它。
image

第一次撰寫、執行 Google Script

首先,
登入網頁 https://script.google.com 準備編輯程式指令

你會看到下列畫面,先選用 空白專案
image

系統預設的初始畫面
image

刪除預設的程式碼,補上下圖中的程式,並儲存專案,名稱為 My First Script

image

執行 Script:執行/createAndSendDocument
系統會因此專案未被 授權 的關係,會有授權的詢問畫面產生。按下 接受 按鈕吧 !

image

你將會收到一份郵件通知,只要點選 超連結 網址

image

就可以看到此程式執行後的結果。
image

初試身手 -- 成功了。


接下來,小修程式看看是不是可以正常 ? ( 換行效果、使用中文字型)

function createAndSendDocument() {
  // Create a new document with the title 'Hello World'
  var doc = DocumentApp.create('Hello World');

  // Add a paragraph to the document 
  doc.appendParagraph('This document was created by my first Google Apps Script.' + '\r\n' +
                     '中文內容:堃修 謙謙君子 卑以自牧'
                     );
  doc.appendParagraph('2013/07/25 Perton Chang');

  // Save and close the document
  doc.saveAndClose();

  // Get the URL of the document
  var url = doc.getUrl();

  // Get the email address of the active user - that's you
  var emailAddress = Session.getActiveUser().getEmail();

  // Send yourself an email with a link to the document
  GmailApp.sendEmail(emailAddress,
                     'Hello from my first Google Apps Script!',
                     'Here is a link to a document created by my ' +
                     'first Google Apps Script: ' + '\r\n' +
                     url);
}

image

image

Windows installer error, Error Code : 2869

在 Windows 7 下,安裝一 *.msi 程式,運行時卻產生錯誤:2869.

這問題要如何排除?

Google 一下,得到一文章:
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/c1326233-3f10-4d98-96a7-4a22e5eeaa2d/

提到,先建置一 vbs 檔案,以修正環境的設定值。其方法如下:
1. 建置 NoImpersonate.vbs (本文的後端會詳述內容)
2. 運行 VBS。
    cscript NoImpersonate.vbs <msi-file>
    ex: cscript NoImpersonate.vbs "Lorom ERP Develop Setup.msi"
3. 再重新執行一次 MSI。

check this link : http://msdn2.microsoft.com/en-us/library/aa368069.aspx

NoImpersonate.vbs 程式碼,條列
'------------------------------------------------
Option Explicit
'' Constant values from Windows Installer
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyInsert = 1
Const msiViewModifyUpdate = 2
Const msiViewModifyAssign = 3
Const msiViewModifyReplace = 4
Const msiViewModifyDelete = 6
Const msidbCustomActionTypeInScript = &H00000400
Const msidbCustomActionTypeNoImpersonate = &H00000800

Dim databaseFile
Dim installer : Set installer = Nothing
Dim database : Set database = Nothing
Dim sql
Dim View, Record
Dim openMode : openMode = msiOpenDatabaseModeTransact
On Error Resume Next

Call Main()

Sub Main()
   If WScript.Arguments.Length <> 1 Then
      Fail("Usage is: cscript " & WScript.ScriptName & " [msi file]")
   End If
   databaseFile = WScript.Arguments(0)
   'WScript.Echo(WScript.ScriptName & ": operating on file '" & databaseFile & "'")
   '' Instantiate Windows Installer object
   Set installer = WScript.CreateObject("WindowsInstaller.Installer") : CheckError
   '' Open the MSI database
   Set database = installer.OpenDatabase(databaseFile, openMode) : CheckError
   Proc1 : CheckError
   'Proc2 : CheckError
   If openMode = msiOpenDatabaseModeTransact Then
      database.Commit
   End If
   WScript.Quit 0
End Sub

Sub Proc1()
   '' 1. problem: CustomActions in Vista have to run with NoImpersonate
   sql = "SELECT `Action`, `Type`, `Source`, `Target` FROM `CustomAction`"
   Set View = database.OpenView(sql) : CheckError
   View.Execute : CheckError
   Do
      Set Record = View.Fetch
      If Record Is Nothing Then Exit Do
      'typeVal = Record.IntegerData(2)
      If (Record.IntegerData(2) And msidbCustomActionTypeInScript) <> 0 Then
         'WScript.Echo "Here 1, Type=" & Record.IntegerData(2)
         Record.IntegerData(2) = Record.IntegerData(2) Or msidbCustomActionTypeNoImpersonate
         'WScript.Echo "Here 2, Type=" & Record.IntegerData(2)
         View.Modify msiViewModifyReplace, Record : CheckError
      End If
   Loop
   View.Close
End Sub

Sub Proc2()
   '' 2. problem: explicit format User-Errors, otherwise they are not visible in Vista, the User just sees Error 2869
   sql = "INSERT INTO `Error` (`Error`, `Message`) VALUES (1001, 'Error [1]: [2]')"
   Set View = database.OpenView(sql) : CheckError
   WScript.Echo "Here 2"
   View.Execute : CheckError
   WScript.Echo "Here 3"
   View.Close
End Sub

Sub CheckError
   Dim message, errRec
   If Err = 0 Then Exit Sub
   message = Err.Source & " " & Hex(Err) & ": " & Err.Description
   If Not installer Is Nothing Then
      Set errRec = installer.LastErrorRecord
      If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
   End If
   Fail message
End Sub

Sub Fail(message)
   Wscript.Echo message
   Wscript.Quit 2
End Sub
'------------------------------------------------

每天必要運行的工作,可以排程化?

想要將每天必做的工作,加以排程化處理,是一個突然間的念頭。
可能是每天的常態性工作吧,所以才不以為意。
說到這兒,回憶起偶而會對 隔壁單位 的同事說:常態性的工作若是可以調整成電腦處理,而不去做,那麼作死自己也沒有人會可憐你 !!

沒想到,這事也落在自個的身上,真該自省了。

事情是這樣了,
每天一定要做 前天 資料庫的備份工作。而這備份工作也早已經寫成批次檔案,只要每天一上工,去點擊它 運行之。
說到這,大伙一定想即然是電腦做,點擊後不就沒事了 ??
事實上,每次的備份工作約要從 09:00 ~ 11:30,如此長的工作時間,一定也會影響到同一時間公司同事使用網路頻寬的效率。

所以,想調整:
1. 在非上班時段,運行資料庫的備份,由電腦啟動排程管控
2. 改善備份的效率
3. 一上班,就可以測試備份資料庫的完整性,減化備份的工作。

依據上述的構想,
在原本每天執行備份的電腦上,設定工作排程機制,讓它每天運作 ScheduleBatch.bat 檔案;
而該程式就會呼叫 前一天 的備份批次檔:備份bak單檔批次檔_20120605.bat

ScheduleBatch.bat  ============= 程式內容
@echo off
echo wscript.echo dateadd("d", -1, date) > %tmp%\tmp.vbs

for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k

rem    if %m% LSS 9 set m=0%m%
rem    if %d% LSS 9 set d=0%d%

@echo on
echo 備份bak單檔批次檔_%y%%m%%d%.bat
=========================================

接下來,稍做批次檔運作指令的說明,
echo wscript.echo dateadd("d", -1, date) > %tmp%\tmp.vbs
使用 VBScript 功能,在電腦 %tmp% 的目錄中,產生 tmp.vbs,其內容是 wscript.echo dateadd("d", -1, date)

接下來是使用 cscript 來運行 tmp.vbs,分別得到 年、月、日 等三個變數 %y%、%m%、%d%
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k

最後,就是執行備份批次檔
echo 備份bak單檔批次檔_%y%%m%%d%.bat

初識 XML 的結構

假設,有一 XML 檔案(MENU_CHT.xml) 內容如下:
-----------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<MENU>
  <A prgkey="BA" caption="基礎工程" enable="true">
    <A1 prgkey="PB" caption="公用資料" enable="true">
    …
    </A1>
  </A>
  … (含 A 元素,共有 21個子元素)

</MENU>
-----------------------------------------------------------

使用 VBA 程式來讀取,各式指令將取得不同的結果值,要注意哦

    Set XMLDoc = New MSXML2.DOMDocument
    strFileXML = ActiveWorkbook.Path & "\" & "MENU_CHT.xml"
    intState = XMLDoc.Load(strFileXML)      ' intState 數值說明; (-1) 成功
    If intState Then                                  'MsgBox "讀取 XML 成功"
        Set xFirst = XMLDoc.FirstChild
'        MsgBox xFirst.nodeName              ==> xml
'
        Set xRoot = XMLDoc.documentElement
'        MsgBox xRoot.nodeName             ==> MENU

'        MsgBox XMLDoc.childNodes        ==> 2
'        MsgBox xRoot.childNodes           ==> 21

        For i = 1 To Level1nodes.Length 
            ' 取得元素內容
            Set Level1node = Level1nodes.NextNode
'            MsgBox Level1node.nodeName

            ' 取得屬性內容
            Set Level1Attr = Level1node.Attributes
            'MsgBox Level1Attr.Length

            For a = 1 To Level1Attr.Length
                Set nodeAttr = Level1Attr.Item(a - 1)
'                MsgBox nodeAttr.nodeName & " -- " & nodeAttr.Text
'                nodeAttr.nodeName             ==>  prgkey
'                nodeAttr.Text                      ==>  BA
                strAttr = strAttr & nodeAttr.Text & vbTab
            Next
        Next i

VBS 為Excel 資料自動排序的用法

想要用VBS 為Excel 資料自動排序,需要注意到幾個重點:

  • 要排序的 Excel 檔名,不可含有中文字
  • 要為排序資料事先建立 範圍名稱(Range Name)
  • 範圍名稱(Range Name)也不可以使用中文字
  • VBS 程式中,要注意到 objRange.Sort 函式的使用語法及參數位置

以範例說明如下:

ERP_Sort_公告編號_A_Q.vbs
-----------------------------------------------------------
Const xlAscending = 1
Const xlYes = 1

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Open("C:\ERP\ERP_On-Line_Notice.xls")
' Worksheets 編號由 1起算
Set objWorksheet = objWorkbook.Worksheets(4)
Set objRange = objWorksheet.UsedRange
Set objRange2 = objExcel.Range("AnnounceNo")
Set objRange3 = objExcel.Range("A")
Set objRange4 = objExcel.Range("Q")

objRange.Sort objRange2, xlAscending, objRange3, , xlAscending, objRange4, xlAscending, xlYes
------------------------------------------------------------

資料參考:Tips and Tricks for Scripting Microsoft Office Applications

產生一個不能正常開啟的 XML 檔案 (2)

在先前"產生一個不能正常開啟的 XML 檔案 (1)" 文章中提到,即使已經產生 Unicode 格式的 XML 檔案。
但是,也無法正常被開啟。
原因是檔案是 UTF-16LE,不是我們所需要的 UTF-8 格式。

要解決這問題,就需要改用 ADO Stream ,而不用 FileSystemObject 。

Write2XML_ADO Stream.vbs
-----------------------------------------------------
Dim oFile
Dim sStr

oFile = "C:\Write_ADO Stream.XML"

sStr = "<?xml version = " & Chr(34) & "1.0" & Chr(34) & " encoding = " & _
    Chr(34) & "UTF-8" & Chr(34) & " ?>" & vbCrlf
sStr = sStr & "<book>" & vbCrlf
sStr = sStr & "</book>" & vbCrlf

Set objADODBStream = CreateObject("ADODB.Stream")
objADODBStream.Charset = "UTF-8"
objADODBStream.Open
objADODBStream.WriteText sStr
objADODBStream.SaveToFile oFile, 2
objADODBStream.Close
Set objADODBStream = Nothing

WScript.Echo "C:\Write_ADO Stream.XML be Created"