Por que o método .NET Folder.CopyHere não permite supressão de diálogo para arquivos .ZIP quando executado em uma etapa de trabalho do PowerShell do SQL Server Agent?

4

Estou usando o PowerShell em uma etapa de trabalho do SQL Server Agent para automatizar a extração do conteúdo do arquivo .ZIP para um diretório.

Com base na resposta mais votada sobre esta questão: Como zipar / descompactar arquivos no Powershell?

Estou usando este código:

$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)

O parâmetro opcional vOptions do método CopyHere é 20, que especifica "Não exibir uma caixa de diálogo de progresso". (4) e "Responder com" Sim para todos "para qualquer caixa de diálogo exibida." (16).

Esse parâmetro funciona como esperado em um editor de scripts do PowerShell (estou usando o PowerGUI Script Editor). Eu posso executar o script e executá-lo novamente (sobrescrever cenário) e o script é concluído sem erros e sem caixas de diálogo. No entanto, a execução do mesmo código em uma etapa de trabalho do SQL Server Agent PowerShell resulta em uma tarefa que trava quando o arquivo já existe no banco de dados de destino.

Etapas para reproduzir:

- 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

Por que o parâmetro vOption não funciona para o trabalho SQL?

Walter Wang, do Suporte da Comunidade Online da Microsoft, diz :

...please note each shell folder is backed by a shell namespace extension (NSE for short). Each NSE will choose to have its own mechanism to copy/move/delete data items (file/folder for a normal file system path).

The documentation you referenced about CopyHere method only applies to normal file system path. That's why you using option 4 to disable the progress dialog doesn't work for a zip folder.

On the other hand, last time I checked with shell team, currently the zip file NSE's functionality is only meant to be used with user interaction.

In other words, programmatically access to the zip file NSE is not officially supported."

    
por peterk411 30.08.2011 / 21:13

2 respostas

2

Gostaria de saber se isso tem algo a ver com as etapas internas do trabalho do Powershell no SQL Agent. Por exemplo, você não pode fazer o write-host na etapa de trabalho do PowerShell no SQL Agent, conforme explicado neste post: link

Uma sugestão: tente configurar uma etapa do trabalho CmdExec e chamar C: \ windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe com o parâmetro -file, em vez de usar as etapas da tarefa do PowerShell. Desta forma, usará cmdexec em vez de sqlps.

    
por 08.05.2012 / 03:36
5

Você precisa passar a bandeira

(16)

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

Assim:

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

Você pode querer combinar isso com este sinalizador:

(4)

Do not display a progress dialog box.

Então você faria:

$destination.Copyhere($zip_file.items(), 20)
    
por 30.08.2011 / 21:24