2017-09-18 16 views
1

PowerShellでの関数の動作を知りません。私はC++やC#のように少し試しましたが、7年前に最後に試した言語です。Powershell関数の戻り値とそれに続くreturndの使用変数

私は関数を操作しようとするので、私はその後ロードされますが、すぐに私は外の変数$場所をロードしようとされたCSVファイルの場所を決定するのはこの機能

function whichcsv(){ 
    $location = New-Object System.Windows.Forms.OpenFileDialog 
    $location.initialDirectory = $initialDirectory 
    $location.filter = "CSV (*.csv)| *.csv" 
    $location.ShowDialog() 
    write-host $location.FileName "in Function"  
} 

を持っていますNULLを機能させます。

書き込みホスト文には、ファイルの絶対パスがあります。

とすぐに私はそのザイン伯領そのNULLとして右のコードも文句を言わない仕事の後functiunの外にそれをロードしようとして

... 
    #Select which CSV 
    whichcsv 
... 
    $CSV = Import-Csv -Path $location.FileName -UseCulture 
    $y = $CSV | Select Inventarnummer 
    $Filter = "Inventarnummer" 

私はC言語のようにint型メイン(無効)に自分のコードを設定しようとしました - 言語は、しかし、私はこれを処理する方法だけでなく、それが同じスコープにあったので、それはうまくいくはずでしたが、どういうわけかそれは私がコンソールプロンプトですべて取得するように動作しますが、何も起こらないでしょう

フルコード for repro

#Importend: 
#This is Work in Progress and not complited work. 

Add-Type -AssemblyName System.Windows.Forms 
Add-Type -AssemblyName System.Drawing 

#Function Assembling 

Function SaveWorkingdestination() 
{ 
    $Saveworking = New-Object -Typename System.Windows.Forms.SaveFileDialog 
    $Saveworking.filter = "CSV (*.csv)| *.csv" 
    $Saveworking.ShowDialog() 

    return $Saveworking 
} 

function Savefaileddestination() 
{ 
    $Savefailed = New-Object -Typename System.Windows.Forms.SaveFileDialog 
    $Savefailed.filter = "CSV (*.csv)| *.csv" 
    $Savefailed.ShowDialog() 

    return $Savefailed 
} 


function Compare ($location) 
{ 
    #work in progress 
    $CSV1 = Import-Csv -Path $location.FileName -UseCulture 
    $CSV2 = Import-Csv -Path $location.FileName -UseCulture 
    Compare-Object $CSV1 $CSV2 -property WhichColumn -IncludeEqual 

    return comparedfilename 

} 


function whichcsv(){ 

    $location = New-Object System.Windows.Forms.OpenFileDialog 
    $location.initialDirectory = $initialDirectory 
    $location.filter = "CSV (*.csv)| *.csv" 
    $location.ShowDialog() 
    write-host $location.FileName "in Funktion" 

} 

function Checktrough ($y , $Filter,$Saveworking,$Savefailed) 
{ 
    foreach($n in $y) 
    { 
     try { 
      $Computer = [system.net.dns]::resolve($n.$Filter) | Select HostName,AddressList 
      $IP = ($Computer.AddressList).IPAddressToString 
      Write-Host $n.$Filter $IP 
      New-Object PSObject -Property @{IPAddress=$IP; Name=$n.$Filter} | Export-Csv $Saveworking.FileName -NoTypeInformation -Append 
     } catch { 
      Write-Host "$($n.$Filter) is unreachable." 
      New-Object PSObject -Property @{Name=$n.$Filter} | Export-Csv $Savefailed.FileName -NoTypeInformation -Append 
     } 
    } 
} 

#int main (void) #doesnt working so far 
#{ 

    #Select which option Form 

    $form = New-Object System.Windows.Forms.Form 
    $form.Text = "CSV Liste" 
    $form.Size = New-Object System.Drawing.Size(300,300) 
    $form.StartPosition = "CenterScreen" 

    $OKButton = New-Object System.Windows.Forms.Button 
    $OKButton.Location = New-Object System.Drawing.Point(75,195) 
    $OKButton.Size = New-Object System.Drawing.Size(75,23) 
    $OKButton.Text = "OK" 
    $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK 
    $form.AcceptButton = $OKButton 
    $form.Controls.Add($OKButton) 

    $CancelButton = New-Object System.Windows.Forms.Button 
    $CancelButton.Location = New-Object System.Drawing.Point(150,195) 
    $CancelButton.Size = New-Object System.Drawing.Size(75,23) 
    $CancelButton.Text = "Cancel" 
    $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel 
    $form.CancelButton = $CancelButton 
    $form.Controls.Add($CancelButton) 

    $label = New-Object System.Windows.Forms.Label 
    $label.Location = New-Object System.Drawing.Point(10,20) 
    $label.Size = New-Object System.Drawing.Size(280,20) 
    $label.Text = "Welche CSV Liste soll geladen werden:" 
    $form.Controls.Add($label) 

    $listBox = New-Object System.Windows.Forms.ListBox 
    $listBox.Location = New-Object System.Drawing.Point(10,40) 
    $listBox.Size = New-Object System.Drawing.Size(260,20) 
    $listBox.Height = 150 

    [void] $listBox.Items.Add("AS400 Computer") 
    [void] $listBox.Items.Add("AS400 Personalstamm") 
    [void] $listBox.Items.Add("ADComputer") 
    [void] $listBox.Items.Add("ADBenutzer") 

    #Formclosed 

    $form.Controls.Add($listBox) 

    $form.Topmost = $True 

    $result = $form.ShowDialog() 


    if ($result -eq [System.Windows.Forms.DialogResult]::OK) 
    { 

     #Select which CSV 
     whichcsv 

     $x = $listBox.SelectedItem 

     switch ($x) 
     { 
      #Option 1 
      "AS400 Computer" 
      { 
       $CSV = Import-Csv -Path $location.FileName -UseCulture 
       $y = $CSV | Select Inventarnummer 
       $Filter = "Inventarnummer" 
       #SaveWorkingdestination($Saveworking) 
       #Export-Csv $Saveworking.FileName -NoTypeInformation -Append 
      } 

      #Option 2 
      "AS400 Personalstamm" 
      { 
       #not implemented yet 
       $y = $CSV | Select SpaltennameBzwFilter 
       $Filter = "Spaltennamme bzw Filter" 
      } 

      #Option 3 
      "ADComputer" 
      { 
       $CSV = Import-Csv -Path $location.FileName -Delimiter ',' 
       $y = $CSV | Select Name 
       $Filter = "Name" 
       SaveWorkingdestination 
       Savefaileddestination 
       Checktrough 
      } 

      #Option 4 
      "ADBenutzer" 
      { 
       #not implemented yet 
       $y = $CSV | Select SpaltennameBzwFilter 
       $Filter = "Spaltenname bzw Filter" 
      } 
     } 
    } 
