簡體   English   中英

腳本中的Power Shell自定義功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM