Utknąłem w serwerze Powershell sqlserver

14

Jestem trochę nowicjuszem PowerShell.

Więc stworzyłem skrypt, który używa Restore-SqlDatabasekomendy. Jednak po uruchomieniu go program Powershell pozostaje w innym stanie.

PS D:\theFolder\> .\myRestoreDatabaseScript.ps1
... snip does the work ...
PS SQLSERVER:\>

Jak mogę przywrócić PowerShell z powrotem do „normalnego” interfejsu?

Jak również PS SQLSERVERnazywa się przedrostek? Próbowałem tego zrobić w Google i wyszedłem pusty.

Nathan Koop
źródło

Odpowiedzi:

21

Z artykułu MS SQL Server PowerShell

• Dostawca programu SQL Server, który umożliwia prosty mechanizm nawigacji podobny do ścieżek systemu plików. Można budować ścieżki podobne do ścieżek systemu plików, w których dysk jest powiązany z modelem obiektowym zarządzania programem SQL Server, a węzły są oparte na klasach modeli obiektów. Następnie możesz używać znanych poleceń, takich jak cd i dir, aby poruszać się po ścieżkach podobnie jak w folderach w oknie wiersza polecenia. Możesz używać innych poleceń, takich jak ren lub del , aby wykonywać działania na węzłach na ścieżce.

Posiadanie takiego dostawcy pozwala traktować SQLServer w taki sam sposób jak dysk (litera).

Najprawdopodobniej więc gdzieś w twoim kodzie użyłeś CDprzejścia do dostawcy SQLServer ( cd sqlserver:).

Jeśli chcesz wrócić do d:\thefolderkonkretnie, z którego skorzystasz cd d:\thefolder.

Jeśli po zakończeniu chcesz powrócić do miejsca, w którym zacząłeś, prawdopodobnie będziesz musiał zapisać bieżącą lokalizację katalogu w zmiennej na początku skryptu, a następnie użyć go cdna końcu skryptu, aby wrócić do tego oryginalny katalog.

Lub możesz, zgodnie z sugestią @ alroc's w jego komentarzu, użyć poleceń cmdlet push-locationi pop-locationdo przechowywania i pobierania bieżącej lokalizacji.

Ƭᴇcʜιᴇ007
źródło
3
Nie musisz zapisywać bieżącego katalogu w zmiennej; użyj push-locationprzed zaimportowaniem sqlpsi pop-locationpo zaimportowaniu i możesz zacząć.
alroc
@alroc Uznałem, że prawdopodobnie jest coś takiego, ale nie byłem tego świadomy. :) Przydatne.
Ƭᴇcʜιᴇ007
7

wydaje mi się to działać:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSqlCmd.sql" | out-null
Ccyborg
źródło
1

Po prostu wpisz C:w wierszu polecenia, aby wrócić do zwykłego wiersza (np. C: \>).

Tylko dla informacji, co mogło wywołać monit SMO (tj. PS SQLSERVER:> ) z normalnego monitu C: \> ), to gdy ładujesz zestaw SMO bez Out-Null (out-null tłumi dane wyjściowe zwracane przez cmdlet ).

Innymi słowy, aby uniknąć przypadkowego przejścia do monitu SMO podczas ładowania zestawu SMO, po prostu potokuj Out-Null jak poniżej:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null

Ponieważ Microsoft wycofał metodę LoadWithPartialName () , użyj zamiast tego Add-Type :

Add-Type -Path "your_path_to_assembly\Smo.dll"

Uwaga: aby uzyskać ścieżkę do zestawu / biblioteki DLL - użyj metody GetAssemblies () jak poniżej:

[System.AppDomain]::CurrentDomain.GetAssemblies() | ? {$_.Location -match 'Smo.dll'}

HTH.

Eddie Kumar
źródło