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

2022年12月3日

使用 PowerShell 大量建立 Exchange Online 連絡人

先準備好要匯入的連絡人檔案,在此以逗號分隔檔 (CSV) 檔名 Contacts.csv 為例,並只用 3 個欄位,請注意 Alias 欄位的值必須為英文或數字,檔案內容如下:
ExternalEmailAddress,Name,Alias
derrick@contoso.com,得瑞克,Derrick
tom@contoso.com,湯姆,Tom
claire@contoso.com,克來爾,Claire

連線到 Exchange Online,然後匯入 CSV 檔:
  1. 開啟 Windows PowerShell,並執行下列命令:
    $UserCredential = Get-Credential

    在 [Windows PowerShell 認證要求] 對話方塊中,輸入 Exchange Online 管理者名稱和密碼,然後按一下 [確定]
  2. 執行下列命令:
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic –AllowRedirection
    
  3. 執行下列命令:
    Import-PSSession $Session
  4. 執行下列命令,將 CSV 檔裡的 3 個欄位匯入到連絡人,對應到姓名:
    Import-Csv .\Contacts.csv | %{New-MailContact -Name $_.Name -DisplayName $_.Name -Alias $_.Alias -ExternalEmailAddress $_.ExternalEmailAddress}

Exchange Online 連絡人的資料欄位不只有 3 個,詳細的欄位說明請參考
How to update contact information in Exchange Online in Office 365

2017年10月5日

PowerShell 中的 $_ 是什麼呢?

在 PowerShell 裡,$ 是用來宣告變數的啟始字元,因此只要看到 $ 帶頭的,就知道它會儲存變數的內容。那麼 $_ (錢字號尾隨底線)又代表什麼呢?它代表目前的管線物件 (Pipeline Object),這樣的說明很抽象,讓我們用實例來瞭解該怎麼用 $_。

2011年6月4日

使用 Windows PowerShell 將 SQL Server 資料匯出成 .csv 檔案

先前「使用 Windows PowerShell 將資料匯出成 .html 檔案(含安裝 SQLPSX 模組教學)」一文說明使用 CodePlex 的 SQL Server Powershell Extensions(簡稱 SQLPSX)專案,可以將資料匯出成 HTML 格式。

此次則是要介紹如何在 Windows PowerShell 透過 SQLPSX,並使用 Windows PowerShell 內建的 ConvertTo-CSV 指令(Cmdlet)產生以逗點分隔的內容,再搭配導向功能,將 Microsoft SQL Server 資料輸出成 .csv 檔。

▼ 使用 Microsoft Excel 觀看輸出的 .csv 檔
使用 Microsoft Excel 觀看 SQLPSX 輸出的 .csv 檔

在 Windows PowerSehll 輸入如下的指令:

Get-SqlData ".\SqlExpress" 北風貿易 "SELECT 員工編號, 身份證字號, 姓名 FROM 章立民研究室" | ConvertTo-Csv > d:\章立民研究室.csv

上面的指令會從本機電腦中,名稱為 SqlExpress 的 SQL Server Express 執行個體中的北風貿易資料庫,找出章立民研究室資料表中的所有資料,但只顯示 3 個欄位,接著將查詢結果轉換成 csv 格式,最後再導向輸出到 d:\章立民研究室.csv

當您使用文字編輯器(例如:記事本)開啟該 .csv 檔時,會發現到第 1 列多了 #TYPE System.Data.DataRow 這樣的文字,而第 2 列才是欄位名稱的清單,第 3 列之後才是真正從資料庫匯出的資料。

▼ 匯出的 .csv 檔第 1 列會有型別資訊標頭
匯出的 .csv 檔第 1 列會有型別資訊標頭

如欲避免產生第 1 列的文字(亦即物件型別的資訊標頭),可在 ConvertTo-CSV 指令加上 -NoTypeInformation 參數,這樣才不會產生型別資訊標頭。 所以完整的指令為:

