2017-01-10 7 views
0

私は-InputFileの引数として入力txtファイルを提供していますが、これは$inputfileとして保存しています。しかし、私はしようとすると:\ WINDOWS \ system32に:PowerShellで事前定義されたパスを使用せずにファイル入力を読み取るにはどうすればよいですか?

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

PowerShellは自動的にCへの$inputfileのパスを追加します。 PowerShellにパスプレフィックスを仮定させないようにするにはどうすればいいですか?ユーザーは、希望するファイルがスクリプトを実行するのと同じディレクトリにある場合、単に-InputFile inputfile.txtを渡すことができますか?現在のディレクトリの外にC:\ Windows \ system32に自動的に追加せずにファイルが完全に異なるパスを列挙する方法をサポートするにはどうしたらいいですか?

EDIT:あなたのアドバイスごとに変数 "$ input"を "$ inputfile"に変更しました。

答えて

1

使用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 
+1

Resolve-Pathを参考に私の答えを削除しました。しかし、予期せぬ結果を得るのを避けるために、OPが解像度を確認する手順を取ることをお勧めします。 –

+0

真。それに応じて私の答えを更新。 –

0

まず、$inputを変数名として使用しないでください。それは上書きされるか、予期しない結果が生じる可能性があるので、automatic variableです。

第2に、現在のディレクトリがC:\Windows\System32ではないことを確認してください。作業ディレクトリは、スクリプトがあるパスである必要はありません(しばしばそうではありません)。

作業ディレクトリの代わりにスクリプトディレクトリを常に使用する場合は、パスが相対パスである場合にのみ、コードを確認してください($input変数を$Path):あなたはOpenText()に渡すとき/前にパスを解決するための

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を参照してください。 (あなたは、あなたがその変数を適切に使用しているかどうかを知るのに十分なコンテキストを私に与えることはできません)。

第2に、.NETオブジェクトはPowerShellと同じ作業場所を想定していません。 PowerShellにはファイルシステムドライブ以外の「ドライブ」があるため、実行できません。

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

コマンドレットは作業場所を使用します。ファイルシステムにアクセスしている場合は、次のように入力します。

0

まず、他の人の言いたことを言います。つまり、それは自動変数なので$Inputを変数名として使用しないでください。

これ以外にも、私はあなたに代案を提供したいと思います。個人的には、人々が入力ファイルを指定したいときにOpen Fileダイアログボックスを開く機能があります。

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 

ような何かを行うことができます。

関連する問題