![](/img/trans.png)
[英]Trouble executing SQLPS or PowerShell from T-SQL script using xp_cmdshell
[英]Xp_CmdShell Powershell Script No Valid Module Found
我正在嘗試使用XP_CMDSHELL在T-SQL中運行PS1文件,如下所示:
exec xp_cmdshell 'powershell -ExecutionPolicy bypass -command "C:\Users\sleven\Documents\DimAcctImport.ps1"'
powershell腳本如下:
import-module dbatools
Import-DbaCsv -SqlInstance 'MSSQL' -Database 'Test' -Table 'Account' -Path "R:\Data\Account.csv" -Delimiter ',' -Quote '"' -KeepNulls -NoProgress
此腳本使用模塊DbaTools
的cmdlet Import-DbaCSV
將CSV導入到目標表。
這是我在SSMS中收到的錯誤:
import-module : The specified module 'dbatools' was not loaded because no valid module file was found in any module
directory.
At C:\Users\sleven\Documents\DimAcctImport.ps1:1 char:1
+ import-module dbatools
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (dbatools:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
如果我復制PowerShell腳本並在PS ISE中運行該模塊,則該模塊將安裝並按預期運行。
我正在與用於運行sp的本地PC在同一台PC上使用SQL Developer Edition。
我想念什么?
編輯:從get-module和$ PSVersionTable添加輸出
PS> (Get-Module -ListAvailable dbatools).Path:
C:\Users\sleven\Documents\WindowsPowerShell\Modules\dbatools\0.9.834\dbatools.psd1
PS> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
使用Import-Module
cmdlet告訴PowerShell僅在某些文件夾中查找cmdlet。 您可以通過檢查環境變量PSModulePath
(添加分隔PSModulePath
以獲得更好的可見性)來檢查這些文件夾:
$env:PSModulePath -split ';'
在那種情況下,當通過xp_cmdshell
運行PowerShell時,該文件夾不包括在PSModulePath
(如果您使用其他帳戶(因為模塊當前位於您的配置文件文件夾中)也可能發生)。 現在,您有兩個選擇:
(get-module -ListAvailable dbatools).path
獲取路徑: # Replace the path with the path you found with Get-Module
Import-Module 'C:\path\to\module\dbatools.psd1
$env:PSModulePath
。 由於該主題的范圍更廣,讓我為您提供docs的鏈接 。 請記住,應該為運行xp_cmdshell
的用戶設置該變量。 如RThomas所述 ,默認情況下,它不是您的用戶帳戶。 有關該主題的說明,請參見鏈接的答案。 注意 (積分來自@David Browne-Microsoft從他的評論中獲得):
如果要設置環境變量,則它應該是系統環境變量,因為如果您更改SQL Server服務帳戶,您不會希望此過程中斷。 請記住,設置系統環境變量需要重新引導服務才能看到更改。
可能是帳戶問題。 請記住,默認情況下運行xp_cmdshell會將所有內容作為SQL Server實例后面的服務帳戶運行。 因此,您需要驗證這是什么帳戶。
如果它是內置的系統帳戶,則涉及權限時,可能會導致奇怪的行為。
如果是Windows帳戶或域帳戶,則需要通過運行PS文件而不是您本人而是以運行SQL Server用作服務帳戶的同一帳戶來對SQL Server進行外部測試。 您可以通過使用shift /右鍵單擊打開cmd shell並指定其他帳戶來輕松地做到這一點。
您的另一個選擇是為xp_cmdshell調用設置代理帳戶以使用。 有關如何執行此操作的說明,請參閱Microsoft文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.