[英]How can I read file input without any pre-defined path in PowerShell?
我有用戶提供輸入txt文件作為參數-InputFile
,我將其存儲為$inputfile
。 但是當我嘗試:
$reader = [System.IO.File]::OpenText("$inputfile")
PowerShell自動將$inputfile
路徑附加到C:\\ Windows \\ system32。 如何讓PowerShell不假定路徑前綴,所以如果用戶-InputFile inputfile.txt
的文件位於運行腳本的目錄中,則用戶可以簡單地傳遞-InputFile inputfile.txt
? 如果文件不在當前目錄中,而又沒有自動附加到C:\\ Windows \\ system32,我又如何支持他們枚舉該文件的完全不同的路徑?
編輯:根據您的建議將變量“ $ input”更改為“ $ inputfile”。
首先:請注意, $input
是PowerShell中的特殊變量。 有關更多信息,請參見help about_Automatic_Variables
的help about_Automatic_Variables
。 (您在問題中沒有放置足夠的上下文,無法讓我知道您是否正確使用了該變量。)
其次,.NET對象與PowerShell的工作位置不同。 它們不能,因為PowerShell具有文件系統驅動器以外的“驅動器”。 如果您確定自己在文件系統中,則可以使用以下內容:
$fullPath = Join-Path (Get-Location).Path $inputFilenameFromUser
Cmdlet將使用工作位置。
在將路徑傳遞給OpenText()
之前/之時,請使用Resolve-Path
解析路徑:
$reader = [IO.File]::OpenText((Resolve-Path $InputFile).Path)
由於Resolve-Path
在無法解析路徑時會引發異常,因此您可能需要在try..catch
塊中運行它,例如:
try {
$path = (Resolve-Path $InputFile).Path
$reader = [IO.File]::OpenText($path)
} catch [Management.Automation.ItemNotFoundException] {
# cannot resolve path
} catch {
# other error
}
或者更好的是,驗證參數:
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[ValidateScript({Test-Path -LiteralPath $_ -Type Leaf})]
[string]$InputFile
首先,不要使用$input
作為變量名; 這是一個自動變量,因此可能會被覆蓋或產生意外結果。
其次,您確定“當前”目錄不是C:\\Windows\\System32
嗎? 工作目錄不一定是(通常不是)腳本所在的路徑。
如果您希望它始終使用腳本目錄而不是工作目錄,但是僅當路徑是相對路徑時,則必須進行一些編碼以確保(請注意,我將$input
變量替換$input
一個名為$Path
變量) :
if (($Path | Split-Path -IsAbsolute)) {
$reader = [System.IO.File]::OpenText($Path)
} else {
$myPath = $PSScriptRoot | Join-Path -ChildPath $Path
$reader = [System.IO.File]::OpenText($myPath)
}
首先,我想說一下其他人說的話:不要使用$Input
作為變量名,因為那是一個自動變量。
除此之外,我想為您提供其他選擇。 我個人希望保留一個函數,當我希望人們指定輸入文件時,該函數會彈出“打開文件”對話框。
Function Get-FilePath{
[CmdletBinding()]
Param(
[String]$Filter = "All Files (*.*)|*.*|Comma Seperated Values (*.csv)|*.csv|Text Files (*.txt)|*.txt",
[String]$InitialDirectory = "C:\",
[String]$Title)
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $InitialDirectory
$OpenFileDialog.filter = $Filter
$OpenFileDialog.Title = $Title
[void]$OpenFileDialog.ShowDialog()
$OpenFileDialog.filename
}
然后你可以做一些類似的事情
$InputFilePath = Get-FilePath
這將為您提供文件的完整路徑(字符串)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.