Этот вопрос, вероятно, задавали по-разному, но я не могу найти ничего подходящего.
У меня есть задание сервера SQL, которое запускает 2 сценария PowerShell. Первый работает нормально (простой запрос стека IP), а второй не работает. Первым шагом в работе было проверить, что мой идентификатор пользователя, под которым я выполняю задание, имеет правильные учетные данные, поскольку агент SQL не будет работать. Я выполняю второй шаг как тип CmdExe, чтобы заставить SQL сервер выполнить внешний обновленный исполняемый файл PowerShell, в котором установлен пакет Import-Excel вместо внутреннего экземпляра.
Полный вывод задания:
Windows IP Configuration
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . : ddd
Link-local IPv6 Address . . . . . : xxx
IPv4 Address. . . . . . . . . . . : yyy
Subnet Mask . . . . . . . . . . . : zzz
Default Gateway . . . . . . . . . : aaa
========================
Excel access error occured:
at <ScriptBlock>, E:\tmp\tstScripts\tst_load.ps1: line 10
Data is NOT valid.
Exiting script with level 999
Когда вторая задача запускается из PowerShell ISE или собственного окна Powershell:
PS C:\Users\MyUserId> E:\tmp\tstScripts\tst_load.ps1
========================
The Excel sheet being worked on is MyExcel_Tst
========================
First cell contains: test.data.site
Second cell contains: 97.89%
Valid data is present.
Exiting script with level 0
Код, который выполняется выполняется следующим образом с указанной строкой с ошибкой:
$XL_FilePath = 'C:\tmp\tstdata\';
$XL_SQL_Input = 'MyExcel_Tst';
$wSep = "========================";
try{
$Excel = New-Object -ComObject Excel.Application; <<<<<---- This is error line
$Workbook = $Excel.Workbooks.Open($XL_FilePath + $XL_SQL_Input +'.xlsx');
$WorkSheet = $Workbook.Sheets.Item(2);
for ($i=1; $i -lt 3; $i++)
{
$col = 1;
$row = $i;
if ($i -lt 2)
{
$FCell = $WorkSheet.cells.Item($col, $row).Text;
}else{
$SCell = $WorkSheet.Cells.Item($col, $row).Text;
}
}
Write-Host $wSep;
Write-Host "The Excel sheet being worked on is" $WorkSheet.Name;
Write-Host $wSep;
write-host " First cell contains: " $FCell;
write-host " Second cell contains: " $SCell;
}
catch{
Write-Host $wSep;
Write-Host " Excel access error occured: ";
Write-Host $_.ScriptStackTrace;
}
## validation check - only check the 2nd value as it must be numeric, 1st is any character.
if ($SCell.Length-1 -match "^\d+$")
{
Write-Host " Valid data is present." -ForegroundColor Green;
$errorlevel = 0;
}else{
Write-Host "Data is NOT valid." -BackgroundColor RED -ForegroundColor Yellow;
$errorlevel = 999;
}
Write-Host "Exiting script with level " $errorlevel;
exit $errorlevel;
Я знаю, что это может быть довольно простое решение, и боролся с учетными данными, чтобы убедиться, что пользователь, запускающий сценарий, имеет доступ и возможность выполнять Сценарии PowerShell из SQL серверной среды.
Основная причина этого задания - проверка входных данных перед вводом в базу данных с помощью автоматизированного процесса, но входные данные представляют собой файлы Excel на нескольких листах. Если есть лучший способ, я также открыт для предложений по нему.
Любые предложения приветствуются.