2017-01-10 3 views
0

사용자가 -InputFile이라는 인수로 입력 txt 파일을 제공하고 $inputfile으로 저장합니다. 그러나 나는하려고하면PowerShell에서 미리 정의 된 경로없이 파일 입력을 읽으려면 어떻게해야합니까?

$reader = [System.IO.File]::OpenText("$inputfile") 

PowerShell을 자동으로 C에 $inputfile 경로를 추가합니다 : \ WINDOWS \ system32를 입력. PowerShell에서 경로 접두어를 사용하지 않도록하려면 어떻게해야합니까? 원하는 파일이 스크립트를 실행하는 디렉터리와 동일한 디렉터리에 있으면 사용자가 -InputFile inputfile.txt을 단순히 전달할 수 있습니까? C : \ Windows \ system32에 자동으로 추가하지 않고 현재 디렉토리 외부에있는 경우 파일과 완전히 다른 경로를 열거 할 수 있도록 어떻게 지원합니까?

EDIT : 귀하의 조언에 따라 "$ input"변수를 "$ inputfile"으로 변경했습니다.

답변

1

/전에 경로 문제를 해결하기 위해 사용 Resolve-PathOpenText()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 
+1

Resolve-Path에 따라 제 대답을 삭제했습니다. 그러나 OP는 예기치 않은 결과가 발생하지 않도록 해상도를 확인하는 단계를 수행하는 것이 좋습니다. –

+0

참. 그에 따라 내 대답이 업데이트되었습니다. –

0

먼저 변수 이름으로 $input을 사용하지 마십시오. 그것은 automatic variable이므로 덮어 쓸 수 있거나 예기치 않은 결과가 발생할 수 있습니다.

둘째, 현재 디렉토리가 C:\Windows\System32이 아닌지 확인하십시오. 작업 디렉토리는 스크립트가있는 경로 일 필요는 없으며 종종 그렇지 않습니다.

작업 디렉토리 대신 스크립트 디렉토리를 항상 사용하려면 경로가 상대 경로 인 경우에만 코드를 작성해야합니다 ($input 변수를 Resolve-Path 이후

$reader = [IO.File]::OpenText((Resolve-Path $InputFile).Path) 

예외 때 예외 : $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) 
} 
당신이 그것을 통과
2

첫째 : $input은 PowerShell의 특별한 변수가 있으니주의하시기 바랍니다. 자세한 내용은 help about_Automatic_Variables을 참조하십시오. (귀하가 해당 변수를 올바르게 사용하고 있는지 여부를 알기에 충분한 질문을하지 않아도됩니다.)

둘째, .NET 개체는 PowerShell과 동일한 작업 위치를 취하지 않습니다. PowerShell에는 파일 시스템 드라이브가 아닌 "드라이브"가 있기 때문에 사용할 수 없습니다. 파일 시스템에 있다고 확신하는 경우 다음과 같이 사용할 수 있습니다.

$fullPath = Join-Path (Get-Location).Path $inputFilenameFromUser 

Cmdlet은 작업 위치를 사용합니다.

0

먼저 다른 사람들이 말한 것보다 먼저 두 번째로 말씀 드리겠습니다. 자동 변수이기 때문에 $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 

뭔가를 할 수 있습니다.