2017-07-17 8 views
0

レポートw.r.t SQLサーバーをプルするスクリプトを用意していましたが、出力は別のCSVシートにプッシュされます。出力が生成された後、カスタム作成された関数の助けを借りて、すべてのCSVが単一のExcelファイルにマージされ、Excelは自分の電子メールアドレスに送信されます。スクリプトのパワーシェルのカスタム機能

htrough powershell_ise.exeを実行している間、正常に動作しており、正常にメールを受信して​​います。私は同じスクリプトをスケジュールしたとき、私は電子メールを受信して​​いますが、外付けの添付ファイルはありません。私は、カスタムの作成された関数が使用されていないと思っています。変換されたExcelファイルが必要な場所に表示されないためです。

ドットソーシングのように、スクリプト自体に機能を貼り付けてみましたが、運はありませんでした。

私はpowershellの初心者です。もし私が何かを逃しているなら、私は何か助けてください。

おかげで、 アニル

Function Merge-CSVFiles 
{ 
Param(
$CSVPath = "D:\Anil\Missing_Indexes", ## Soruce CSV Folder 
$XLOutput="D:\Anil\Missing_Indexes.xls" ## Output file name 
) 

$csvFiles = Get-ChildItem ("$CSVPath\*") -Include *.csv 
$Excel = New-Object -ComObject excel.application 
$Excel.visible = $false 
$Excel.sheetsInNewWorkbook = $csvFiles.Count 
$workbooks = $excel.Workbooks.Add() 
$CSVSheet = 1 

Foreach ($CSV in $Csvfiles) 

{ 
$worksheets = $workbooks.worksheets 
$CSVFullPath = $CSV.FullName 
$SheetName = ($CSV.name -split "\.")[0] 
$worksheet = $worksheets.Item($CSVSheet) 
$worksheet.Name = $SheetName 
$TxtConnector = ("TEXT;" + $CSVFullPath) 
$CellRef = $worksheet.Range("A1") 
$Connector = $worksheet.QueryTables.add($TxtConnector,$CellRef) 
$worksheet.QueryTables.item($Connector.name).TextFileCommaDelimiter = $True 
$worksheet.QueryTables.item($Connector.name).TextFileParseType = 1 
$worksheet.QueryTables.item($Connector.name).Refresh() 
$worksheet.QueryTables.item($Connector.name).delete() 
$worksheet.UsedRange.EntireColumn.AutoFit() 
$CSVSheet++ 

} 

$workbooks.SaveAs($XLOutput,51) 
$workbooks.Saved = $true 
$workbooks.Close() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbooks) | Out-Null 
$excel.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null 
[System.GC]::Collect() 
[System.GC]::WaitForPendingFinalizers() 

} 
+2

Excelと対話する機能と、スケジュールされたタスクをどのように設定したか(どのアカウントが実行されているか、どの設定がタスクにあるかなど)詳細については、 –

+2

@ MathiasR.Jessenは言った。しかし、私はあなたの機能がスクリプトで定義される前に単純に参照されていると思う。関数が参照される前に、関数がスコープで定義されていることを確認してください。 –

+0

@JacobColvin悪い推測ではなく、古典的なpowershell_ise落とし穴です;-) –

答えて

0

powershell_ise.exeを走る、それがうまく実行されていて、私は成功し

あなたのボックスにISEがあるので、これは、電子メールを受信して​​いますがランタイム中にカスタム関数をロードしてレポートを生成することができます。

しかし、これがジョブによってスケジュールされている場合、スクリプトはボックスとは異なるサーバーで実行されるため、スクリプトは機能を見つけられず、レポートを取得しません。

カスタム関数を使用しているうちに、この種の問題に直面しました。

私が示唆できる回避策は、カスタム関数を別のモジュールにラップし、メインスクリプトにモジュールをインポートすることです。 (モジュールをスクリプトと同じ場所に保存して、トラブルシューティングを容易にすることをお勧めします)。

例:次のように .psm1モジュールファイルにあなたの関数を保存

Function ScriptExample { 
Param ([string] $script, 
     [string] $jobname, 
     [string] $jobcategory, 
     [hashtable] $config, 
     [string] $deletelogfilepath, 
     [string] $servername) 



#your-function-here# 
{ 
    } 

Return $script; 

}

今、あなたはそれから呼び出すことができます

$importmoduleroot = "C:\temp\SO_Example.psm1" 

###### LOAD MODULES ###### 

# Import all related modules written to support this process 
$modules = get-childitem -path $importmoduleroot -include SO*.psm1 -recurse; 

、あなたのメインスクリプトでは、このモジュールを呼び出しますあなたの関数とメインスクリプト内のパラメータを渡す

ScriptExample -script $script ` 
      -jobname $jobname ` 
      -jobcategory $jobcategory ` 
      -config $config ` 
      -servername $ServerName ` 
      -deletelogfilepath $deletelogfilepath 
+0

@MK必要な変更を行った場合の詳細や、必要な場合の例を教えてください。 – user6849192

+0

MKステップありがとうございます。私はカスタム関数をモジュールとして作成し、スクリプト内でこれを呼びました。私は以下の例を完全に理解することができませんでした。この例を詳しく説明できますか – user6849192