Как я получаю ошибочный уровень команд в канале в программировании пакета Windows?

выглядит как ошибка в компоненте Symfony VarDumper , в /vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php рядом со строкой 101, замените

    if (null !== $this->projectDir) {
        $context['project_dir'] = $this->projectDir;
        if (0 === strpos($file, $this->projectDir)) {
            $context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
        }
    }

на

    if (isset($this->projectDir) && is_string($this->projectDir) && strlen($this->projectDir) > 0) {
        $context['project_dir'] = $this->projectDir;
        if (0 === strpos($file, $this->projectDir)) {
            $context['file_relative'] = ltrim(substr($file, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
        }
    }

, который должен это исправить ,

кто-то должен также подать отчет об ошибке, чтобы он был исправлен вверх по течению.

29
задан Peter Mortensen 4 June 2013 в 09:51
поделиться

3 ответа

Одним из способов решения проблемы является косвенное обращение к файлу.

Примерно так

foo.exe > tmp.txt
set FOOERR=%ERRORLEVEL%
cat tmp.txt
exit %FOOERR%
3
ответ дан 28 November 2019 в 02:06
поделиться

После примерно одного дня раскопок я нашел способ сделать это:

set error_=0
9>&1 1>&2 2>&9 (for /f "delims=" %%i in ('9^>^&1 1^>^&2 2^>^&9 ^(^(^(2^>^&1 call "%homeDir%%1"^) ^|^| ^(1^>^&2 2^>nul echo FAILED^)^) ^| 2^>nul "%homeDir%mtee" /T /+ "%homeDir%logs\%date_%_%1.log"^)') do (set error_=1))

exit /b %error_%

В приведенном выше примере выполняется "%homeDir%%1" и его вывод передается в "%homeDir%mtee". Эта строка обнаруживает сбои (я бы предложил вам нарисовать диаграмму контекстов пакетов и их назначений stdin/stdout/stderr, чтобы понять, что она делает :-). ). Я не нашел хорошего способа извлечь реальный уровень ошибок. Лучше всего мне удалось заменить команду 'echo' на какой-нибудь вызов пакетного скрипта 'call rc.bat', который выглядит как:

@echo %errorlevel%

а затем заменить 'set error_=1' на 'set error_=%%i'.

Но проблема в том, что этот вызов тоже может дать сбой, и это не так просто обнаружить. Тем не менее, это намного лучше, чем ничего - я не нашел решения для этого в интернете.

2
ответ дан 28 November 2019 в 02:06
поделиться

Вы можете решить проблему, создав обертку вокруг вашего командного файла:

rem wrapper for command file, wrapper.cmd

call foo.exe

echo %errorlevel%

if errorlevel 1 goto...

Затем добавьте tee к обертке:

wrapper.cmd | tee result.log

Конечно, это не совсем то же самое, например, если вы хотите войти в несколько файлов в обернутом файле, это невозможно, но в моем случае это решило проблему.

1
ответ дан 28 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: