【问题标题】:Powershell Code from Script Runs Within a PowerShell ISE Session - The Script myscript.ps1 does not run from PS>myscript.ps1 [duplicate]脚本中的 Powershell 代码在 PowerShell ISE 会话中运行 - 脚本 myscript.ps1 不会从 PS>myscript.ps1 运行 [重复]
【发布时间】:2022-02-09 07:11:52
【问题描述】:

当我通过 powershell.exe 启动 powershell 会话并在 PS> 提示符下输入 myscript.ps1 时,它会出错 - PS D:\TEST> D:\TEST\testrun.ps1

方法调用中缺少')'。

在 D:\TEST\testrun.ps1:1 char:65

  • $factory = [System.Data.Common.DbProviderFactories]::GetFactory(
  • CategoryInfo : ParserError: (CloseParenToken:TokenId) [], Parse 例外
  • FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

通过 CutNPaste 将代码行单独运行到 ISE 并启动时,它工作的原因是什么?当我通过 ISE 运行它时,我从数据库提取中收到带有漂亮表格的电子邮件。这个错误可能是它不能在 TaskScheduler 中运行的原因。


$factory = [System.Data.Common.DbProviderFactories]::GetFactory(“IBM.Data.DB2”)
$cstrbld = $factory.CreateConnectionStringBuilder()
$cstrbld.Database = 'dbname'
$cstrbld.UserID = 'USER'
$cstrbld.Password = 'password'
$cstrbld.Server = 'server:50001'
$dbconn = $factory.CreateConnection()
$dbconn.ConnectionString = $cstrbld.ConnectionString
$dbconn.Open()
$dbcmd = $factory.CreateCommand()
$dbcmd.Connection = $dbconn
########################################################################################################################################
$dbcmd.CommandText = 'SELECT PFIWORKUNIT,ACTOR,FLOWDEFINITION,WORKTITLE,STATUS FROM APPLICATION.PFIWORKUNIT WHERE STATUS BETWEEN 0 AND 3'
########################################################################################################################################

$dbcmd.CommandType = [System.Data.CommandType]::Text
$da = $factory.CreateDataAdapter()
$da.SelectCommand = $dbcmd
$ds = New-Object System.Data.DataSet
$da.Fill($ds) | Out-Null

$dbconn.Close()
 
     ForEach ($row in $ds.Tables[0].Rows) {

        $ExciterObject = New-Object PSObject
        $ExciterObject | Add-Member -MemberType NoteProperty -Name "PFIWORKUNIT" -Value $row.PFIWORKUNIT
        $ExciterObject | Add-Member -MemberType NoteProperty -Name "ACTOR" -Value $row.ACTOR 
        $ExciterObject | Add-Member -MemberType NoteProperty -Name "FLOWDEFINITION" -Value $row.FLOWDEFINITION 
        $ExciterObject | Add-Member -MemberType NoteProperty -Name "WORKTITLE" -Value $row.WORKTITLE 
        $ExciterObject | Add-Member -MemberType NoteProperty -Name "STATUS" -Value $row.STATUS
        $exportObject += $ExciterObject

        }

        
        function ConvertTo-HTMLTable ($obj) {
    # Accepts a System.Data.DataTable object or an array of PSObjects and converts to styled HTML table

    # add type needed to replace HTML special characters into entities
    Add-Type -AssemblyName System.Web

    $sb = New-Object -TypeName System.Text.StringBuilder
    [void]$sb.AppendLine('<table>')
    if ($null -ne $obj) {
        if (([object]$obj).GetType().FullName -eq 'System.Data.DataTable'){
            # it is a DataTable; convert to array of PSObjects
            $obj = $obj | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
        }
        $headers = $obj[0].PSObject.Properties | Select -ExpandProperty Name
        [void]$sb.AppendLine('<thead><tr>')
        foreach ($column in $headers) {
            [void]$sb.AppendLine(('<th>{0}</th>' -f [System.Web.HttpUtility]::HtmlEncode($column)))
        }
        [void]$sb.AppendLine('</tr></thead><tbody>')
        $row = 0
        $obj | ForEach-Object {
            # add inline style for zebra color rows
            if ($row++ -band 1) {
                $tr = '<tr style="background-color: {0};">' -f $oddRowBackColor
            } 
            else {
                $tr = '<tr>'
            }
            [void]$sb.AppendLine($tr)
            foreach ($column in $headers) {
                [string]$val = $($_.$column)
                #If($NameAd -ne "")
                if ($val -notmatch "\S") { 
                    $td = '<td>&nbsp;</td>' 
                } 

                else { 
                    $td = '<td>{0}</td>' -f [System.Web.HttpUtility]::HtmlEncode($val)
                }
                [void]$sb.Append($td)
            }
            [void]$sb.AppendLine('</tr>')
        }

        [void]$sb.AppendLine('</tbody>')
    }
    [void]$sb.AppendLine('</table>')

    return $sb.ToString()
}


$headerBackColor = '#4F81BD'  # backgroundcolor for column headers
$oddRowBackColor = '#DCE6F1'  # background color for odd rows

$style = @"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Report</title>
    <meta name="generator" content="PowerShell" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <style type="text/css">
    body {
        font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
        font-size: 12px;
        color: black;
    }

    table, td, th {
        border-color: black;
        border-style: solid;
        font-family: Verdana, Arial, Geneva, Helvetica, sans-serif;
        font-size: 11px;
    }
    table {
        border-width: 0 0 1px 1px;
        border-spacing: 0;
        border-collapse: collapse;
    }

    td, th {
        margin: 0;
        padding: 4px;
        border-width: 1px 1px 0 0;
        text-align: left;
    }
    th {
        color: white;
        background-color: $headerBackColor;
        font-weight: bold;
    }
    </style>

<p><span style="color: #0000ff;"><strong>I'm only pulling only 1 thru 3 for a short email list</strong></span></p>
<p><span style="color: #0000ff;"><strong>WORK UNIT STATUS LEVELS BELOW:</strong></span></p>
<ol>
<li>01 = (<span style="color: #3366ff;"><strong>Ready for processing</strong></span>) using your SA account.</li>
<li>02 = (<span style="color: #3366ff;"><strong>Processing in progresst</strong></span>) using your SA account.</li>
<li>03 = (<span style="color: #3366ff;"><strong>Processing failed</strong></span>) using your SA account.</li>
<li>04 = (<span style="color: #3366ff;"><strong>Processing completed</strong></span>) using your SA account.</li>
<li>05 = (<span style="color: #3366ff;"><strong>Cancellation requested</strong></span>) using your SA account.</li>
<li>06 = (<span style="color: #3366ff;"><strong>Cancellation in progress</strong></span>) using your SA account.</li>
<li>07 = (<span style="color: #3366ff;"><strong>Cancellation failed</strong></span>) using your SA account.</li>
<li>08 = (<span style="color: #3366ff;"><strong>Cancellation completed</strong></span>) using your SA account.</li>
</ol>
"@
####SET EMAIL VALUES####
$bodyA = '{0}</head><body>{1}</body></html>' -f $style, (ConvertTo-HTMLTable $exportObject)
$EmailTo = "you@you.org"
$EmailFrom = "me@me.org"
$Subject = "Failed Work Unit Issue - High Priority" 
$Body = $bodyA 
$SMTPServer = "mail.server.org" 

####EMAIL PROCESS ####
$anonUsername = "anonymous"
$anonPassword = ConvertTo-SecureString -String "anonymous" -AsPlainText -Force
$anonCredentials = New-Object System.Management.Automation.PSCredential($anonUsername,$anonPassword)
Send-MailMessage -smtpserver "$SMTPServer" -from "$EmailFrom" -to "$EmailTo" -subject "$Subject" -bodyAsHtml "$Body" -credential $anonCredentials
Exit
 














【问题讨论】:

  • 您的脚本可能是 UTF-8 编码但没有 BOM,这会导致 Windows PowerShell 误解它 - 尝试重新保存脚本使用 BOM - 请参阅this answer 了解更多信息。如果这解决了您的问题,我们可以将您的问题标记为链接帖子的副本。
  • 是的,这是编码的问题。我使用 Notepad ++ 通过将其放入 UTF-8-BOM 代码来解决此问题

标签: powershell db2


【解决方案1】:

以下部分中的引号不是标准的,因此编译器会将它们解释为其他字符。

$factory = [System.Data.Common.DbProviderFactories]::GetFactory(“IBM.Data.DB2”)

请注意,常规的 ascii 双引号是“034”,但如果您将上面的引号符号之一复制并粘贴到 ascii converter 中,您将获得“226 128 156”作为 ascii 代码。

TL;DR 注意那些看起来很像您认为自己正在使用但实际上并非如此的符号。

【讨论】:

  • 自 OP 确认以来,问题是.ps1 文件的字符编码 之一。解决了字符编码问题 - 也许令人惊讶 - PowerShell 确实 允许使用 (左双引号,U+201C)代替 ASCII 范围 " 等等价物 - 见this answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多