PowerShell"打破"不断更改规则

时间:2017-07-16 00:27:20

标签: powershell execution

这行代码在没有编辑的情况下 - 改变了过去几天的行为 - 多次:

try {
    $testfile = "c:\users\***RedactedForSecurity***\desktop\psfcatalog\copy_conversions_weekly_report.csv"
    write-log((Get-Date -Format o) + "     get-sqlhelper")
    $sqlhelper = get-sqlhelper -serverinstance '***RedactedForSecurity***' -database '***RedactedForSecurity***' -username '***RedactedForSecurity***' -password '***RedactedForSecurity***'

    Function Create-TableString{ 
        Param(
            [Parameter(Mandatory=$true)]
            [string]$tableName,
            [Parameter(Mandatory=$true)]
            [string]$Fields
        )
        [string]$SQL = "CREATE TABLE " + $tableName + '(' + $Fields + ')'
        Write-Host $SQL
        return $SQL
    }

    write-log((Get-Date -Format o) + "     finding first line of CSV data in file")
    gc $testfile | % {
        if ($_ -match "report fields") {
            $line = $_.ReadCount
            break
        }
    }

    [string]$fieldNamesSQL = gc $testfile |
        select -Skip $line -First 10 |
        ConvertFrom-Csv |
        Out-DataTable |
        % {$fieldNamesSQL += $Col.ColumnName + " VARCAR(255)  NULL, "} -End {$fieldNamesSQL.TrimEnd(',', ' ')}

    Write-Host $fieldNamesSQL
    Write-Host $csvHeaders
} catch {
    $msg = command 2>&1
    Write-Host $_.exception.message
    Write-Host $_.exception.itemname
    Write-Host $_.exception.message
    Write-Host $msg
}

好的就是这件事 - 注意剧本的部分:

gc $testfile | % {
    if ($_ -match "report fields") {
        $line = $_.ReadCount
        break
    }
}

该部分工作正常大约一天,然后break开始停止执行整个脚本而不是仅仅循环。它怎么能一天工作然后改变?无论如何,我提出了一个解决方案,我将用{}包裹整个部分,然后在下一次调用中递归执行它:

{gc $testfile | % {
    if ($_ -match "report fields") {
        $line = $_.ReadCount
        break
    }
}}

[string]$fieldNamesSQL = gc $testfile |
    select -Skip $line -First 10 |
    ConvertFrom-Csv |
    Out-DataTable |
    % {$fieldNamesSQL += $Col.ColumnName + " VARCAR(255)  NULL, "} -End {$fieldNamesSQL.TrimEnd(',', ' ')}

在调用$line时进行此设置,它会评估上一行,并且脚本无缝地继续执行。

一天后......

现在同一个脚本抛出错误:

  

无法验证参数' Skip'的参数。参数为null,为空,或者参数集合的元素包含空值。提供不包含任何空值的集合,然后再次尝试该命令。

发生了什么事?

修改

这不重复。我清楚foreach别名问题。问题是PowerShell运行时更改执行之间的评估的原因。即:我没有改变脚本,但执行发生了变化。为什么PowerShell会在一天内向运营商评估foreach,并在另一天将其评估为ForEach-Object

我发现的事情:

PowerShell似乎在执行之间保留了某些值。例如,如果我将字符串设置为value1并运行脚本。然后我将它设置为另一个值2并运行脚本,但是当Write-Host时值仍为value1。我必须重新启动shell,有时还要重新启动机器以使其正确评估。到目前为止,这似乎是随机的 - 这可能只是意味着我不理解它。

到目前为止,我最好的猜测是,当PowerShell解释foreach时,它会递归执行,因此脚本中的某个函数可能会导致它在调用之间进行不同的评估。

0 个答案:

没有答案