2014-06-24 176 views
1

我正在編寫一個函數,它是一個更大的腳本的一部分,它將從Web窗體獲取輸入,檢查該用戶是否存在於我們的AD或Linux系統中,創建帳戶if它不會,當用戶完成時發送電子郵件給用戶,然後創建一個我們可以打印出來的Word文檔,並向他們提供他們的憑證(無臨時密碼),電子郵件地址以及有關我們IT服務的基本信息。與Word融合在一起,我一直在毆打我的頭。 Word集成在線幾乎爲零的Powershell文檔。我一直不得不從C#和VB翻譯,甚至有一半甚至不能翻譯。我現在主要工作,但我有問題讓PS把我的文本放在Word模板的正確位置。我有一個帶有4個書籤的Word模板,插入用戶的姓名,用戶名,電子郵件地址和帳戶到期時間。問題是,PS將所有文本放在同一個書籤上。我發現如果我靜靜地將腳本中的信息放入腳本中(即。$ FillName.Text ='John Doe'),但是如果我使用了一個變量,它會將它們全部粘在第一個書籤上。這裏是我的代碼:與Powershell一起使用Word模板

Function createWordDocument($fullname,$sam,$mailaddress,$Expiration) 
{ 
    $word = New-Object -ComObject "Word.application" 

    $doc = $word.Documents.add("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome2.dotx")   
    $FillName=$doc.Bookmarks.Item("Name").Range 
    $FillName.Text="$fullname "   
    $FillUser=$doc.Bookmarks.Item("Username").Range 
    $FillUser.Text="$sam"  
    $FillMail=$doc.Bookmarks.Item("Email").Range 
    $FillMail.Text="$mailaddress"  
    $FillExpiration=$doc.Bookmarks.Item("Expiration").Range 
    $FillExpiration.Text="$Expiration"   
    $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\test1.docx" 
    $doc.SaveAs([ref]$file) 

    $Word.Quit() 


} 

該函數接收源自import-csv的參數。 $全名,$山姆和潛在的$ mailaddress都已經從他們的原始輸入進行了修改。 #Expiration來自import-csv raw。任何幫助,將不勝感激。 This似乎是我可以找到的最相關的信息,並且據我所知,我擁有相同的代碼,但它不適用於多個書籤。

+0

我會寫更多的細節的答案,但我經常做類似的事情,我有2個字給你:郵件合併...如果你不熟悉它,你可能想谷歌它,因爲它做你想做的,你可以讓PowerShell自動化它。很快就會有詳細的答案。 – TheMadTechnician

回答

1

好吧,就像我建議你可以設置一個郵件合併基地,你可以用它來爲人們創建文檔。這意味着你需要將你的數據輸出到一個CSV文件中,但這很簡單。

首先設置一個包含您要包含的數據的測試CSV。爲了簡單起見,您可能希望將它與引用它的單詞doc放在一起。現在我們將其稱爲mailmerge.csv,但您可以將其命名爲任何您想要的名稱。看起來像名稱,用戶名,電子郵件和過期是你想要的字段。您可以暫時在這些字段中使用虛擬數據。

然後在Word中設置郵件合併,並將其保存在某個位置。我們將其稱爲Welcome3.docx,並將其存儲在與上次文檔相同的位置。然後,一旦它設置爲引用您的CSV文件並保存,您就可以啓動Word,打開主文檔並執行合併,然後保存文件,然後離開。

我只是使用你的函數的修改版本,它將從提供的參數中創建CSV,打開合併文檔,執行合併,保存新文件,並關閉單詞。然後它會傳遞一個FileInfo對象,以便您可以使用它發送電子郵件或其他內容。

Function createWordDocument($fullname,$sam,$mailaddress,$Expiration) 
{ 
    [PSCustomObject]@{Name=$fullname;Username=$sam;Email=$mailaddress;Expiration=$Expiration}|Export-Csv "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\mailmerge.csv" -NoTypeInformation -Force 
    $word = New-Object -ComObject "Word.application" 

    $doc = $word.Documents.Open("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome3.dotx") 
    $doc.MailMerge.Execute() 
    $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\$fullname.docx" 
    ($word.documents | ?{$_.Name -Match "Letters1"}).SaveAs([ref]$file) 

    $Word.Quit() 

    [System.IO.FileInfo]$file 
} 
+0

這使我走上了正確的道路。我用郵件合併結束了,但遇到了一些困難。我將把我的最終代碼和一些評論放在另一篇文章中 – phoenix79

0

TheMadTechnician讓我走上了正軌,但我不得不做一些調整。以下是我結束了:

Function createWordDocument($fullname) 
{ 
    $word = New-Object -ComObject "Word.application"   
    $doc = $word.Documents.Add("C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\welcome_letter.docx")  
    $doc.MailMerge.Execute()  
    $file = "C:\Users\smiths\Documents\Powershell Scripts\webformCreateUsers\$fullname.docx" 
    ($word.documents | ?{$_.Name -Match "Letters1"}).SaveAs([ref]$file) 
    $quitFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveOptions],"wdDoNotSaveChanges") 
    $Word.Quit([ref]$quitformat)   
} 

相反傳遞函數的自變量,我不得不主要功能爲我創造了mailmerge.csv文件,只是有Word模板連接到它。我仍然通過$全名,因爲這是我最後命名文件。最後兩個主要問題是,每次打開郵件合併文檔文件時,Word都會詢問您是否要收回源數據。這意味着當Powershell試圖打開它時,Word正在等待交互,然後PS在它認爲完成時會關閉它。當然,這意味着什麼都沒有完成。我發現有一個註冊表項必須創建才能使Word跳過SQL安全性檢查。爲了後代的緣故,您必須在這裏創建一個密鑰: HKEY \ Software \ Microsoft \ Office \ 14.0 \ Word \ Options \稱爲SQLSecurityCheck,DWORD值爲0。這允許Word正確打開模板並操作文件。我遇到的最後一個麻煩是Word想要在每次運行時重新保存原始文件,並且會打開一個對話框打開,這會讓Word打開並保存在內存中。最後2行強制單詞關閉而不保存。

相關問題