Pytanie Dlaczego katalog roboczy zmienia się podczas wykonywania Invoke-sqlcmd?


Próbuję wyszukać, czy nazwa maszyny particualr znajduje się w bazie danych, a jeśli tak, to zastępujemy ją nową nazwą komputera.

Używamy 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]
        }

Wszystko dziala . Ale podczas wykonywania Invoke-sqlcmd litera dysku zmienia się na SQLServer: \ co jest zaskakujące.

Uruchomiłem to na komputerze z Windows 2012 R2 i wykonałem to na serwerze sQL 2012.

Problem polega na tym, że katalog roboczy zmienia nasz skrypt, ponieważ nie zapisujemy pliku dziennika w bieżącej ścieżce skryptu, gdy ścieżka skryptu zmieni się na SQLserver: \, nie może utworzyć pliku dziennika i nie powiedzie się.


11
2017-12-03 13:51


pochodzenie


Ten kod nie wygląda kompletnie. W którym momencie robisz zapis do dziennika? - arco444
@ arco444 Zaktualizowano opis - Samselvaprabu
Tak więc nie powiedzie się, gdy próbujesz pisać do dziennika, ale nie uwzględniłeś tego LogWrite funkcja tam, gdzie tak się dzieje. Z pewnością jest to najważniejsza część scenariusza? - arco444


Odpowiedzi:


Ten problem występuje w ramach uruchamiania usługi Add-pssnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue sekcję twojego kodu na początku. Nie jestem pewien, dlaczego to robi, ale wiem, że gdy uruchomię podobne polecenie (Import-Module 'sqlps' -DisableNameChecking) na komputerach w naszej sieci z uruchomionym MS SQL 2012, zmienia lokalizację systemu plików z dowolnej lokalizacji na SQLSERVER:> location - Zakładam, że dzieje się tak dlatego, że oczekuje się, że zaczniesz używać poleceń w instancji SQL Server.

Aby rozwiązać ten problem, możesz zrobić Push-Location i Pop-Location polecenie powrotu do pierwotnej lokalizacji, tak jak;

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> _

Albo to albo przezwyciężyć problem poprzez faktoring w katalogu zmian w twoich poleceniach.


9
2017-12-04 08:22