[英]Power shell custom function in script
我已經准備了一個腳本來提取一些帶有SQL Server的報表,並且輸出將被推送到不同的CSV表。 生成輸出后,所有CSV都將通過自定義創建的功能合並到單個Excel文件中,並且該excel將會發送到我的電子郵件地址。
在運行htrough powershell_ise.exe時,它運行良好,並且我已成功收到電子郵件。 當我安排相同的腳本時,我收到的是電子郵件,但沒有excel附件。 我懷疑未使用自定義創建的函數,因為在所需位置看不到任何已轉換的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()
}
通過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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.