这行代码在没有编辑的情况下 - 改变了过去几天的行为 - 多次:
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时,它会递归执行,因此脚本中的某个函数可能会导致它在调用之间进行不同的评估。