Застрял в Powershell sqlserver

14

Я немного новичок PowerShell.

Итак, я создал скрипт, который использует Restore-SqlDatabaseкомандлет. Однако после того, как я запустил его, он оставляет Powershell в другом состоянии.

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

Как я могу вернуть Powershell обратно в «нормальный» интерфейс?

Кроме того, как называется PS SQLSERVERпрефикс? Я попытался Google для этого и пришел пустым.

Натан Куп
источник

Ответы:

21

Из статьи MS SQL Server PowerShell

• Поставщик SQL Server, который обеспечивает простой механизм навигации, аналогичный путям файловой системы. Можно создавать пути, аналогичные путям файловой системы, где диск связан с объектной моделью управления SQL Server, а узлы основаны на классах объектной модели. Затем вы можете использовать знакомые команды, такие как cd и dir, для навигации по путям, аналогичным способам навигации по папкам в окне командной строки. Вы можете использовать другие команды, такие как ren или del , для выполнения действий над узлами в пути.

Наличие такого провайдера, как этот, позволяет вам обращаться с SQLServer так же, как с диском (буквой).

Так что, скорее всего, где-то в вашем коде вы использовали CDдля перемещения в поставщик SQLServer ( cd sqlserver:).

Если бы вы хотели вернуться к d:\thefolderконкретному, вы бы использовали cd d:\thefolder.

Если вы хотите вернуться туда, где вы начали, когда закончите, то вам, вероятно, придется сохранить текущее местоположение каталога в переменной в начале скрипта, а затем использовать его cdв конце скрипта, чтобы вернуться к этому оригинальный каталог.

Или вы могли бы, как это было предложено @ alroc это в своем комментарии, используйте push-locationи pop-locationкомандлеты для хранения и получить текущее местоположение.

Ƭᴇcʜιᴇ007
источник
3
Вам не нужно сохранять текущий каталог в переменную; используйте push-locationперед импортом sqlpsи pop-locationпосле импорта, и все готово.
Alroc
@alroc Я подумал, что, возможно, что-то подобное, но я не знал об этом. :) Удобно.
Ƭᴇcʜιᴇ007
7

это, кажется, работает для меня:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSqlCmd.sql" | out-null
ccyborg
источник
1

Просто введите C:в командной строке, чтобы вернуться к обычному (например, C: \>) приглашению.

Просто для информации то, что могло вызвать приглашение SMO (то есть PS SQLSERVER:> ) из обычного приглашения C: \> , - это когда вы загружаете сборку SMO без Out-Null (out-null подавляет вывод, возвращаемый командлетом ).

Другими словами, чтобы избежать непреднамеренного входа в приглашение SMO при загрузке сборки SMO, просто передайте Out-Null, как показано ниже:

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

Поскольку Microsoft устарела в методе LoadWithPartialName () , используйте вместо этого Add-Type :

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

Примечание: чтобы получить путь к вашей сборке / dll - используйте метод GetAssemblies (), как показано ниже:

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

НТН.

Эдди Кумар
источник