15

主にSQLServerとファイルシステム間の複雑なロジックと相互作用を実行するために、既存のPowerShellスクリプトの大規模なライブラリがあります。

SQLの相互作用は通常、コマンドレットを介して実行されますInvoke-SQLCmd

最近、すべてのサーバーのSSMSバージョンが2012にアップグレードされました。これは、への参照を削除するためにコードにいくつかの変更を加える必要があることを意味sqlserverprovidersnapin100し、モジュールsqlservercmdletsnapin100のインポートを優先して2012年に廃止されたためです。SQLPs

これは問題なく機能しましたが、SQLPsモジュールはある時点で現在の場所をPS SQLSERVER>ではなくに変更しているようです<local folder>。これにより、他の多くのコマンドが失敗します。たとえばTest-Path、ネットワークドライブでを実行すると、その場所からは正常に機能し<local folder>ますが、その場所からは失敗しSQLSERVERます。

これは既知の問題ですか?このために変更できる回避策または設定はありますか?

私が心配しているメインスクリプトは1000行を超えており、この変更を行うまで2年以上問題なく実行されているため、可能であれば、行ごとのテストは避けたいと思います。

4

3 に答える 3

26

SQL 2012でSQLSERVERに変更される理由に関するもう少しの情報:ディレクトリ...

PowerShellがsqlpsモジュールをインポートすると、マニフェストはSqlPsPostScript.ps1という名前のポストスクリプトファイルを定義します。このファイル(最初の行)は、現在の場所をSQLSERVER:プロバイダーに変更します

x64ビットボックスでは、モジュールはC:\ Program Files(x86)\ Microsoft SQL Server \ 110 \ Tools \ PowerShell \ Modules\SQLPSにあります。

powershell 3.0では、自動インポートにより、これがいつ発生するかを判断するのが難しくなる可能性があります(私の経験では)。

(論理的な観点から)なぜこれを行うべきかは明確ではありません。SQL Serverモジュールには触れたくないので、モジュールのインポート後に明示的なset-locationを実行する必要があると思います。また、これを少しハッキーではないソリューションと見なすかもしれません。

Push-Location
Import-Module sqlps
Pop-Location
于 2013-01-08T00:55:59.563 に答える
8

cd <local folder>スクリプトの最初の行にを追加してプロバイダーから抜け出すことで、この問題を解決しました。しかし、ハックっぽい感じがします。

于 2012-10-16T14:30:27.340 に答える
0

デフォルトのプロパティの代わりに、コピーしようとしたファイルのPSPathプロパティ(Microsoft.PowerShell.Core \ FileSystem ::を含む)を使用して、同様の問題を解決しました。それが役に立てば幸い !

于 2019-12-16T10:46:14.043 に答える