Coincé dans Powershell sqlserver

14

Je suis un peu novice en PowerShell.

J'ai donc créé un script qui utilise la Restore-SqlDatabasecommande. Cependant, après l'avoir exécuté, il laisse Powershell dans un état différent.

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

Comment puis-je ramener Powershell à l'interface "normale"?

De plus, comment s'appelle le PS SQLSERVERpréfixe? J'ai essayé de Google pour cela et suis venu vide.

Nathan Koop
la source

Réponses:

21

De l'article MS SQL Server PowerShell

• Un fournisseur SQL Server, qui permet un mécanisme de navigation simple similaire aux chemins du système de fichiers. Vous pouvez créer des chemins similaires aux chemins du système de fichiers, où le lecteur est associé à un modèle d'objet de gestion SQL Server et les nœuds sont basés sur les classes de modèle d'objet. Vous pouvez ensuite utiliser des commandes familières telles que cd et dir pour parcourir les chemins similaires à la façon dont vous parcourez les dossiers dans une fenêtre d'invite de commandes. Vous pouvez utiliser d'autres commandes, telles que ren ou del , pour effectuer des actions sur les nœuds du chemin.

Avoir un fournisseur comme celui-ci chargé vous permet de traiter le SQLServer de la même manière que vous traiteriez un lecteur (lettre).

Donc, très probablement quelque part dans votre code que vous avez utilisé CDpour passer au fournisseur SQLServer ( cd sqlserver:).

Si vous vouliez revenir à plus d:\thefolderprécisément, vous utiliseriez cd d:\thefolder.

Si vous souhaitez revenir à l'endroit où vous avez commencé une fois terminé, vous devrez probablement stocker l'emplacement du répertoire actuel dans une variable au début du script, puis l'utiliser avec cdà la fin du script pour revenir à cela répertoire d'origine.

Ou vous pouvez, comme suggéré par @ alroc dans son commentaire, utiliser les applets de commande push-locationet pop-locationpour stocker et récupérer l'emplacement actuel.

Ƭᴇcʜιᴇ007
la source
3
Vous n'avez pas besoin d'enregistrer le répertoire courant dans une variable; utiliser push-locationavant l'importation sqlpset pop-locationaprès l'importation et vous êtes prêt à partir.
alroc
@alroc J'ai pensé qu'il y avait probablement quelque chose comme ça, mais je n'étais pas au courant de celui-là. :) Pratique.
Ƭᴇcʜιᴇ007
7

cela semble fonctionner pour moi:

Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSqlCmd.sql" | out-null
ccyborg
la source
1

Tapez simplement C:à l'invite de commande, pour revenir à l'invite habituelle (par exemple C: \>).

Juste pour information, ce qui peut avoir déclenché l'invite SMO (c'est-à-dire PS SQLSERVER:> ) à partir de l' invite C: \> normale , c'est lorsque vous chargez l'assembly SMO sans Out-Null (out-null supprime la sortie renvoyée par la cmdlet ).

En d'autres termes, pour éviter d'entrer par inadvertance dans l'invite SMO lors du chargement de l'assemblage SMO, il suffit de diriger la sortie Null comme ci-dessous:

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

Étant donné que Microsoft a déconseillé la méthode LoadWithPartialName () , utilisez plutôt Add-Type :

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

Remarque: pour obtenir le chemin vers votre assembly / dll - utilisez la méthode GetAssemblies () comme ci-dessous:

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

HTH.

Eddie Kumar
la source