2015-11-04 52 views
6

我正在寫一個PowerShell函數,對文件執行一些操作,文件的路徑作爲參數傳遞給函數。我是強類型和參數驗證的粉絲所以不是剛好路過一個System.String我定義的參數,像這樣的文件路徑:強類型檢查函數參數中聲明的不存在的文件

[Parameter(Mandatory=$true)] 
[ValidateNotNullOrEmpty()] 
[System.Management.Automation.PathInfo]$PathInfo 

通常我會用Resolve-Path調用代碼得到一個可以傳遞給此參數的System.Management.Automation.PathInfo類型的對象,但在這種情況下,文件尚不存在,因此Resolve-Path會引發錯誤。

是否可以爲一個不存在的文件實例化一個System.Management.Automation.PathInfo實例?如果是這樣,怎麼樣?如果沒有,你有建議,我可能會傳遞一個不存在的文件路徑到一個函數,仍然有強大的類型檢查。

+4

什麼'FileInfo'?一個'FileInfo'實例可以指向一個不存在的目錄/文件('$ pathInfo = New-Object IO.FileInfo C:\ non-existent.txt') –

+0

DOH!太容易了。謝謝你,先生。 – jamiet

+0

@jamiet你也可以直接在'FileInfo'對象上檢查文件是否存在:'([System.IO.FileInfo]「C:\ nonexist.ext」)存在' –

回答

2

雖然使用[System.IO.FileInfo]類型很可能是在這種情況下,最巧妙的解決方案(做某事的文件),如果你給一個文件夾一個路徑您可能會遇到問題,因爲.Exists回報在這種情況下,虛假。你想用[System.IO.DirectoryInfo]來代替...

想一下更一般的你可以使用驗證腳本,一個調用某種測試功能,例如以下應該允許參數是$null或有效的[System.Management.Automation.PathInfo]類型。

function Test-Parameter { 
    param($PathInfo) 

    if([System.String]::IsNullOrEmpty($PathInfo)) { 
    return $true 

    } elseif($PathInfo -is [System.Management.Automation.PathInfo]) { 
    return $true 

    } else { 
    return $false 
    } 
} 

然後使用這個[ValidateScript({...})]檢查參數符合那些(任意)條件:

function Do-Something { 
    param(
    [Parameter()] 
     [ValidateScript({Test-Parameter $_})] 
     $PathInfo 
) 

    .... 
}