2017-06-06 55 views
1

我嘗試一些PST文件自動導入到Outlook另一個文件夾,我目前使用下面的腳本如何有PowerShell中使用一個else語句搜索

Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null 
$outlook = new-object -comobject outlook.application 
$namespace = $outlook.GetNameSpace("MAPI") 
dir 「$env:USERPROFILE\appdata\local\microsoft\outlook\.pst」 | % { 
$namespace.AddStore($_.FullName) } 

我想補充一個else語句,以便如果在第一個位置找不到pst文件,那麼它將檢查「$ env:USERPROFILE \ Documents \ Outlook Files」

+2

你的意思是「* .pst」而不是「dir」命令中的「.pst」? –

+0

''''和'''也可能導致問題(與您的路徑一致)。使用''',就像在你的第一行一樣 – gms0ulman

回答

2

對於單個文件,使用Test-Path來驗證文件是否在您期望的位置,例如:

$pathA = "C:\path\to\my\file" 
$pathB = "C:\path\to\another\file" 

if(Test-Path $pathA){ 
    # do something with $pathA 
} 
else { 
    # do something with $pathB 
} 

在你的情況下,你正在使用dirGet-ChildItem的別名),它返回與指定的路徑/名稱匹配的文件夾中的所有文件。你可能想要做的就是去尋找文件先在PathA,如果你沒有找到任何,看在PathB:

$pathA = "C:\path\to\my\folder\*.pst" 
$pathB = "C:\path\to\another\folder\*.pst" 

$files = Get-ChildItem $pathA 

if($files){ 
    # do something with $pathA 
} 
else { 
    # do something with $pathB 
} 
+0

非常感謝你Charlie! –

0

對於任何人好奇這是我的新最終腳本

$pathA = 「$env:USERPROFILE\AppData\Local\Microsoft\*.pst」 
    $pathB = 「$env:USERPROFILE\Documents\Outlook Files\*.pst」 

    $files = Get-ChildItem $pathA 

    Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null 
    $outlook = new-object -comobject outlook.application 
    $namespace = $outlook.GetNameSpace("MAPI") 

    if($files){ 
    dir 「$env:USERPROFILE\AppData\Local\Microsoft\*.pst」 | % {         
    $namespace.AddStore($_.FullName) } 
    } 
    else { 
    dir 「$env:USERPROFILE\Documents\Outlook Files\*.pst」 | % {       
    $namespace.AddStore($_.FullName) } 
    } 

再次感謝查理,這是一個很大的幫助!

+0

你可以在if(){...} else {...}塊中移動前3個相同的代碼行到'if'語句開始之前,因爲你將會運行這3行代碼,這是一個好的做法,保持代碼重複到最小值 –

+0

是否正確? –

+0

是的,這對我來說很合適。找到儘可能多的不同的方式來編寫代碼來做你想要的程序員所需要的東西,但我會說大多數人會同意在邏輯分支時減少重複的代碼行。 –