Сценарий Powershell не выполняется правильно в SQL серверном задании - PullRequest
1 голос
/ 06 мая 2020

Этот вопрос, вероятно, задавали по-разному, но я не могу найти ничего подходящего.

У меня есть задание сервера 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 на нескольких листах. Если есть лучший способ, я также открыт для предложений по нему.

Любые предложения приветствуются.

...