2013-10-07 17 views
2

我有一個腳本,用於將用戶的Exchange郵箱遷移到.pst文件中。這個想法是,我會有一個CSV文件,我可以將用戶的姓名放在上面,然後當腳本每晚啓動時,它會打開CSV文件並查找已添加的用戶,對這些用戶帳戶執行請求的操作(導出,移動設置權限等),然後回寫到CSV文件標記這些用戶已完成,並寫入完成日期。這是我到目前爲止。在Powershell中修改現有的CSV文件

$InPstPath = '\\server1\PST_Store\' 
$OutPstPath = '\\server2\PST_Store\' 
$User = Get-Content $OutPstPath'login.txt' 
$PWord = cat $OutPstPath'pass.txt' | convertto-securestring 
$Credentials = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $User, $PWord 
$PSSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://Server1/powershell -Credential $Credentials 
Import-PSSession $PSSession 
$In_List = Invoke-Command {Import-Csv "\\Server1\PST_Store\Admin\To_Be_Exported.csv"} -computername Server1 -Credential $Credentials 
foreach ($objUser in $In_List) { 
    if ($objUser.Completed -ne "Yes") { 
     $TargetUser = $objUser.name 
     $ShortDate = (Get-Date).toshortdatestring() 
     New-MailboxExportRequest -Mailbox $TargetUser -Filepath "$InPstPath$TargetUser.pst" 
     $objUser.Completed = "Yes" 
     $objUser.Date = $ShortDate 
     } 
    } 
Remove-PSSession -Session (Get-PSSession) 

我想不出寫回$ objUser.Completed一個體面的方式和$ objUser.Date值到CSV。

+0

是否有一個Export-Csv函數鏡像您使用的Import-Csv?有 – Edward

+0

有。我不確定我將如何使用它來僅針對需要改變的值。我發現這個命令的大部分內容似乎都像'Out-File C:\ filename.csv | ConvertTo-Csv' –

+0

我猜你需要用新內容覆蓋整個文件。您需要測試並確保您只獲得您所做的更改,但對我來說這似乎是一個合理的方法。 – Edward

回答

2

首先,很明顯,但讓我說出來。第一次運行這個腳本時,$ objUser.name,$ objUser.Completed和$ objUser.Date將不存在;因此,行

$TargetUser=$objUser.name 

將無法​​正常工作,除非你確實有在CSV到位的結構(即有頭名,完成日期)。

現在假設你已經完成了這個部分,你所要做的就是創建一個對象來捕獲對象中的狀態,然後再寫回來。

$Processed = foreach ($objUser in $In_List) { 
    if ($objUser.Completed -ne "Yes") { 
     $TargetUser = $objUser.name 
     $ShortDate = (Get-Date).toshortdatestring() 
     New-MailboxExportRequest -Mailbox $TargetUser -Filepath "$InPstPath$TargetUser.pst" 

     [PSCustomObject]@{Name=$objUser.name;Completed="Yes";Date=$ShortDate} 
     } 
    } else { 
     [PSCustomObject]@{Name=$objUser.name;Completed="No";Date=$null} 
    } 
## export to a temp file 
$Processed | export-csv -Path $env:TEMP\processed.csv 
## You should probably check to see if original file was modified since you started working on it 
# and copy over if not 
Copy-Item $env:TEMP\processed.csv $OutPstPath'login.txt' -force 
+0

初始CSV確實具有所需的標題。如果我將數據寫入新的CSV文件,我需要注意重新創建頭文件,雖然也許您建議的方法是這樣做的。 這當然是朝着正確的方向邁出的一步,明天我會試一試。我認爲else語句應該是... [PSCustomObject] @ {Name = $ objUser.name; Completed = objUser.Completed; Date = objUser.Date} 就好像它失敗了-ne「Yes」,那麼用戶的帳戶已被處理。我對此很新,但我可能會誤解它。 –

+0

是的,export-csv會創建一個csv對象,您以後可以再次導入它。你當然可以使用「是」,「否」,因爲你喜歡Completed,但也可以簡單地使用布爾$ true,$ false,因爲它符合你的目的就好。除非明確指定,否則布爾變量將爲$ false,您可以使用它來獲得優勢。 if($ Completed){「stuff if true」} else else {「stuff if if」} –

+0

經過一定量的混淆後,我得到了這個使用你的處方解決方案。謝謝! (我會投票,但顯然我沒有足夠的聲望來這樣做:P) –