3

UPDATE: Изменен скрипт для работы в пределах PS1, как требуется SQLPS.Powershell от SQL Server Agent Job не распознает ConvertTo-CSV

Изменено:

IF($property.Value -match $regex){ 
        $currentBadLine = (ConvertTo-Csv $_ -NoTypeInformation -Delimiter $delimiter); 

        $badLines += $currentBadLine[1,2] 
      }; 

To:

IF($property.Value -match $regex){ 
       $badLines += $_ | Select-Object | ft -autoSize; 
     }; 

печать новый заголовок для каждой плохой линии, но это не конец света, и не стоит усилий, чтобы предотвратить.


У меня есть сценарий Powershell, который предварительно обрабатывает CSV-файлы, прежде чем они есть шанс испортить мой импорт данных.

На двух серверах в строке теперь я подтвердил, что основная версия PS не менее 2, и что следующий снимок кода отлично работает в PowerShell ISE. Цель кода - прочитать в каждой строке CSV, а затем пропустить столбцы, которые ищут шаблон регулярного выражения в переменной $ regex. Когда он находит один, я хочу, чтобы он отслеживал ошибку до ее исправления, поэтому я могу написать журнал ошибок позже, прежде чем выводить очищенный файл, готовый для импорта.

%{ 
    Foreach($Property in $_.PSObject.Properties){ 

      IF($property.Value -match $regex){ 
        $currentBadLine = (ConvertTo-Csv $_ -NoTypeInformation -Delimiter $delimiter); 

        $badLines += $currentBadLine[1,2] 
      }; 

     $property.Value = $property.Value -replace $regex; 
     } 

    $_ 

} 

Но когда я поставить этот код в работу агента агент жалуется:

«Термин„ConvertTo-Csv“не распознается как имя командлета, функции, файл сценария , или действующей программы. Проверьте правильность написания имени или если был указан путь, убедитесь, что путь верен, и повторите попытку. '

Вопрос в этом заключается в следующем: Является ли подсистема Powershell Agents другой версией Powershell, чем остальная система? Если да, то каким образом я могу узнать, какую версию использует подсистема, и, если возможно, обновить ее, чтобы я мог это исправить.

Сервер работает под управлением:

Windows Server 2008 R2 Enterprise

PS Основная версия 2, Minor 0 Сложение -1 редакция -1

SQL Server 2008 R2 SP1 10.5.2500.0 64 бит

Спасибо!

ответ

3

Да, поддержка собственно PowerShell не на самом деле не реализован до SQL Server 2012 (даже это немного странное поведение, какие КОМАНДЛЕТОВ он поддерживает)

В 2008 году реализация PowerShell R2 агент фактически minishell, созданный в настоящее время (к счастью) устаревшей утилитой make-shell.exe, которая разрешает запуск командлетов v1 и запрещает использование Add-PSSnapin, поэтому вы не можете добавлять больше командлетов.

Чтобы получить правильную поддержку powershell, вам либо нужно выложить оболочку, либо вызвать внешний скрипт, либо запустить задание как запланированную задачу Windows, а не задание агента.

Следующая статья объясняет много о том, почему поддержка в PowerShell 2008 R2 не работает, как вы думаете, он должен:

The Truth about SQLPS and PowerShell V2

+0

Awesome. Я слышал, что интеграция PS-SQL Server была странной на некоторое время, но я думал, что ее в основном сгладили. Думаю нет. Благодарю. –

0

Один обходным: Export-CSV в файл, а затем получить -Содержание из файла.

$rows = ,(New-Object PSObject -prop @{a=7; b='stuff';}); 
$rows +=,(New-Object PSObject -prop @{a=77; b='more';}); 

#To run from SQL Job, change from this: 
$csvrows = $rows | ConvertTo-CSV -NoType | % {$_.Replace('"','')}; 
write-output $csvrows; 

#to this: 
$rows | Export-CSV -NoType "C:\Temp\T.csv" 
$csvrows = (Get-Content "C:\Temp\T.csv") | % {$_.Replace('"','')}; 
write-output $csvrows;