问题 为什么工作目录在执行Invoke-sqlcmd时会发生变化?


我正在尝试搜索数据库中是否有特定的机器名称,如果是,我们将替换为新的机器名称。

我们正在使用PowerShell

 Add-pssnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue
    Add-pssnapin sqlservercmdletsnapin100 -ErrorAction SilentlyContinue

    $SelectQuery = "SELECT [$columnName] FROM [$DatabaseName].[dbo].[$TableName] Where [$columnName] is not null;"

    try {
          $Qresult= Invoke-sqlcmd -query $SelectQuery -Database $DatabaseName -ServerInstance $srvInstance -Verbose
          $Qresult = $Qresult| % { $_.$columnName+"`n" 

           #check whether the Machine Name is found if the column value is processed in URL format
            $IsOldFoundFromURL=TestOldMachineFromURL $Qresult $OldMachineName

            #check whether the Machine Name is found if the column value is processed in Connection string format
            $IsOldFoundFromConn=TestOldMachineFromconnstring $Qresult $OldMachineName

            If ( $IsOldFoundFromURL -or  $IsOldFoundFromConn ) {

                    LogWrite "Columns Name before changing: $columnName "
                    LogWrite "$Qresult"
            }
            Else {
                    LogWrite "OldMachine name is not found in DB"
                    Return
            }
     }
     catch {
            Write-error "Error occured when executing sql $SelectQuery"
            LogWrite $Error[0]
        }

一切都很好。但是当执行Invoke-sqlcmd时,驱动器号将更改为SQLServer:\,这是令人惊讶的。

我在Windows 2012 R2计算机上运行此程序并针对sQL server 2012执行此操作。

问题是当工作目录更改我们的脚本失败时,因为我们在当前脚本路径中写入日志文件,当脚本路径更改为SQLserver:\时,无法创建日志文件并失败。


13073
2017-12-03 13:51


起源

该代码看起来并不完整。你在什么时候写日志? - arco444
@ arco444更新了代码段 - Samselvaprabu
因此在尝试写入日志时失败,但您没有包括 LogWrite 功能实际发生的地方。当然这是脚本中最相关的部分? - arco444


答案:


此问题作为运行的一部分发生 Add-pssnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue 一段代码的开头。我不知道为什么会这样做,但我知道当我运行类似命令时(Import-Module 'sqlps' -DisableNameChecking)在运行MS SQL 2012的网络中的计算机上,它将文件系统位置从任何位置更改为 SQLSERVER:> location - 我认为这是因为它希望您开始在SQL Server实例中使用命令。

要克服这个问题,你可以做一个 Push-Location 和 Pop-Location 命令移回原来的位置,就像这样;

C:\Users\foo.bar> Push-Location
C:\Users\foo.bar> Add-pssnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue
SQLSERVER:\> Add-pssnapin sqlservercmdletsnapin100 -ErrorAction SilentlyContinue
SQLSERVER:\> Pop-Location
C:\Users\foo.bar> _

通过考虑命令中目录的更改来解决问题。


9
2017-12-04 08:22