2017-02-02 9 views
0

CMD Командная строка: Одна команда CMD, одна команда, нет BAT-файла.Командная строка CMD: одна команда плюс прямой вывод ERRORLEVEL в TXT?

Есть ли шанс получить ERRORLEVEL непосредственно в TXT-файле?

Я пробовал, но мне не удалось.

Я не хочу каждый раз создавать и сохранять BAT-файл.

Я бы предпочел более простой способ: однократная команда CMD плюс экспорт ERRORLEVEL в TXT-файле, все в одной командной строке.

Tommy

+2

Пожалуйста, перепишите свой вопрос в понятное состояние. Я едва получаю то, что вы хотите, за исключением написания 'errorlevel' в файл и что вы терпите неудачу с пакетными файлами. В этом случае я предлагаю показать указанный пакетный файл (ы) или то, с чем вы столкнулись, и немного замаскировать его :) – geisterfurz007

+0

«Я не хочу создавать и сохранять файл BAT». Это сложно понять? :-) Я хочу выполнить много команд CMD «на лету». Так что создание многих файлов BAT - это не лучший способ ... Я так думаю. В каждом случае это только одна команда. И мне нужен уровень ошибок (есть 5 или 6 целых значений, которые я мог бы получить в результате). – Donny73Ger

+0

Тогда ** не создавайте ** и ** не ** сохраняйте пакетный файл! Бум это просто! Но я думаю, что это не было вашим вопросом ... У вас есть несколько способов пойти сюда: набирайте материал каждый раз, когда вам это нужно в командной строке, создайте пакетный файл для двойного щелчка или используйте однострочные команды в переменная среды для более быстрого использования. – geisterfurz007

ответ

4

Это обычная первая идея, потерпит неудачу

(commandToExecute) & >"file.txt" echo %errorlevel% 

Проблема заключается в том, что полная командная строка анализируется и затем выполняется. Во время фазы анализа все операции чтения переменных удаляются из заменяемой команды значением, хранящимся внутри переменных, перед началом выполнения команды.

Это означает, что одна строка не может изменить переменную и получить измененное значение, поскольку в выполненной команде нет операции чтения.

примечание: в то время как это не так, то это синтаксический анализ/заменить поведение влияет на полную линию при чтении, но и ко всем линиям внутри блока, то есть, все линии заключены в круглые скобки. Когда выполнение достигает блока кода, все строки в блоке считываются, все операции считывания переменных внутри блока заменяются, а затем запускается исполняемая команда (ы).

Выполненная команда реален (supossing Равен 0 до исполнения)

(commandToExecute) & >"file.txt" echo 0 

Обычный способ борьбы с ним, чтобы включить замедленное расширение. Это позволяет вам изменить, где требуется синтаксис, используемый для доступа к переменной от %var% до !var!. Это указывает парсеру, что подстановка переменной/значения должна быть отложена до тех пор, пока команда не будет выполнена, а не при анализе строки. Это делается с помощью команды setlocal enabledelayedexpansion.

Но эта команда не действует в командной строке, только в пакетных файлах. В командной строке необходимо запустить экземпляр cmd с помощью переключателя /v, чтобы включить замедленное расширение. Если вы начинаете свой cmd экземпляр с замедленным расширением вы можете использовать

(commandToExecute) & >"file.txt" echo !errorlevel! 

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

У вас есть другая альтернатива.Вы можете написать команду таким образом, чтобы переменный получает не заменяется во время синтаксического анализа, а затем, на выполнении времени силы нового синтаксический анализ команды

(commandToExecute) & >"file.txt" call echo %^errorlevel% 

С ^ переменного не распознается, а команда анализируется и выполнен в виде

(commandToExecute) & >"file.txt" call echo %errorlevel% 

затем, когда команда call выполняется новый этап синтаксического анализа вызывается, а затем, после того, как первая команда была выполнена и errorlevel изменилось, переменная заменяется на линии и правильное значение отправляется в файл.

отредактирован адаптироваться к комментариям - просто тест сессии (извините, испанский языковой стандарт)

W:\41996740>dir /b 

W:\41996740>(commandToExecute) & >"file.txt" call echo %^errorlevel% 
"commandToExecute" no se reconoce como un comando interno o externo, 
programa o archivo por lotes ejecutable. 

W:\41996740>dir /b 
file.txt 

W:\41996740>type file.txt 
9009 

W:\41996740>(dir /b file.txt) & >"file.txt" call echo %^errorlevel% 
file.txt 

W:\41996740>type file.txt 
0 

W:\41996740>(dir /b file.exe) & >"file.txt" call echo %^errorlevel% 
No se encuentra el archivo 

W:\41996740>type file.txt 
1 

W:\41996740> 
+0

Впечатляет. Я не получил то, что хотел OP ... Хорошее объяснение! – geisterfurz007

+0

Привет, мне нужно именно это: (commandToExecute) & echo% errorlevel%> "file.txt" Но это не сработает. – Donny73Ger

+0

@ Donny73Ger, Нет, вам это не нужно, поскольку вы указываете, что это не работает. Вам нужно '(commandToExecute) &>" file.txt "call echo%^errorlevel%' –

0

Другой подход с использованием enabled Delayed Expansion (см /V:ON переключатель), просто для полноты картины:

cmd /D /V:ON /C "command to execute&>>currError.txt echo !errorlevel!" 

Примеры (выход до currError.txt расширен, чтобы содержать отметку даты и времени в дополнение к голым errorlevel):

==> type currError.txt 
The system cannot find the file specified. 

==> cmd /D /V:ON /C "echox "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 

==> cmd /D /V:ON /C "echo "x"&>>currError.txt echo %date% %time% errorlevel !errorlevel!" 
"x" 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem output fails if "command to execute" is syntactically wrong 

==> cmd /D /V:ON /C "if "x"&>currError.txt echo %date% %time% errorlevel !errorlevel!" 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 

==> rem "call" approach for the sake of completeness: 

==> echox "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
'echox' is not recognized as an internal or external command, operable program or batch file. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> rem fails as well if "command to execute" is syntactically wrong 

==> if "x"&>>currError.txt call echo %date% %time% errorlevel %errorlevel^% 
& was unexpected at this time. 

==> type currError.txt 
02.02.2017 9:12:28,34 errorlevel 9009 
02.02.2017 9:12:43,32 errorlevel 0 
02.02.2017 14:42:28,06 errorlevel 9009 

==> 
+0

Это работает: cmd/von/c "call (commandToExecute) &>" file.txt "echo! Errorlevel! – Donny73Ger

0

Во-первых, определить "р" переменную со знаком процента:

set "p=%" 

Затем используйте эту строку:

(commandToExecute) & >"file.txt" call echo %p%errorlevel%p% 

Испытано на ОС Windows 8.1

 Смежные вопросы

  • Нет связанных вопросов^_^