PowerShell invoke-sqlcmd Get-ChildItem:无法调用方法。提供商不支持使用过滤器

时间:2016-08-23 13:12:17

标签: powershell invoke-sqlcmd

使用invoke-sqlcmd将行插入表时发生了一个奇怪的错误。如果执行一次,整个脚本都可以正常工作,但是如果我第二次运行它,则会失败并显示错误消息:Get-ChildItem:无法调用方法。提供商不支持使用过滤器。我测试了代码并注释掉了invoke-sqlcmd行,并且可以多次运行它而没有任何错误。我把invoke-sqlcmd放在一个函数中它仍然是错误的,并且在第一次成功运行之后它也将在PS命令行中失败。

Clear-Host
$ErrorActionPreference = 'Stop'

function Update-SQL
{
    invoke-sqlcmd -query $strSQLInsert -server SXLSV-LEAPDBD1 -database DTCS_DV
}

$files = Get-ChildItem '\\pcslog1011\dtcs\ContractEmailNotes\' -Filter '*.txt' | Where-Object {$_.LastWriteTime -ge '08/22/2016 00:00:00' -and $_.LastWriteTime -le '08/22/2016 23:59:59'} | sort-object -Descending

for ($i=0; $i -lt $files.Count; $i++) 
{
    $SNAC_CNTR_ID = $files[$i].BaseName.Substring(0,6)
    $SNAC_MODIFIED = '{0:yyyy-MM-dd HH:mm:ss}' -f ($files[$i].LastWriteTime)

    $reader = [System.IO.File]::OpenText($files[$i].FullName)
    $lineCnt = 0
    $SNAC_ACTION = ''
    for() 
    {
        $lineCnt += 1 
        $line = $reader.ReadLine()
        if ($line -eq $null) {break}
        if ($lineCnt -eq 4)
        {
            if ($line.Contains('AMENDED') -eq $True)
            {
                $SNAC_ACTION = 'AMENDED'
            }
            elseif ($line.Contains('DEAL CHANGED') -eq $True)
            {
                $SNAC_ACTION = 'CHANGED'
            }
            else
            {
                $SNAC_ACTION = 'NEW'
            }
        }
    }
    $reader.Close()

    write-host $SNAC_CNTR_ID $SNAC_MODIFIED $SNAC_ACTION

    $strSQLInsert = "INSERT INTO CQT_CONTRACT_SOX_NAC_LIST (SNAC_CNTR_ID, SNAC_MODIFIED, SNAC_ACTION, SNAC_UPDATED_BY, SNAC_UPDATED_ON) VALUES ('" + $SNAC_CNTR_ID + "', '" + $SNAC_MODIFIED + "', '" + $SNAC_ACTION + "', Default, Default)"

    Update-SQL $strSQLInsert
}

exit

2 个答案:

答案 0 :(得分:0)

这可能会也可能不会对您有所帮助。尝试在SQL代理作业中运行我的脚本时遇到了同样的错误。它可以正常运行我的帐户和代理运行的服务帐户,但在我使用

读取前缀的UNC文件路径之前拒绝作为工作

Microsoft.PowerShell.Core \文件系统::

我不推荐自动化解决方案中的文件共享......但别无选择。希望它有所帮助。

答案 1 :(得分:0)

发布的答案有助于我理解问题,但不够具体,无法提供在我的环境中有效的解决方案。这就是为我解决问题的原因:

$ latestFile = Get-ChildItem Microsoft.PowerShell.Core \ FileSystem :: $ dir |对象-{$ _。Name.ToString()-like $ databasePattern} |排序对象LastAccessTime-降序|选择对象-前1个

成功需要ToString()。完整的问题说明,调试和解决方案已发布在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f28d9276-7aad-464c-823e-b9b4637856e1/powershell-script-using-getchilditem-works-with-invokesqlcmd-when-called-from-visual-studio-code?forum=sqlkjmanageability&prof=required上,我提供的链接仅出于研究和归因目的。按照StackOverflow要求完整解决方案而不是链接的约定,我发布的是针对我的环境中出现的问题的完整解决方案。