Назад | Перейти на главную страницу

Почему метод .NET Folder.CopyHere не позволяет подавлять диалог для файлов .ZIP при запуске на этапе задания PowerShell агента SQL Server?

Я использую PowerShell на этапе задания агента SQL Server, чтобы автоматизировать извлечение содержимого файла .ZIP в каталог.

Основываясь на ответе на этот вопрос, получившем наибольшее количество голосов: Как заархивировать / распаковать файлы в Powershell?

Я использую этот код:

$dir_source = "\\myserver\myshare\"
$dir_destination = "\\myserver2\myshare2\"
$file_source = Get-ChildItem -Path (Join-Path -Path $dir_source -ChildPath "test.zip")

$shell_app = New-Object -com shell.application
$zip_file = $shell_app.namespace($file_source.FullName)
$destination = $shell_app.namespace($dir_destination)
$destination.Copyhere($zip_file.items(),20)

Необязательный параметр vOptions метода CopyHere - 20, который указывает «Не отображать диалоговое окно выполнения». (4) и «Ответьте« Да для всех »для любого отображаемого диалогового окна». (16).

Этот параметр работает должным образом в редакторе сценариев PowerShell (я использую редактор сценариев PowerGUI). Я могу запустить сценарий и запустить его снова (сценарий перезаписи), и сценарий завершится без ошибок и диалоговых окон. Однако выполнение того же кода на этапе задания PowerShell агента SQL Server приводит к зависанию задания, если файл уже существует в целевой базе данных.

Действия по воспроизведению:

- Instantiate code in a SQL Server 2008 SQL Server Agent Job step
- Start the SQL job
- Result: SQL job completes, unzipped file "test.csv" appears in the $dir_destination folder
- Start the SQL job
- Result: Job executes indefinitely.
- Stop the SQL job
- Delete the "test.csv" from the $dir_destination folder
- Start the SQL job
- Result: SQL job completes, unzipped file "test.csv" appears in the $dir_destination folder

Почему параметр vOption не работает для задания SQL?

Уолтер Ван из службы поддержки сообщества Microsoft Online::

... обратите внимание, что каждая папка оболочки поддерживается расширением пространства имен оболочки (сокращенно NSE). Каждая NSE выберет свой собственный механизм для копирования / перемещения / удаления элементов данных (файл / папка для обычного пути в файловой системе).

Документация, на которую вы ссылались о методе CopyHere, применима только к обычному пути файловой системы. Вот почему вы используете вариант 4 для отключения диалогового окна прогресса не работает для zip-папки.

С другой стороны, в прошлый раз, когда я проверил с командой оболочки, в настоящее время функциональность NSE zip-файла предназначена только для использования при взаимодействии с пользователем.

Другими словами, программный доступ к zip-файлу NSE официально не поддерживается ».

Вам нужно передать флаг

(16)

Respond with "Yes to All" for any dialog box that is displayed.

Вот так:

$destination.Copyhere($zip_file.items(), 16) 

Вы можете объединить это с этим флагом:

(4)

Do not display a progress dialog box.

Итак, вы бы сделали:

$destination.Copyhere($zip_file.items(), 20)

Интересно, имеет ли это какое-то отношение к внутренним действиям Powershell в SQL Agent. Например, вы не можете выполнить команду write-host на этапе задания PowerShell в агенте SQL, как описано в этом сообщении блога: http://blogs.msdn.com/b/mwories/archive/2009/09/30/the-use-of-write-host-and-sql-server-agent-powershell-job-steps.aspx

Одно из предложений - попробуйте настроить шаг задания CmdExec и вызвать C: \ windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe с параметром -file вместо использования шагов задания PowerShell. Таким образом, вместо sqlps будет использоваться cmdexec.