2016-04-22 7 views
3

関連するデータをグループ化して扱うのに非常に便利なPowerShellのクラスを使用しようとしています動作。単純化されたシナリオ:クラスを定義する1つのPSスクリプトとそのクラスを使用する別のスクリプト。PowerShell 5とクラス - "X"タイプの "X"値を "X"タイプに変換できません

Common.ps1

class X 
{ 
    [string] $A 
} 

Script1.ps1

. $PSScriptRoot\Common.ps1 

[X] $v = New-Object X 

すべてが良いです - あなたは問題なく回のScript1.ps1任意の量を実行することができます - あなたまでany e in Common.ps1。次のエラーが発生します。

 
Cannot convert the "X" value of type "X" to type "X". 
At D:\temp\PSIssue\Script1.ps1:3 char:1 
+ [X] $v = New-Object X 
+ ~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : MetadataError: (:) [], ArgumentTransformationMetadataException 
    + FullyQualifiedErrorId : RuntimeException 

そのタイプXはそれがために使用Xよりも異なってくるので、おそらくPSファイル内(あなただけ空白文字を追加しても)任意の変更は、その再コンパイルを強制する - 一時的な容器アセンブリが変更された(非常に同じ.NETで簡単に再現可能な問題 - "完全修飾アセンブリ名"が同じである限り、型は同じです)。 Script1.ps1で変更すると、正常に機能します。

このような問題を解決する方法はありますか?

+3

はい、同じ実行空間/セッション/のAppDomainにX ' 'の二つの異なる実装を使用していない(つまり、 。exit 'powershell、re-launch) –

+0

@ MathiasR.Jessen、PowerShell ISEには、すべてをリロード/再コンパイルする方法はありますか?私は現在、完全に閉じていて、最初から開いています... –

+0

エラーを無視して2回目にスクリプトを実行するとエラーが発生せず、再度実行された場合、更新されたクラスが取得されます。細かいテストのためには問題ありません。 – Matt

答えて

2

問題を複製して解決できました。スコープ内でクラスを定義し、同じスコープ内で別のクラスを定義しようとする場合と似ています。クラス定義はPowerShellセッションで保持されます。 Script1.ps1では、変数を明示的に宣言しないようにコードを変更する必要があります。

. $PSScriptRoot\Common.ps1 

$v = New-Object X 

今、あなたは、あなたのように何度でもCommon.ps1のクラスXの定義を変更することができるはずです。ただ、強い型付けを使用して、PowerShellがタイプを決定し、それを動的に割り当てることはできませに以下のように使用します閉鎖してリロードする必要なしにしたい。

の例では、上記のあなたがここにこのおよびその他の詳細についての詳細を読むことができる「弱い型付け」を使用しています:Variable Types and Strongly Typing

+1

これは、 'Remove-Variable v'だけでなく、 – Matt

+0

も削除することができるということよりも真実であれば、PowerShellとして厳密に型指定された変数を扱うことはできません。私は確かにそれを試み、元の質問と同じ結果を観察した。あなたが解決するには、私がこの例で示したように弱く型付けされた変数を使う必要があります。 –

+0

@AmanSharma、提案をありがとう、それは間違いなく動作しますが、私は明示的な型が非常にスクリプトの開発に便利だと思います - それはどちらかをクリアし、IDEが自動補完でより良い仕事をすることができます... –

関連する問題