簡體   English   中英

如何在PowerShell中沒有任何預定義路徑的情況下讀取文件輸入?

[英]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_Variableshelp 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM