public function executeBatchCommand($presetName, $partName, $dataProviderClassName, $importerClassName, $currentImportIdentifier, $offset = null, $batchSize = null)
    {
        try {
            $vault = new Vault($presetName);

            $dataProviderOptions = Arrays::getValueByPath($this->settings, ['presets', $presetName, 'parts', $partName, 'dataProviderOptions']);
            $dataProviderOptions['__presetName'] = $presetName;
            $dataProviderOptions['__partName'] = $partName;

            /** @var DataProviderInterface $dataProvider */
            $dataProvider = $dataProviderClassName::create(is_array($dataProviderOptions) ? $dataProviderOptions : [], $offset, $batchSize);

            $importerOptions = Arrays::getValueByPath($this->settings, ['presets', $presetName, 'parts', $partName, 'importerOptions']);

            /** @var AbstractImporter $importer */
            $importerOptions = is_array($importerOptions) ? $importerOptions : [];
            $importerOptions['__presetName'] = $presetName;
            $importerOptions['__partName'] = $partName;
            $importer = $this->objectManager->get($importerClassName, $importerOptions, $currentImportIdentifier, $vault);
            $importer->getImportService()->addEventMessage(sprintf('%s:Batch:Started', $importerClassName), sprintf('%s batch started (%s)', $importerClassName, $dataProviderClassName));
            $importer->initialize($dataProvider);
            $importer->process();
            $importer->getImportService()->addEventMessage(sprintf('%s:Batch:Ended', $importerClassName), sprintf('%s batch ended (%s)', $importerClassName, $dataProviderClassName));
            $this->output($importer->getProcessedRecords());
        } catch (\Exception $exception) {
            $this->logger->logException($exception);
            $this->outputLine('<error>%s</error>', [$exception->getMessage()]);
            $this->sendAndExit(1);
        }
    }