Get-SqlData ".\SqlExpress" 北風貿易 "SELECT 員工編號, 身份證字號, 姓名 FROM 章立民研究室" | ConvertTo-Csv -NoTypeInformation > d:\章立民研究室.csv
關於 SQLPSX 模組詳細的指令說明,可在此處找到。

2011年4月3日

安裝教學:SQL Server Powershell Extensions (SQLPSX) v2.3.2.1

先前「使用 Windows PowerShell 將資料匯出成 .html 檔案(含安裝 SQLPSX 模組教學)」一文說明使用 CodePlex 的 SQL Server Powershell Extensions(簡稱 SQLPSX)專案,可以將資料匯出成 HTML 格式。結果在發文之後的幾天(2010 年 11 月 6 日),SQLPSX 又出新版:2.3 版,安裝檔的名稱從 SQLPSX_Install_32.exe、SQLPSX_Install_64.exe,改成 SQLPSX.msi。這麼一改,安裝時,就無須注意作業系統版本是 32 還是 64 位元,真是太方便了。

沒想到,一個多月之後(2010 年 12 月 11 日),發行了 2.3.1 版;2011 年 3 月 13 日,再推出 2.3.2.1 版,開始支援存取查詢 MySQL 資料庫。上述幾個版本之差異如下所列:

