public function batchCommand($preset, $parts = '', $batchSize = null, $identifier = null, $force = false)
    {
        try {
            $this->importService->start($identifier, $force);
        } catch (ImportAlreadyExecutedException $e) {
            $this->outputLine($e->getMessage());
            $this->outputLine('Import skipped. You can force running this import again by specifying --force.');
            $this->quit(1);
        }

        $this->startTime = microtime(true);
        $parts = Arrays::trimExplode(',', $parts);

        $identifier = $this->importService->getCurrentImportIdentifier();
        $this->outputLine('Start import with identifier <b>%s</b>', [$identifier]);

        $presetSettings = $this->loadPreset($preset);
        array_walk($presetSettings['parts'], function ($partSetting, $partName) use ($preset, $parts, $batchSize, $identifier) {
            $this->elapsedTime = 0;
            $this->batchCounter = 0;
            $this->outputLine();
            $this->outputPartTitle($partSetting, $partName);

            $partSetting['__currentPresetName'] = $preset;
            $partSetting['__currentPartName'] = $partName;
            if ($batchSize !== null) {
                $partSetting['batchSize'] = $batchSize;
            }

            $partSetting = new PresetPartDefinition($partSetting, $identifier);
            if ($parts !== array() && !in_array($partName, $parts)) {
                $this->outputLine('<error>~</error> Skipped');
                return;
            }

            if ($partSetting->getBatchSize() && $partSetting->isDebug() === false) {
                while (($count = $this->executeCommand($partSetting)) > 0) {
                    $partSetting->nextBatch();
                }
            } else {
                $this->executeCommand($partSetting);
            }
        });


        $this->importService->stop();

        $import = $this->importService->getLastImport();

        $this->outputLine();
        $this->outputLine('<b>Import finished</b>');
        $this->outputLine(sprintf('<info>-</info> Started   %s', $import->getStartTime()->format(DATE_RFC2822)));
        $this->outputLine(sprintf('<info>-</info> Finished  %s', $import->getEndTime()->format(DATE_RFC2822)));
        $this->outputLine(sprintf('<info>-</info> Runtime   %d seconds', $import->getElapsedTime()));
        $this->outputLine();
        $this->outputLine('See log for more details and possible errors.');
    }