Windows PowerShell
酷炫管線技巧,重生
Don Jones
上個月我示範您利用 的一個很棒的管線技巧管線參數繫結,將變成簡單的 Windows PowerShell one-liner 的有點複雜的工作。
這裡 ’s 快速的重點:我建立一個包含我需要在 Active Directory 網域中建立新使用者的相關資訊的逗點分隔值 (CSV) 檔案。 所做確定 CSV 檔案 ’s 資料行行首比對 參數名稱新 ADUser Cmdlet (這樣會隨附了 Windows Server 2008 R2 並可以與 Windows Server 2003 網域也一起使用)。 讓資料行行首不像 「 部門,」 「 城市 」 「 名稱 」 的 「 GivenName 」 「 姓氏,」 的項目等等。 因為 新 ADUser 繫結管線輸入由屬性名稱選取這些資料行名稱讓我只是兩個指令程式以建立使用者:
匯入 CSV c:\new-users.csv | 新 ADUser
The 匯入 CSV Cmdlet 會輸出 CSV] 檔案的每一行物件並這些物件都有對應至 CSV 資料行名稱的內容。 因為我 CSV 檔案包含 所有 therequiredparameters of 新 ADUser,我 didn’t 需要以手動方式指定任何參數雖然我可以有不會是有效的每一位新使用者該檔中指定任何參數 — 為組織為範例:
匯入 CSV c:\new-users.csv | 新 ADUser –organization OurCompany"
我認為這個範例真的醒目提示的 Windows PowerShell 乘冪:VBScript] 天內這項工作會需要多行指令碼 (,您可以現在就如此一來在 Windows PowerShell 太)。 但此 「 指令碼 」 所花時間瞭解管線的運作方式,和幾個記載 Cmdlet 協助,變成幾個簡單的命令。
因此什麼 ’s 問題?
幾個聰明的讀者在我的網站上張貼問題www.ConcentratedTech.com指出,我很棒的技巧只正常運作如果 CSV 檔案 ’s 資料行名稱 完全 符合參數名稱在 新 ADUser. 如果系統管理員已建立 CSV 檔案,您可以可能仰賴該完全相符 ; 如果檔案來自某人在人力資源,資料行名稱是比較可能被之類的 「 名字,」 「 姓名稱 」 等等 — 不為 ,我們必須在完全相符新 ADUser 可以自動將這些屬性繫結至它的參數。
當然您可以永遠只編輯任何檔案或資料庫同仁傳送您的人力資源 — 但 isn’t 這種 drudgery 完全為什麼我們是電腦的原因? Windows PowerShell 的當然提供快速又簡單的修正程式,針對 「 重新命名 」 屬性:The 選取物件 Cmdlet。
選取物件 是其中一個可能有點棘手想瞭解如何使用,因為它這麼做這些指令程式。 比方說其主要工作之一,是藉由消除 don’t 需要在時間屬性簡化的物件。 只需指定屬性 請執行 想,而指令程式會輸出修剪下物件。 這就很有用,例如進行輸出顯示和位元更清楚的文字檔案:
取得 WmiObject Win32_OperatingSystem | 選取物件 BuildNumber、 ServicePackMajorVersion
的另一項用途選取物件 是到管線中選取物件的子集,藉由使用 –first or –last 參數:
取得處理序 | 排序 VM –Desc | 選取 –first 10
請注意我切換到別名 選取 而完整的指令程式名稱。
這裡 ’s 方案
另經常被忽略的 能力選取物件 是它不只選取您想要的屬性,但重新命名它們的能力。 如果您曾經讀取 Cmdlet ( 完整的說明說明選取 –full— 我絕對建議用 所做的東西每隔 Cmdlet) 您發現了這個功能和甚至看到的如何使用它的範例。 以下為範例:
匯入 CSV c:\new-users.csv | @ 選取 {名稱 ="姓氏"; 運算式 = {$ _。"姓氏"}}
如果輸入的 CSV 檔案 「 姓氏 」 資料行這將它重新命名為 「 姓氏,」 允許輸出屬性,以符合 參數名稱新 ADUser. 我作業被建立 hashtable, 也稱為 字典 or 關聯的陣列. 在 @ 符號是在 Windows PowerShell 陣列運算子 ; hashtable 是索引鍵 / 值組所組成的陣列。 在這種情況下索引鍵是我想要建立的屬性的名稱,且值為想要指派給該屬性的內容。 hashtable 運算式部分,內我可以使用 $ _ 變數來參照目前的管線物件 — 在此範例中,我擷取它 (我必須使用引號括住屬性名稱,因為屬性名稱包含空格) 的 「 姓氏 」 屬性。
您可以在任意 提交為多個選取物件:
匯入 CSV c:\new-users.csv | @ 選取 {名稱 ="姓氏"; 運算式 = {$ _。"最後一個 Name"}},@ {名稱 ="GivenName"; 運算式 = {$ _。"在 [名字"}}
比較麻煩的是 選取物件 will 僅輸出完全什麼您告訴它要 因此 can’t 只是告訴它重新命名一個或兩個資料行,並讓它輸出那些兩加一切 didn’t 需要重新命名。 通常您需要指定 每隔您想要輸出至下一個 Cmdlet 屬性。 當然如果 don’t 需要重新命名每個資料行從 CSV 檔案,您可以只列出它們是:
匯入 CSV c:\new-users.csv | @ 選取 {名稱 ="姓氏"; 運算式 = {$ _。"最後一個 Name"}},@ {名稱 ="GivenName"; 運算式 = {$ _。"名字"}},部門、 組織、 名稱
在這種情況下 「 部門 」 「 組織 」 和 「 名稱 」 會傳遞沿著而不被重新命名這是正常 — 它們完全符合的 關聯的參數新 ADUser.
這看起來可能痛苦如果您有很多的資料行,以指定,所以這裡 ’s 捷徑:
匯入 CSV c:\new-users.csv | 選取@ {名稱 ="姓氏"; 運算式 = {$ _。"姓氏"}},@ {名稱 ="GivenName"; 運算式 = {$ _。"名字"}},*
在 「 * 」 會輸出 所有除了 「 姓氏 」 的輸入物件的屬性和 「 GivenName 」 屬性,我建立了 。 因此 let’s 假設我有 CSV 檔案看起來像這樣:
名字、 姓氏、 部門,名稱
Don、 先生,IT DonJ
Greg 盾 Janitorial,GregS
Jeff、 Hicks,IT JeffH
我接著可以使用這些兩個指令程式:
匯入 CSV c:\new-users.csv | @ 選取 {名稱 ="姓氏"; 運算式 = {$ _。"最後一個 Name"}},@ {名稱 ="GivenName"; 運算式 = {$ _。"名字"}},*
而且我輸出物件將每一個有 六個 屬性:「 姓氏,」 「 上次名稱,」 「 部門 」 「 名稱 」 「 姓氏 」 和 「 GivenName 」。亦即所有原始屬性加上我加入項目。 我接著只要加上 新 ADUser Cmdlet:
匯入 CSV c:\new-users.csv | @ 選取 {名稱 ="姓氏"; 運算式 = {$ _。"最後一個 Name"}},@ {名稱 ="GivenName"; 運算式 = {$ _。"名字"}},* | 新 ADUser
The 新 ADUser Cmdlet won’t 能夠執行任何動作以 「 名字 」 和 「 姓氏 」] 屬性,因為那些 don’t 符合任何它的參數。 ’s 沒問題 — 指令程式只需將會忽略任何 can’t 繫結的屬性。 它會但是,繫結剩餘四 — 「 Surname 」 的 「 GivenName 」 「 部門,」 和 「 名稱,」 在這個案例 — 並為我建立新的使用者帳戶。
變更您的思維模式
我發現其中一個最大的挑戰中使用 Windows PowerShell 是 *永遠不會放棄。*亦即如果資料行名稱 don’t 符合您需要什麼,因此,can’t 使用所提供的 CSV 檔案,don’t 假設,答案是變更 CSV 檔案! Windows PowerShell 幾乎都可以執行您需要什麼 — 只是有點調查您的組件上使用。
所以何種自黏挑戰您遇到與 Windows PowerShell? 我愛知道 — 以及可能的未來的發行項基礎答案! 張貼在問題www.ConcentratedTech.com位置我無法回答立即線上,從您收集的其他詳細資料,可能是建置 將未來的發行項Microsoft TechNet 雜誌。
Don Jones is 該民族的其中一個最遇到 Windows PowerShell trainers 和寫入器。他的部落格每週 Windows PowerShell 秘訣在ConcentratedTech.com您也可能與他連絡或詢問他那里問題。