2017-03-29 28 views
2

私はpowershellと開発一般には初めてです。私は、ファイルが特定のサイズを超えると連絡先にメールを送るスクリプトを書こうとしています。私は別々に働く(ファイルサイズを調べるためのものとsendmail用のファイルを生成するもの)の2つの個別の機能を持っていますが、それらを相互作用させることはできません。Powershell関数から別のPowershell関数にパラメータを渡す

CheckSize関数を実行し、変数$ ExceedsSizeが1に設定されている場合は、関数SendMailを呼び出します。そうでない場合、スクリプトは他のアクションなしで終了します。

私はフォーラムを検索しましたが、私がしていることには何も適用できませんでした。

##Check file to see if it is over a particular size and then send email once threshold is reached. 

param( 
    [string]$SiteName = "TestSite",             #Name of Site (No Spaces) 
    [string]$Path = "\\NetworkPath\Directory",          #Path of directory to check 
    [int]$FileSizeThreshold = 10,             #Size in MB that will trigger a notification email 
    [string]$Contacts = "[email protected]" 
    )  

CLS 

##Creates variable $ExceedsSize based on newest file in folder. 
Function CheckSize { 
IF ((GCI $Path -Filter *.txt | Sort LastWriteTime -Descending | Select-Object -first 1 | Measure-Object -property Length -sum).sum/1000000 -gt $FileSizeThreshold) {$ExceedsSize = 1} 
ELSE {$ExceedsSize = 0} 

Write-Host $ExceedsSize 
} 


Function SendMail { 
    Param([string]$Template, [string]$Contacts, [string]$WarnTime) 

    $EmailLocation = "\\NetworkPath\Scripts\File_$SiteName.txt" 

    #Will Generate email from params 
     New-Item $EmailLocation -type file -force -value "From: [email protected]`r 
To: $Contacts`r 
Subject: $SiteName file has exceeded the maximum file size threshold of $FileSizeThreshold MB`r`n" 

    #Send Email 
    #CMD /C "$SendMail\sendmail.exe -t < $EmailLocation" 

    } 

答えて

2

あなたWrite-Host $ExceedsSize前か後にこれを追加します。

return $ExceedsSize 

が下にこれを追加します。

$var = CheckSize 

if ($var -eq 1){ 
    SendMail 
} 

説明
は、次の2つの機能を持っていますが、実際にはしないでくださいそれらを実行します。下の部分がそうです。
CheckSize関数は残りの関数に対して$ExceedsSizeを返しません。デフォルトでは、関数のスコープ内にとどまります。 return xは、変数がメインスクリプトに戻されることを意味します。 $var =は、その変数に割り当てられていることを意味します。

+0

を、私は完全に書き込み、ホスト$ ExceedsSizeを取り除き、 Return $ ExceedsSizeに置き換えられました。その後、あなたのIFをボトムに追加することは、完璧な意味合いを作り、私が望むように動作します。関数の出力に変数を代入することは私には起こりませんでした。 – PerfectPearl

+0

すごくうれしいですね。もう一つの答えとして、もう一つのアプローチは 'CheckSize'の中から' SendMail'を呼び出すことです。一般的には悪い習慣では避けなければならない別の方法は、可変グローバルスコープを割り当てることです: '$ global:ExceedsSize'そして' SendMail'内の '$ ExceedsSize'の値をチェックします。 [about_scopes](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_scopes)は読む価値があります。 – gms0ulman

1

Write-Hostの代わりにreturn $ExceedsSizeにする必要があります(Write-Hostが有害であると考えられる理由はこちらを参照してください:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/)。

あなたが代わりに例えば、CheckSize関数内から SendMail関数を呼び出すことができ

if ($ExceedsSize -eq 1){SendMail} 

あなたはまだどこかにもCheckSize関数を呼び出す必要があります:

CheckSize 

あなたがまたしたい場合があります組み込みコマンドレットの動詞名詞スタイルで関数の名前を付けることを検討してください。これは本当にあなたや他の人にもっと明示的に使用させるのに役立ちます。動詞を選択するときは、承認リストに従うのが最善です。https://msdn.microsoft.com/en-us/library/ms714428(v=vs.85).aspx

また、競合の可能性を避けるために、かなりユニークな名前を使用することもできます。

私はの線に沿って何かをお勧めしたい:

Get-NewestFileSize 

(それはそれは、その後返すべきだが)

Send-CCSMail 
+1

私は管理者からヘルプデスクからL2サポートに移り、開発者として終わった。私は今かなり長い間、その道を切り開いてきました。動詞名詞の命名規則は多くの意味を持ちます。 – PerfectPearl

関連する問題