#} 

誰かが、共通言語をC言語のint main(void)のようなもので取得する方法や、関数から適切な復帰を得る方法を知っているかもしれません...もしまだ不確かさがあればこれにはっきりと答えて編集してください。

編集:スクリプト部分でこれまでは完全にうまくいきましたが、今ではそれに構造の問題があります。またはそれはあなたが

int main (void) 
{ 
    ... 
    code 
    ... 
} 

答えて

3

:機能外の変数を使用できるようにするような何かを行う関数本体に割り当てられたよう

function whichcsv(){ 
    $location = New-Object System.Windows.Forms.OpenFileDialog 
    $location.initialDirectory = $initialDirectory 
    $location.filter = "CSV (*.csv)| *.csv" 
    $location.ShowDialog() 
    write-host $location.FileName "in Function"  
} 

$location

は、関数のスコープに ローカルです。 PowerShellでは を親スコープの変数と読むことができますが、変数に書き込むと、呼び出し元のスコープに保持されずに、デフォルトでローカルコピーが作成されます。

returnあなたがしたいことは、Cのような言語と同じように、範囲からの価値です。

PowerShellの注意点はなり「バブルアップ」の発信者、ないreturnにだけ引数には何も出力関数本体内部のその任意の値式です。

$CsvPath = whichcsv 

$CsvPathは現在の値が含まれます:呼び出し元のスコープで次に

function whichcsv(){ 
    $location = New-Object System.Windows.Forms.OpenFileDialog 
    $location.initialDirectory = $initialDirectory 
    $location.filter = "CSV (*.csv)| *.csv" 
    [void]$location.ShowDialog() # <-- ShowDialog() returns a DialogResult, suppress it 
    return $location.FileName # return the filename property value  
} 

:あなたは、任意の値を返す関数本体内のステートメントを持っているのであれば、あなたはその出力をキャプチャまたは抑制を確認してください$location.Filename機能はPowerShellで変数のスコープの詳細については


を返した後、about_Scopes help topicを参照してください returnの動作の詳細については、あなたがメインプログラムにオブジェクトを返す必要がpipelines

+0

ええ、PowerShellのスコープとはちょっと混乱しています。まずそれについて知りませんし、C言語などのように処理しようとすると... powershellからのスコープの簡単な説明がありますか?もし質問があまりないのであれば、C言語のようにまとめてint main(void){} – Kevin

+0

@Kevin Yeah、同様の構文を持つ基本的に異なるプログラミング環境に飛び込むことはかなり混乱する可能性があります:-) Look私のコード(2番目のブロック)の例では、 '[void](ここの文や式)'は出力を抑止する簡単な方法です。スコープについては、[ドキュメント](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes)を参照してください。 –

+0

それは素晴らしいdocuと私は私が手掛かりを持ってcompletlyまだ1つのstructre質問が開いているまで、それはC言語のようなスクリプトでラップアップされている場合は開いているか、コードは "ハングフリー"、私は間違っていないと、これはスコープを右にシフトさせるでしょうか?だから今では無料のコードがローカルにあるかどうかは、それは関数のような "同じ範囲"になるか、私はここで間違っていますか? – Kevin

0

でC言語で持っているようにあなたは、変数を使用することができるスコープレベルを変更するために$scriptを使用する必要がありPowerShellのスクリプトの中で周囲にラップを持っていないのが一般的です。あなたの例では

function whichcsv(){ 
    $location = New-Object System.Windows.Forms.OpenFileDialog 
    $location.initialDirectory = $initialDirectory 
    $location.filter = "CSV (*.csv)| *.csv" 
    $location.ShowDialog() 
    $script:locationfilename = $location.FileName 
} 

write-host "$($locationfilename) in Function" 
+0

OK、これがうまくいくには、私は$スクリプトを短くすることができ、ありがとうございましたか! – Kevin

+0

これはうまくいきます...あなたの好きなものを、あなたの変数の前に 'スクリプト 'を投げて使うことができます。 – ShanayL

0

に見て、最初の場所でこの動作のための理由の詳細についてはabout_Return help topic
を参照してください。 FNP = $ location.filename:$スクリプトのようなものにlocationfilename = $ location.filename:

function whichcsv(){ 

$location = New-Object System.Windows.Forms.OpenFileDialog 
$location.initialDirectory = $initialDirectory 
$location.filter = "CSV (*.csv)| *.csv" 
$location.ShowDialog() 
return $location.FileName 

} 

$path= whichcsv 
write-host $path 
関連する問題