Не удается заставить планировщик задач Windows запускать запланированное консольное приложение

У меня есть консольное приложение, которое использует два пакетных файла для распаковки zip-файла, берет распакованный xls, преобразует его в CSV и BCP данные в таблицу SQL. Я хочу запланировать запуск этого консольного приложения один раз в день. Я настроил планировщик задач Windows для запуска указанного приложения. Я пытаюсь «пробный запуск» задачи и не получаю ошибки. У меня есть приложение, записывающее в txt-файл, когда перехватываются исключения, и я получаю сообщение об ошибке «файл xls, который вы пытаетесь использовать, используется другим процессом».

ПРИМЕЧАНИЕ. Я знаю, что есть более эффективные способы импорта xls в SQL, но это для клиента, который слишком дешев, чтобы купить ПОЛНУЮ версию SQL SERVER.


person Community    schedule 22.06.2009    source источник
comment
Первый пакетный файл запускается с помощью 7zip (7z.exe x C:\BCP\RFSR.zip -aoa -oC:\BCP\ -ppassword) del c:\BCP\RFSR.csv*.* /q   -  person    schedule 23.06.2009
comment
вторая партия использует BCP для копирования CSV в базу данных SQL. (bcp server.dbo.test в c:\BCP\RFSR.csv -F2 -t, -c -S server -U имя пользователя -P пароль)   -  person    schedule 23.06.2009


Ответы (3)


Что-то не освободило его от XML-файла. Вам нужно выяснить, какая другая программа использует этот ресурс, и убедиться, что ее соединения закрыты. Возможно, во время тестового прогона вы не закрываете соединение, а затем, когда задача выполняется, другой процесс (более ранний экземпляр вашего приложения) не освободил ресурс.

person rie819    schedule 22.06.2009

похоже, вы пытаетесь использовать файл xml до его полной распаковки. Также проверьте возможность, упомянутую ранее rie819.

Мы могли бы помочь вам лучше, если бы вы разместили свои сценарии.

person Jonathan    schedule 22.06.2009
comment
Imports System Imports System.Diagnostics Imports Microsoft.Office.Interop Imports System.Data.SqlClient Imports System.Data.OleDb Imports System.IO Imports System.Text Module Module1 Dim currentDir As String = System.Environment.CurrentDirectory.ToString Sub main() callRFSRDecompressBatch() ExcelToCVS() callBCPCSVBatch() End Sub - person ; 23.06.2009
comment
Sub ExcelToCVS() Dim StrConn As String Dim DA As New OleDbDataAdapter Dim DS As New DataSet Dim Str As String Dim ColumnCount As Integer Dim OuterCount As Integer Dim InnerCount As Integer Dim RowCount As Integer Try StrConn = Provider=Microsoft.Jet.OLEDB.4.0 ;Источник данных=c:\BCP\RFSR.XLS;Расширенные свойства=Excel 8.0; - person ; 23.06.2009
comment
Dim objConn As New OleDbConnection(StrConn) Try objConn.Open() If objConn.State = ConnectionState.Closed Then Else End If Catch ex As Exception logError(ex) Exit Sub End Try Dim objCmd As New OleDbCommand(Select * from [rfsr$ ], objConn) objCmd.CommandType = CommandType.Text Dim ObjStreamWriter As StreamWriter ObjStreamWriter = New StreamWriter(c:\BCP\RFSR.CSV) - person ; 23.06.2009
comment
Попробуйте DA.SelectCommand = objCmd DA.Fill(DS, XLData) Catch ex As Exception logError(ex) End Try RowCount = DS.Tables(0).Rows.Count ColumnCount = DS.Tables(0).Columns.Count Str = Для i As Integer = 0 To ColumnCount - 1 Str &= DS.Tables(0).Columns(i).ColumnName & , Next ObjStreamWriter.WriteLine(Str) - person ; 23.06.2009
comment
For OuterCount = 0 To RowCount - 1 Str = For InnerCount = 0 To ColumnCount - 1 If DS.Tables(0).Rows(OuterCount).Item(InnerCount).ToString.Contains(,) Then Str &= DS.Tables( 0).Rows(OuterCount).Item(InnerCount).ToString.Replace(,, .) Str &= , Else Str &= DS.Tables(0).Rows(OuterCount).Item(InnerCount) & , End If Next 'Str &= , ObjStreamWriter.WriteLine(Str) Далее - person ; 23.06.2009
comment
ObjStreamWriter.WriteLine(Str) Next ObjStreamWriter.Close() Попытаться перехватить ex As Exception logError(ex) End Попытаться objCmd.Dispose() objCmd = Ничего objConn.Close() objConn.Dispose() objConn = Ничего Перехватить ex As Exception logError( пример) End Try End Sub Public Sub callBCPCSVBatch() Try Dim targetDir As String Dim p As New Process p.StartInfo.CreateNoWindow = True targetDir = C:\BCP\ - person ; 23.06.2009
comment
p.StartInfo.WorkingDirectory = targetDir p.StartInfo.FileName = BCPCSV.bat p.Start() p.WaitForExit() deleteXLS() Process.GetCurrentProcess.Kill() Public Sub callRFSRDecompressBatch() Try Dim targetDir As String Dim p As New Процесс p.StartInfo.CreateNoWindow = True - person ; 23.06.2009
comment
targetDir = currentDir + \Filez p.StartInfo.WorkingDirectory = targetDir p.StartInfo.FileName = RFSRDecompress.bat p.Start() p.WaitForExit() Catch ex As Exception logError(ex) End Try End Sub Public Sub logError(ByVal ex ) Dim SW As New StreamWriter(c:\BCP\BCPErrorLog.txt) SW.WriteLine(ex.ToString) SW.Close() End Sub End Module - person ; 23.06.2009
comment
Код для двух пакетных файлов DOS находится в разделе комментариев моего вопроса. Спасибо за помощь. - person ; 23.06.2009

Я нашел способ добиться нужных мне результатов. Я взял два командных файла из консольного приложения. Теперь у меня есть задача, запланированная для запуска одного пакета, консольного приложения и последнего пакета. Оба ответа, которые я получил, были правильными, он не выпускал XML из-за того, что окна консоли открывались в середине выполнения. Поскольку они были удалены, у меня больше нет ошибок. Спасибо за помощь. -Z

person Community    schedule 23.06.2009