2.3 版 2.3.1 版 2.3.2.1 版
10 個模組
(開始支援「以原則為基礎的管理」,亦即  PBM)
12 個模組
(多了模組:PerfCounter、SQLProfiler(此模組僅能用於 x86 的環境中)
13 個模組
(多了模組:MySQLLib,這表示 SQLPSX 也支援 MySQL)
137 個函式 155 個函式 163 個函式、2 個 cmdlet、7 個腳本

前置作業

安裝 SQLPSX v2.3.2.1 的方式很簡單,但在安裝之前,您的電腦必須已經安裝下列元件並做好設定:

安裝 SQLPSX 模組

  1. 在下載的 SQLPSX.msi 檔案上,連按兩下滑鼠左鍵 。
  2. 此時會出現 SQLPSX 安裝精靈,按下「Next」按鈕。
    SQLPSX 安裝精靈
  3. 勾選「I accept the terms in the License Agreement」,然後按下「Next」按鈕。
    接受授權同意書
  4. 按下「Next」按鈕。
    一般來說,是不需要修改安裝的路徑,除非您希望所有使用者皆可使用,此時就請考慮安裝到所有人皆有權限可存取的目錄,同時記得替環境變數 PSModulePath 加上剛修改的自訂路徑
    指定安裝目錄
  5. 按下「Install」按鈕。
    開始安裝
  6. 當出現「使用者帳戶控制」對話視窗,請按下「是」按鈕,並稍待片刻。
    使用者帳戶控制
  7. 按下「Finish」按鈕。
    安裝完成

啟用 SQLPSX 模組

於安裝 SQLPSX 完畢之後,當您開啟 Windows PowerShell 時,並不會自動載入 SQLPSX 模組,需自行載入相關的模組才行,例如要查詢電腦名稱 ALEX-PC 上,預設的 SQL Server 執行個體(亦即執行個體名稱為 MSSQLServer)之相關  SMO  資訊,就要先載入名稱為 SQLServer 的模組,並呼叫  Get-SqlServer 函式

Import-Module SQLServer
Get-SqlServer "ALEX-PC"

▼ 載入特定模組,並執行某個函式
載入特定模組,並執行某個函式

個別載入 SQLPSX 模組的指令如下:

Import-Module SQLServer
Import-Module adoLib
Import-Module Agent
Import-Module PerfCounters
Import-Module Repl
Import-Module ShowMbrs
Import-Module SQLIse
Import-Module SQLMaint
Import-Module SQLParser
Import-Module SQLProfiler
Import-Module SSIS
Import-Module OracleClient
Import-Module OracleIse

您當然可以實際所需,僅載入會使用到的模組。不過這樣的操作方式,還不是挺方便的,因為要輸入多次的載入指令。用下面這個指令,就可一次載入數個 SQLPSX 模組:

Import-Module SQLPSX

▼ 一次載入數個 SQLPSX 模組
一次載入數個 SQLPSX 模組

然而這樣子,有 2 個模組(PerfCountersSQLProfiler)並沒被載入。原因在於原作者忘了修改位於 %UserProfile%\Documents\WindowsPowerShell\Modules\SQLPSX (該路徑為 Windows Vista 之後的作業系統,如上面安裝步驟 4. 中所顯示的路徑。若您的作業系統為 Vista 之前,請自行將 Documents 調整成 My Documents 或實際的路徑名稱)目錄中的 SQLPSX.psm1,所以請使用您熟悉的文字編輯器開啟該檔案,找到 $PSXloadModules += 該行,然後於該行的後面,加入如下的文字:

,"PerfCounters","SQLProfiler"

▼ 修改 SQLPSX.psm1 設定
修改 SQLPSX.psm1 設定

如何知道有哪些模組可供載入?

這個問題跟 SQLPSX 沒什麼關係,使用下面的指令會顯示 Windows PowerShell 有哪些模組可供載入:
Get-Module -ListAvailable

可以一開啟 Windows PowerShell 就載入 SQLPSX 相關的模組嗎?

難道沒有辦法類似 DOS  時代,使用批次檔 Autoexec.bat 事先載入相關模組嗎?答案是肯定的,請依照下列步驟進行操作:

  1. 開啟 Windows PowerShell,輸入下面的指令,以便建立目前這個使用者的 Windows PowerShell 設定檔:
    notepad $Profile
  2. 此時會開啟記事本,並出現找不到檔案的提示訊息,按下「是」按鈕,開始編輯設定檔。請將下面的內容複製下來,然後貼到記事本,接著存檔(下面的路徑適用於 Windows Vista 之後的作業系統,若您的作業系統為 Vista 之前,請自行將 Documents 調整成 My Documents 或實際的位置與名稱):
    Import-Module $Home\Documents\WindowsPowerShell\Modules\SQLPSX\SQLPSX.psm1

    ▼ 找不到檔案的提示訊息
     找不到檔案的提示訊息
    請注意:
    $Home
    變數是指目前使用者的主目錄,此步驟就是在目前使用者的主目錄下的 Documents\WindowsPowerShell 目錄,建立 Microsoft.PowerShell_profile.ps1 檔。
  3. 關閉 Windows PowerShell,然後再開啟它,此時應該會看到如下的畫面,即表示成功自動載入 SQLPSX 模組了。開懷大笑

    ▼ 成功自動載入 SQLPSX 模組
    成功自動載入 SQLPSX 模組
    請注意:
    SQLProfiler 模組僅能執行於 PowerShell x86 中,原因請看圖:

Windows PowerShell 還有個整合式指令碼環境(簡稱  ISE)是一個以 GUI 為介面的應用程式,可讓我們在一個整合式的環境中撰寫、執行和測試指令碼與模組。所以他具有語法標色、TAB 自動完成、視覺化偵錯、Unicode 相容性、即時線上說明等,提供豐富的指令碼撰寫體驗。欲一開啟 ISE 中,也能自動載入 SQLPSX 模組,也需要按照上述的操作步驟進行設定,此時所編輯的設定檔名為:Microsoft.PowerShellISE_profile.ps1,而不是 Microsoft.PowerShell_profile.ps1。

2011年3月7日

在 Windows PowerShell 中,要使用雙引號(")還是單引號(')顯示文字呢?

Windows PowerShell 允許我們在顯示文字或設定文字變數時,使用雙引號(")跟單引號(')。

例如顯示字串:

'這個是字串'
"這也是字串"

執行結果如下:
顯示文字

設定字串:

$OK = '我說:"沒有問題!"'
$GO = "Let's go."
Write-Host $OK $GO

結果:
設定並顯示文字變數

以上面的範例程式碼來說,如果變數要全部改用雙引號(")或單引號(')來表示,要怎麼辦呢?

有 2 種方式可用,第 1 種是只要把雙引號或單引號再重複一次即可,另外一種方式則使用逸出字元,要提醒大家的是,PowerShell 的逸出字元是 `(跟波浪符號位於同一個按鍵的那個),而非許多語言所用的反斜線(\)。

  • 方法 1:重複一次單引號或雙引號
    $OK = "我說:""沒有問題!"""
    $GO = 'Let''s go.'
    Write-Host $OK $GO

  • 方法 2:使用逸出字元(`)
    $OK = "我說:`"沒有問題!`""
    $GO = "Let's go."
    Write-Host $OK $GO

由上面的數個範例可以看出來,使用雙引號(")跟單引號(')來顯示文字或設定文字變數並沒有什麼差別。但是若要顯示文字變數真正的值時,就有差異了。如下圖,要顯示變數真正的值必須要使用雙引號,如果使用單引號,那麼只會顯示該變數的名稱。

一言以蔽之,雙引號展開變數的值,用單引號只會顯示變數的名稱

要顯示變數真正的值必須要使用雙引號

2010年12月30日

使用 Wondows PowerShell 將兩個資料夾中,主檔名相同的檔案搬移到另外一個資料夾

假設資料夾 1 為 D:\doc,資料夾 2 為 D:\txt,其內分別儲存 .doc 與 .txt 檔,要將資料夾 1 中,主檔名與資料夾 2 主檔名相同的檔案搬移到另外一個資料夾(D:\newdoc)。

要如何使用 Wondows PowerShell 進行這樣操作呢?

例如:

資料夾 1(D:\doc)內有下列檔案:

  • a.doc
  • b.doc
  • c.doc
  • aa.doc
  • ab.doc
  • ac.doc

資料夾 2(D:\txt)內有下列檔案:

  • a.txt
  • aa.txt
  • bb.txt
  • cc.txt

資料夾 1 與資料夾 2 中,相同主檔名的有:

  • a
  • aa

所以要將 a.doc 與 aa.doc 搬移到新資料夾(D:\newdoc)。Windows PowerShell 程式碼如下:

# 宣告變數
$folderA = "D:\doc\"
$folderB = "D:\txt\"
$folderNew = "D:\newdoc\"

# 找出資料夾中的每個檔案
foreach ($fileA in Get-ChildItem $folderA)
{
    # 組出另一資料夾中的檔名
    # 方法 1
    $fileB = $folderB + $fileA.Name.Remove($fileA.Name.Length - $fileA.Extension.Length) + ".txt"
    # 方法 2,此法有缺點,萬一檔名中有數個 .doc 都會被換成 .txt
    #$fileB = $folderB + $fileA.Name.ToLower().Replace(".doc", ".txt")

    # 檢查檔案是否存在資料夾中
    If (Test-Path $fileB) {
        "搬移檔案: $fileA"
        $fileA.MoveTo($folderNew + $fileA.Name)
    }
}

2010年11月3日

使用 Windows PowerShell 將資料匯出成 .html 檔案(含安裝 SQLPSX 模組教學)

CodePlex 有個 SQL Server Powershell Extensions(簡稱 SQLPSX)專案,裡面提供數個資料庫(不單支援 Microsoft SQL Server,連 Oracle 都支援,但前提是您的電腦必須有 Oracle 相關的組件才行)的模組(Module),其中有個 Get-SqlData 方法可以執行 T-SQL 查詢,並回傳一個 DataRow 物件。

由於回傳的是 DataRow 物件,所以可以透過 Windows PowerShell 內建的 ConvertTo-Html 指令(Cmdlet),將 DataRow 物件轉換成 HTML 格式,接著透過導向方式,輸出成 .html 檔即可在瀏覽器中顯示。

前置作業

安裝 SQLPSX 的方式很簡單,但在安裝之前,您的電腦必須已經安裝下列元件並做好設定:

安裝 SQLPSX 模組

下載內含安裝程式的壓縮檔:SQLPSX_V2_Install.zip,將其解開,然後依照作業系統的位元是 3264 的不同,執行相對應的安裝程式 SQLPSX_Install_32.exe、SQLPSX_Install_64.exe,然後依照畫面指示進行操作。

▼ 開始進行安裝
開始進行安裝

▼ 指定壓縮檔
指定壓縮檔

▼ 安裝完畢,最下方的狀態列會顯示:SQLPSX - Installation completed
安裝完畢

開啟 Windows PowerShell,輸入下面的指令,以便建立目前這個使用者的 Windows PowerShell 設定檔:

notepad $Profile

此時會開啟記事本並出現找不到檔案的訊息,按下「是」按鈕,開始編輯設定檔。請將下面的內容複製下來,然後貼到記事本,接著存檔(下面的路徑適用於 Windows Vista 之後的作業系統,若您的作業系統為 Vista 之前,請自行將 Documents 調整成 My Documents 或實際的位置與名稱):

Import-Module $Home\Documents\WindowsPowerShell\Modules\SQLPSX\SQLPSX.psm1

請注意:
$Home
變數是指目前使用者的主目錄 。

關閉 Windows PowerShell,然後再開啟它,此時應該會看到如下的畫面,即表示成功安裝 SQLPSX 模組了。開懷大笑

▼ 安裝 SQLPSX 模組成功了
成功安裝 SQLPSX 模組

使用 SQLPSX 模組

在 Windows PowerSehll 輸入如下的指令:

Get-SqlData ".\SqlExpress" 北風貿易 "SELECT * FROM 章立民研究室" | ConvertTo-Html -Property 員工編號, 身份證字號, 姓名 -Title "員工資料表" > d:\章立民研究室.html

上面的指令會從名稱為 SqlExpress 的 SQL Server Express 執行個體中的北風貿易資料庫,找出章立民研究室資料表中的所有資料,接著將輸出結果轉換成 HTML 格式,且只輸出 3 個欄位,並將 .html 的 Title 屬性設定成 員工資料表,然後輸出到 d:\章立民研究室.html

▼ 使用 Windows PowerShell 將資料匯出成 .html 檔案
使用 Windows PowerShell 將資料匯出成 .html 檔案

▼ 檢視 .html 原始碼
檢視 .html 原始碼

  1. 其實是可以在 T-SQL 語法中的 SELECT 子句指定要哪些欄位,我只是想凸顯出 PowerShell ConvertTo-Html 有個 Property 屬性也可指定要顯示哪些欄位。
  2. 至於其他 SQLPSX 模組詳細的指令說明,可在此處找到。

2010年2月1日

DOS 與 Windows PowerShell 的導向運算子

熟悉 DOS 指令的人就會知道,DOS 提供簡單的輸入輸出導向運算子,同樣地,號稱微軟最強悍的 Windows PowerShell 腳本語言自然也具備與 DOS 相同的導向運算子。茲將相關的導向運算子列示如下:

導向運算子 使用範例 執行結果 說明
> dir > alex.txt dir 的結果將取代 alex.txt 檔案原本的內容 >代表的意義是取代
>> dir >> alex.txt dir 的結果將附加至 alex.txt 檔案原本內容的後面 >> 所代表的意義為附加
2> dir/e 2> 錯誤.txt 將執行的錯誤訊息取代 錯誤.txt 檔案原本的內容 2 所代表的意義即是錯誤訊息
2>> dir/e 2>> 錯誤.txt 將執行的錯誤訊息附加至 錯誤.txt 檔案原本內容的後面 2 所代表的意義即是錯誤訊息
2>&1 dir alex.cmd > alex.txt 2>&1 除了將 dir 的結果取代 alex.txt 檔案原本的內容之外,同時也將執行的錯誤訊息寫入 alex.txt 檔 2>&1 是指將錯誤訊息(也就是 2)與結果(也就是 1)都寫入檔案內
dir alex.cmd >> alex.txt 2>&1 除了將 dir 的結果附加至 alex.txt 檔案原本內容的後面之外,同時也將執行的錯誤訊息寫入 alex.txt 檔 同上,只是變成附加到原本的檔案之後