Отключить вывод ошибок cmd

Razvedka2020

40 / 35 / 9

Регистрация: 01.01.2014

Сообщений: 201

1

Как скрыть ошибку выполнения?

22.02.2020, 22:15. Показов 13240. Ответов 8

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте уважаемые форумчане. Решил навести красоту в своих скриптах и столкнулся с неприятностями, а именно с отображением ошибок (код импровизированный):

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET HKLM_WINSENT="HKLMSoftwareWinsent SoftwareWinSent MessengerOptions"
 
::REG QUERY %HKLM_WINSENT% > NUL
REG QUERY %HKLM_WINSENT% || ECHO Идем дальше...
 
IF %ERRORLEVEL% EQU 1 (
::ECHO Код ошибки: %ERRORLEVEL%
GOTO Step2
) ELSE (
ECHO Какие-то команды - 6 (new_file)
ECHO Какие-то команды - 7 (new_file)
)
 
: Step2
PAUSE

Как скрыть ошибку выполнения?

Вопрос: как можно избавится от отображения ошибок?
Всем заранее большое человеческое спасибо.



0



alpap

4332 / 2122 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

23.02.2020, 03:54

2

Windows Batch file
1
2
3
3 ...
4 2>nul ...
5 ...



1



Razvedka2020

40 / 35 / 9

Регистрация: 01.01.2014

Сообщений: 201

23.02.2020, 05:45

 [ТС]

3

Я может быть не понимаю ваш ответ, но в строке 3 я уже пробовал конструкцию (она не помогла и я ее закоментировал)

Bash
1
REG QUERY %HKLM_WINSENT% > NUL

Это не помогает избавится от вывода ошибки, так же как и

Bash
1
REG QUERY %HKLM_WINSENT% || ECHO Идем дальше...

Результат одинаков, на скриншоте.



0



6571 / 1773 / 302

Регистрация: 10.12.2013

Сообщений: 6,250

23.02.2020, 07:11

4

Цитата
Сообщение от Razvedka2020
Посмотреть сообщение

Решил навести красоту в своих скриптах

И тут же воткнёшься носом в неразрешимое противоречие понятия красоты.



0



5851 / 2563 / 1007

Регистрация: 06.06.2017

Сообщений: 8,750

23.02.2020, 07:16

5

Цитата
Сообщение от Razvedka2020
Посмотреть сообщение

но в строке 3 я уже пробовал конструкцию

А где там 2>nul спереди?



0



Razvedka2020

40 / 35 / 9

Регистрация: 01.01.2014

Сообщений: 201

23.02.2020, 07:20

 [ТС]

6

Цитата
Сообщение от FlasherX
Посмотреть сообщение

А где там 2>nul спереди?

Можно для особо «одаренных» пояснить что за

Bash
1
2>nul

или где про это почитать?



0



6571 / 1773 / 302

Регистрация: 10.12.2013

Сообщений: 6,250

23.02.2020, 07:47

7

Лучший ответ Сообщение было отмечено Razvedka2020 как решение

Решение

Программная абстракция существования стандартных файловых потоков в виде их описателей (handles)
STDIN, STDOUT и STDERR
исторически поддерживается в командных оболочках с помощью чисел соответственно
0, 1 и 2
и загадочных значков
> < &

Код

ECHO "раз два три-пять зайтчик погулять"  1 > NUL   2 > &1

интерпретатор распознает сочетание 1 > NUL ( {одинокая цифра}
как инструкцию направить стандартный поток вывода (цифра 1 — это STDOUT) в устройство NUL,
а также направить стандартный поток ошибок ( цифра 2 — это STDERR ) в стандартный поток вывода,
который в нашем случае назначен уже для вывода в NUL. Чтобы отличать реальное имя файла от абстрактного описателя перед последним ставят значок &.



1



5851 / 2563 / 1007

Регистрация: 06.06.2017

Сообщений: 8,750

23.02.2020, 08:11

8

Лучший ответ Сообщение было отмечено Razvedka2020 как решение

Решение



1



40 / 35 / 9

Регистрация: 01.01.2014

Сообщений: 201

23.02.2020, 08:14

 [ТС]

9

Большое вам всем человеческое спасибо. Не зря говорят: Век живи, век учись…



0



Let’s say I already have a folder created on the next path file: "C:userscharqusdesktopMyFolder", and I run the next command on CMD:

mkdir "C:userscharqusdesktopMyFolder"

I get a message like this: «A subdirectory or file C:userscharqusdesktopMyFolder already exists».

Therefore, is there any command in the commandline to get rid of this returned messages?
I tried echo off but this is not what I looking for.

a_horse_with_no_name's user avatar

asked Nov 30, 2013 at 9:35

charqus's user avatar

1

Redirect the output to nul

mkdir "C:userscharqusdesktopMyFolder" > nul

Depending on the command, you may also need to redirect errors too:

mkdir "C:userscharqusdesktopMyFolder" > nul 2> nul

Microsoft describes the options here, which is useful reading.

answered Nov 30, 2013 at 9:39

Roger Rowland's user avatar

Roger RowlandRoger Rowland

25.8k11 gold badges72 silver badges113 bronze badges

4

A previous answer shows how to squelch all the output from the command. This removes the helpful error text that is displayed if the command fails. A better way is shown in the following example:

C:test>dir
     Volume in drive C has no label.
     Volume Serial Number is 4E99-B781

     Directory of C:test

    20/08/2015  20:18    <DIR>          .
    20/08/2015  20:18    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  214,655,188,992 bytes free

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

As is demonstrated above this command successfully suppress the original warning. However, if the directory can not be created, as in the following example:

C:test>icacls c:test /deny "Authenticated Users":(GA)
processed file: c:test
Successfully processed 1 files; Failed processing 0 files

C:test>dir new_dir2 >nul 2>nul || mkdir new_dir2 >nul 2>nul || mkdir new_dir2
Access is denied.

Then as can be seen, an error message is displayed describing the problem.

answered Aug 7, 2015 at 13:07

user1976's user avatar

user1976user1976

3534 silver badges15 bronze badges

Thanks for your quick answers, i really appreciate.

Microsoft has been telling us for over a decade that PowerShell is the future of scripting.

I know indeed. I’m currently optimizing my own application in Batch+third party tools (a retrogame launcher, the main Batch script is about 41000 lines) by improving various stuffs here and there, so i guess Powershell will wait for a next project (smile). But anyway thanks for your advice, you’re right.

Alternatively you could use the same method to reset the read only attribute, write to the file, then apply the read only attribute again:

This dir /A:-DR /B is nice and fast way to test if a file is read-only, indeed. There may be benefits to proceed in this way instead of 1. grabbing the file attribute with a more conventional for %%F in ("MyReadOnlyFile.txt") do set "file.attr=%%~aF" then 2. testing the second character by enabling delayed expansion. I will check where i can use it in my code to optimize some parts slightly, thank you for your suggestion Compo.

The error isn’t written to STDERR, but to STDOUT (don’t ask me, why), so echo( >»MyReadOnlyFile.txt» 1>nul suppresses the error message (sadly along with any possible useful output)

Thanks for your answer Stephan. Well, we know that Batch is quite insane often, but a such behavior would be more than insanity (smile). Redirecting stdout 1>nul doesn’t hide the error message (as expected). However, surrounding the command and file redirection with brackets works as expected:

(echo( >"MyReadOnlyFile.txt") 2>nul

It might be a possible typing error on SS64 about the position of surrounding brackets, it should be (command >"filename") 2>nul. The error message is redidrected to stderr as expected, confirmed by the following if you open the «stderr.txt» file.

(echo( >"MyReadOnlyFile.txt") 2>"stderr.txt"

Again thank you to have replied, i did read a ton of threads on stackoverflow during the whole development of my application but i never subscribed. So that’s a special feeling to have opened an account finally.

EDIT
I also add these two in case it can help someone.

rem Merge stderr to stdout.
set "_mute=>nul 2>&1" & set "_mute1=1>nul" & set "_mute2=2>nul"

rem Force ERRORLEVEL to 0.
set "_errlev0=(call )"

rem If you're lazy to type it each time (i am !).
set "_ede=enabledelayedexpansion"

rem Existing file name.
set "file.path=MyTestFile.txt"

rem Paths to the SQLite executable and SQLite database (example).
set "sqlite_file.path=C:SQLiteSQLite.exe"
set "db_file.path=C:DatabaseMyBase.db"

setlocal %_ede%
rem --- Test1 ---
%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(echo| set /p dummy_name="Hello & world">>"!file.path!") %_mute% && (
  echo Test1 succeeded
) || (
  echo Test1 failed
)
echo %ERRORLEVEL=!ERRORLEVEL!


rem --- Test2 ---
:: Whatever SQLite query of your choice.
set "sql_query=SELECT arcade_t.description FROM arcade_t WHERE arcade_t.description LIKE '%%Capcom%%'"
set "sql_bad_query=_!sql_query!"

%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(>>"!file.path!" "!sqlite_file.path!" "!db_file.path!" "!sql_query!") %_mute% && (
  echo Test2 succeeded
) || (
  echo Test2 failed
)
echo ERRORLEVEL=!ERRORLEVEL!

endlocal
  • Surrounding the WHOLE command echo| set /p dummy_name="..." with brackets (as mentionned above, cf typing error in the SS64 page) and muting both stdout+stderr (or stderr only with %_mute2%) will hide the error message if writing the file failed.

  • Mentionning a variable name in the command set /p dummy_name="..." sets ERRORLEVEL as expected once the command echo| set /p="..." ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless command echo| set /p ="..." sets ERRORLEVEL to 1 even if writing the file succeeded, so should be avoided.

  • Again, surrounding the WHOLE SQLite command with brackets will hide the «Acces is denied.» message but the SQLite «Error: near «_SELECT»: syntax error» error message as well in case the SQLite query is syntaxically incorrect. This has has been tested and confirmed by replacing the proper query with the bad one sql_bad_query.

Let’s say I already have a folder created on the next path file: "C:userscharqusdesktopMyFolder", and I run the next command on CMD:

mkdir "C:userscharqusdesktopMyFolder"

I get a message like this: «A subdirectory or file C:userscharqusdesktopMyFolder already exists».

Therefore, is there any command in the commandline to get rid of this returned messages?
I tried echo off but this is not what I looking for.

a_horse_with_no_name's user avatar

asked Nov 30, 2013 at 9:35

charqus's user avatar

1

Redirect the output to nul

mkdir "C:userscharqusdesktopMyFolder" > nul

Depending on the command, you may also need to redirect errors too:

mkdir "C:userscharqusdesktopMyFolder" > nul 2> nul

Microsoft describes the options here, which is useful reading.

answered Nov 30, 2013 at 9:39

Roger Rowland's user avatar

Roger RowlandRoger Rowland

25.6k11 gold badges71 silver badges113 bronze badges

4

A previous answer shows how to squelch all the output from the command. This removes the helpful error text that is displayed if the command fails. A better way is shown in the following example:

C:test>dir
     Volume in drive C has no label.
     Volume Serial Number is 4E99-B781

     Directory of C:test

    20/08/2015  20:18    <DIR>          .
    20/08/2015  20:18    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  214,655,188,992 bytes free

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

As is demonstrated above this command successfully suppress the original warning. However, if the directory can not be created, as in the following example:

C:test>icacls c:test /deny "Authenticated Users":(GA)
processed file: c:test
Successfully processed 1 files; Failed processing 0 files

C:test>dir new_dir2 >nul 2>nul || mkdir new_dir2 >nul 2>nul || mkdir new_dir2
Access is denied.

Then as can be seen, an error message is displayed describing the problem.

answered Aug 7, 2015 at 13:07

user1976's user avatar

user1976user1976

3333 silver badges14 bronze badges

Razvedka2020

38 / 33 / 9

Регистрация: 01.01.2014

Сообщений: 191

1

Как скрыть ошибку выполнения?

22.02.2020, 22:15. Показов 5586. Ответов 8

Метки нет (Все метки)


Здравствуйте уважаемые форумчане. Решил навести красоту в своих скриптах и столкнулся с неприятностями, а именно с отображением ошибок (код импровизированный):

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET HKLM_WINSENT="HKLMSoftwareWinsent SoftwareWinSent MessengerOptions"
 
::REG QUERY %HKLM_WINSENT% > NUL
REG QUERY %HKLM_WINSENT% || ECHO Идем дальше...
 
IF %ERRORLEVEL% EQU 1 (
::ECHO Код ошибки: %ERRORLEVEL%
GOTO Step2
) ELSE (
ECHO Какие-то команды - 6 (new_file)
ECHO Какие-то команды - 7 (new_file)
)
 
: Step2
PAUSE

Как скрыть ошибку выполнения?

Вопрос: как можно избавится от отображения ошибок?
Всем заранее большое человеческое спасибо.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

alpap

4330 / 2120 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

23.02.2020, 03:54

2

Windows Batch file
1
2
3
3 ...
4 2>nul ...
5 ...

1

Razvedka2020

38 / 33 / 9

Регистрация: 01.01.2014

Сообщений: 191

23.02.2020, 05:45

 [ТС]

3

Я может быть не понимаю ваш ответ, но в строке 3 я уже пробовал конструкцию (она не помогла и я ее закоментировал)

Bash
1
REG QUERY %HKLM_WINSENT% > NUL

Это не помогает избавится от вывода ошибки, так же как и

Bash
1
REG QUERY %HKLM_WINSENT% || ECHO Идем дальше...

Результат одинаков, на скриншоте.

0

5539 / 1682 / 291

Регистрация: 10.12.2013

Сообщений: 5,934

23.02.2020, 07:11

4

Цитата
Сообщение от Razvedka2020
Посмотреть сообщение

Решил навести красоту в своих скриптах

И тут же воткнёшься носом в неразрешимое противоречие понятия красоты.

0

5286 / 2479 / 983

Регистрация: 06.06.2017

Сообщений: 8,472

23.02.2020, 07:16

5

Цитата
Сообщение от Razvedka2020
Посмотреть сообщение

но в строке 3 я уже пробовал конструкцию

А где там 2>nul спереди?

0

Razvedka2020

38 / 33 / 9

Регистрация: 01.01.2014

Сообщений: 191

23.02.2020, 07:20

 [ТС]

6

Цитата
Сообщение от FlasherX
Посмотреть сообщение

А где там 2>nul спереди?

Можно для особо «одаренных» пояснить что за

Bash
1
2>nul

или где про это почитать?

0

5539 / 1682 / 291

Регистрация: 10.12.2013

Сообщений: 5,934

23.02.2020, 07:47

7

Лучший ответ Сообщение было отмечено Razvedka2020 как решение

Решение

Программная абстракция существования стандартных файловых потоков в виде их описателей (handles)
STDIN, STDOUT и STDERR
исторически поддерживается в командных оболочках с помощью чисел соответственно
0, 1 и 2
и загадочных значков
> < &

Код

ECHO "раз два три-пять зайтчик погулять"  1 > NUL   2 > &1

интерпретатор распознает сочетание 1 > NUL ( {одинокая цифра}
как инструкцию направить стандартный поток вывода (цифра 1 — это STDOUT) в устройство NUL,
а также направить стандартный поток ошибок ( цифра 2 — это STDERR ) в стандартный поток вывода,
который в нашем случае назначен уже для вывода в NUL. Чтобы отличать реальное имя файла от абстрактного описателя перед последним ставят значок &.

1

5286 / 2479 / 983

Регистрация: 06.06.2017

Сообщений: 8,472

23.02.2020, 08:11

8

Лучший ответ Сообщение было отмечено Razvedka2020 как решение

Решение

1

38 / 33 / 9

Регистрация: 01.01.2014

Сообщений: 191

23.02.2020, 08:14

 [ТС]

9

Большое вам всем человеческое спасибо. Не зря говорят: Век живи, век учись…

0

Thanks for your quick answers, i really appreciate.

Microsoft has been telling us for over a decade that PowerShell is the future of scripting.

I know indeed. I’m currently optimizing my own application in Batch+third party tools (a retrogame launcher, the main Batch script is about 41000 lines) by improving various stuffs here and there, so i guess Powershell will wait for a next project (smile). But anyway thanks for your advice, you’re right.

Alternatively you could use the same method to reset the read only attribute, write to the file, then apply the read only attribute again:

This dir /A:-DR /B is nice and fast way to test if a file is read-only, indeed. There may be benefits to proceed in this way instead of 1. grabbing the file attribute with a more conventional for %%F in ("MyReadOnlyFile.txt") do set "file.attr=%%~aF" then 2. testing the second character by enabling delayed expansion. I will check where i can use it in my code to optimize some parts slightly, thank you for your suggestion Compo.

The error isn’t written to STDERR, but to STDOUT (don’t ask me, why), so echo( >»MyReadOnlyFile.txt» 1>nul suppresses the error message (sadly along with any possible useful output)

Thanks for your answer Stephan. Well, we know that Batch is quite insane often, but a such behavior would be more than insanity (smile). Redirecting stdout 1>nul doesn’t hide the error message (as expected). However, surrounding the command and file redirection with brackets works as expected:

(echo( >"MyReadOnlyFile.txt") 2>nul

It might be a possible typing error on SS64 about the position of surrounding brackets, it should be (command >"filename") 2>nul. The error message is redidrected to stderr as expected, confirmed by the following if you open the «stderr.txt» file.

(echo( >"MyReadOnlyFile.txt") 2>"stderr.txt"

Again thank you to have replied, i did read a ton of threads on stackoverflow during the whole development of my application but i never subscribed. So that’s a special feeling to have opened an account finally.

EDIT
I also add these two in case it can help someone.

rem Merge stderr to stdout.
set "_mute=>nul 2>&1" & set "_mute1=1>nul" & set "_mute2=2>nul"

rem Force ERRORLEVEL to 0.
set "_errlev0=(call )"

rem If you're lazy to type it each time (i am !).
set "_ede=enabledelayedexpansion"

rem Existing file name.
set "file.path=MyTestFile.txt"

rem Paths to the SQLite executable and SQLite database (example).
set "sqlite_file.path=C:SQLiteSQLite.exe"
set "db_file.path=C:DatabaseMyBase.db"

setlocal %_ede%
rem --- Test1 ---
%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(echo| set /p dummy_name="Hello & world">>"!file.path!") %_mute% && (
  echo Test1 succeeded
) || (
  echo Test1 failed
)
echo %ERRORLEVEL=!ERRORLEVEL!


rem --- Test2 ---
:: Whatever SQLite query of your choice.
set "sql_query=SELECT arcade_t.description FROM arcade_t WHERE arcade_t.description LIKE '%%Capcom%%'"
set "sql_bad_query=_!sql_query!"

%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(>>"!file.path!" "!sqlite_file.path!" "!db_file.path!" "!sql_query!") %_mute% && (
  echo Test2 succeeded
) || (
  echo Test2 failed
)
echo ERRORLEVEL=!ERRORLEVEL!

endlocal
  • Surrounding the WHOLE command echo| set /p dummy_name="..." with brackets (as mentionned above, cf typing error in the SS64 page) and muting both stdout+stderr (or stderr only with %_mute2%) will hide the error message if writing the file failed.

  • Mentionning a variable name in the command set /p dummy_name="..." sets ERRORLEVEL as expected once the command echo| set /p="..." ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless command echo| set /p ="..." sets ERRORLEVEL to 1 even if writing the file succeeded, so should be avoided.

  • Again, surrounding the WHOLE SQLite command with brackets will hide the «Acces is denied.» message but the SQLite «Error: near «_SELECT»: syntax error» error message as well in case the SQLite query is syntaxically incorrect. This has has been tested and confirmed by replacing the proper query with the bad one sql_bad_query.

Thanks for your quick answers, i really appreciate.

Microsoft has been telling us for over a decade that PowerShell is the future of scripting.

I know indeed. I’m currently optimizing my own application in Batch+third party tools (a retrogame launcher, the main Batch script is about 41000 lines) by improving various stuffs here and there, so i guess Powershell will wait for a next project (smile). But anyway thanks for your advice, you’re right.

Alternatively you could use the same method to reset the read only attribute, write to the file, then apply the read only attribute again:

This dir /A:-DR /B is nice and fast way to test if a file is read-only, indeed. There may be benefits to proceed in this way instead of 1. grabbing the file attribute with a more conventional for %%F in ("MyReadOnlyFile.txt") do set "file.attr=%%~aF" then 2. testing the second character by enabling delayed expansion. I will check where i can use it in my code to optimize some parts slightly, thank you for your suggestion Compo.

The error isn’t written to STDERR, but to STDOUT (don’t ask me, why), so echo( >»MyReadOnlyFile.txt» 1>nul suppresses the error message (sadly along with any possible useful output)

Thanks for your answer Stephan. Well, we know that Batch is quite insane often, but a such behavior would be more than insanity (smile). Redirecting stdout 1>nul doesn’t hide the error message (as expected). However, surrounding the command and file redirection with brackets works as expected:

(echo( >"MyReadOnlyFile.txt") 2>nul

It might be a possible typing error on SS64 about the position of surrounding brackets, it should be (command >"filename") 2>nul. The error message is redidrected to stderr as expected, confirmed by the following if you open the «stderr.txt» file.

(echo( >"MyReadOnlyFile.txt") 2>"stderr.txt"

Again thank you to have replied, i did read a ton of threads on stackoverflow during the whole development of my application but i never subscribed. So that’s a special feeling to have opened an account finally.

EDIT
I also add these two in case it can help someone.

rem Merge stderr to stdout.
set "_mute=>nul 2>&1" & set "_mute1=1>nul" & set "_mute2=2>nul"

rem Force ERRORLEVEL to 0.
set "_errlev0=(call )"

rem If you're lazy to type it each time (i am !).
set "_ede=enabledelayedexpansion"

rem Existing file name.
set "file.path=MyTestFile.txt"

rem Paths to the SQLite executable and SQLite database (example).
set "sqlite_file.path=C:SQLiteSQLite.exe"
set "db_file.path=C:DatabaseMyBase.db"

setlocal %_ede%
rem --- Test1 ---
%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(echo| set /p dummy_name="Hello & world">>"!file.path!") %_mute% && (
  echo Test1 succeeded
) || (
  echo Test1 failed
)
echo %ERRORLEVEL=!ERRORLEVEL!


rem --- Test2 ---
:: Whatever SQLite query of your choice.
set "sql_query=SELECT arcade_t.description FROM arcade_t WHERE arcade_t.description LIKE '%%Capcom%%'"
set "sql_bad_query=_!sql_query!"

%_errlev0%
echo ERRORLEVEL=!ERRORLEVEL!
(>>"!file.path!" "!sqlite_file.path!" "!db_file.path!" "!sql_query!") %_mute% && (
  echo Test2 succeeded
) || (
  echo Test2 failed
)
echo ERRORLEVEL=!ERRORLEVEL!

endlocal
  • Surrounding the WHOLE command echo| set /p dummy_name="..." with brackets (as mentionned above, cf typing error in the SS64 page) and muting both stdout+stderr (or stderr only with %_mute2%) will hide the error message if writing the file failed.

  • Mentionning a variable name in the command set /p dummy_name="..." sets ERRORLEVEL as expected once the command echo| set /p="..." ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless command echo| set /p ="..." sets ERRORLEVEL to 1 even if writing the file succeeded, so should be avoided.

  • Again, surrounding the WHOLE SQLite command with brackets will hide the «Acces is denied.» message but the SQLite «Error: near «_SELECT»: syntax error» error message as well in case the SQLite query is syntaxically incorrect. This has has been tested and confirmed by replacing the proper query with the bad one sql_bad_query.

Если вам уже доводилось иметь дело со скриптами CMD или BAT, то наверняка вы заметили в их работе одну особенность: в процессе исполнения скрипта на экране компьютера появляется чёрное окошко командной строки. В этом нет ничего необычного, просто иногда вид этого чёрного прямоугольника действуют раздражающе.

Вы можете скрыть вывод выполняемых в консоли команд, добавив в начало файла CMD или BAT строчку @echo off, но чтобы сделать невидимым окно самой командной строки, потребуется нечто иное.

@echo off

Решение очень простое. Чтобы скрыть исполнение CMD- или BAT-файла, мы прибегнем к помощи другого скрипта, написанного на языке Visual Basic Script.

Откройте Блокнот, Notepad++ или другой текстовый редактор, скопируйте и вставьте в него следующий код:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:script.cmd" & Chr(34), 0
Set WshShell = Nothing

В данном примере путь к файлу командной строки выглядит как C:script.cmd, у вас же он может быть другим. Сохраните файл, дав ему произвольное имя и обязательное расширение VBS. Обратите внимание — кавычки в коде должны быть прямыми, иначе при запуске скрипта получите ошибку.

VBS

Когда вам нужно будет выполнить файл командной строки, запустите VBS-скрипт, а он в свою очередь запустит ваш «батник», который выполнится в скрытом режиме. Столь раздражающего вас чёрного окна командной строки вы больше не увидите.

Наверное, кто-то из наших читателей спросит: а для чего все эти сложности? Неужели то, что делает файл CMD, не может сделать VBS? Может, просто язык Visual Basic Script знают весьма немногие, а с командной строкой более или менее хорошо знакомы все, кто считает себя продвинутым пользователем.

Загрузка…

Содержание

Отключение отображения ошибок

Информация в данном разделе актуальна для Windows 10: 1607, 1809.

Для проверки отключения сообщений об ошибках Вы можете воспользоваться
любой программой, которая не работает под Windows и выдает ошибку.

Для отключения отображения ошибок необходимо в реестре «HKLMSYSTEMCurrentControlSetControlWindows» изменить
значение параметра «ErrorMode». Допустимые значения параметров:

  • «0» — Отображать все сообщения

  • «1» — Отключить только сообщения об ошибках системы

  • «2» — Отключить все сообщения об ошибках

Ниже описаны возможные способы изменения параметра

С помощью графического интерфейса

  1. Перейдите по пути реестра «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlWindows»

  2. Раскройте значение «ErrorMode» двойным нажатием левой кнопки мыши, значение находится в правой части редактора реестра.

  3. Измените значение параметра на необходимое. Допустимые параметры описаны в начале статьи.

  4. Нажмите «Enter»

С помощью консоли

CMD

Пример установки значения «2» параметру «ErrorMode»

Нижеуказанную команду нужно выполнить в командной строке,
которая запущена с повышенными привилегиями.

reg add "HKLMSYSTEMCurrentControlSetControlWindows" /v ErrorMode /t REG_DWORD /d 2 /f

PowerShell

Данную команду необходимо выполнять в оболочке PowerShell, запущенной
от имени администратора.

Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlWindows" -Name ErrorMode -Value 0

С помощью reg-файла

Создайте reg-файл с нижеуказанным содержимым и примените настройки reg-файла
двойным нажатием левой кнопки мыши.

Windows Registry Editor Version 5.00

;Настройка отображения сообщений об ошибках
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlWindows]
;"ErrorMode"=dword:00000000	 ;Отображать все сообщения об ошибках
;"ErrorMode"=dword:00000001	 ;Не показывать сообщения об ошибках системы. Например, о нехватке виртуальной памяти
"ErrorMode"=dword:00000002	 ;Не показывать никакие сообщения о системных ошибках. Например, об отсутствии dll

Официальная документация

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

В значении переменной окружения MYDIR может быть пробел. Когда в пути есть пробелы, большинство команд видят его как несколько параметров, поскольку пробелы используются для разделения параметров. Итак, в вашем случае, если MYDIR C:Documents and SettingsJimMy Documents тогда ваш скрипт будет пытаться выполнить список каталогов по нескольким параметрам:

  • C: Documents
  • и
  • НастройкиДжимМой
  • Необходимые документы

Попробуйте это в командной строке:

C:> mkdir learn

C:> cd learn

C:learn> mkdir peas and carrots

C:learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:learn

10/03/2012  07:26 PM    <DIR>          .
10/03/2012  07:26 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas

Хммм, три папки с именами «горох», «и», «морковь» (отсортированы по алфавиту, как я предпочитаю для команды dir). Чтобы создать папку с пробелами в имени, необходимо поставить имя папки в кавычки:

C:learn> mkdir "peas and carrots"

C:learn> dir

 Volume in drive C is OS
 Volume Serial Number is 7199-C950

 Directory of C:learn

10/03/2012  08:10 PM    <DIR>          .
10/03/2012  08:10 PM    <DIR>          ..
10/03/2012  07:26 PM    <DIR>          and
10/03/2012  07:26 PM    <DIR>          carrots
10/03/2012  07:26 PM    <DIR>          peas
10/03/2012  07:29 PM    <DIR>          peas and carrots
               0 File(s)              0 bytes
               6 Dir(s)  49,670,320,128 bytes free

Чтобы исправить эту проблему в вашем случае, добавьте кавычки вокруг пути к файлу/папке:

DIR "%MYDIR%tmp" > test.txt

Это устраняет system cannot find the file specified даже если файл делает есть проблема.

К сожалению, если файл/папка действительно не существует, вы получите такое же сообщение об ошибке. Если вы настаиваете на использовании DIR команду для этого, то вам придется перенаправить stderr ручей. Вы уже перенаправили stdout используя > оператор перенаправления. Перенаправить stderr в тот же файл ваша команда должна выглядеть так:

DIR "%MYDIR%tmp" > test.txt 2>&1

Основываясь на выходных сообщениях вашего пакетного файла, я предполагаю, что вы заинтересованы только в том, чтобы определить, существует ли %MYDIR%tmp, и вы на самом деле не хотите, чтобы список каталогов %MYDIR%tmp оставался в файле с именем test.txt. в текущем рабочем каталоге. Если вы просто проверяете, существует ли файл/папка, то с помощью DIR команда — довольно плохой выбор. Если %MYDIR%tmp является папкой, сценарий будет тратить время на получение информации о каталоге для каждого файла в этой папке. Если в этой папке тысячи файлов, это может привести к заметной задержке. Кроме того, вы поместили файл с именем test.txt в текущий рабочий каталог, который вы должны удалить перед выходом из скрипта… вы знаете… предполагая, что этот файл вам действительно не нужен.

Если вы просто хотите узнать, существует ли папка или файл, есть гораздо лучший выбор: if exist Команда идеально подходит для ваших нужд. Чтобы узнать больше о if команду, в окне командной строки Windows введите: if /?

Пример:

C:> if /?
Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

На первый взгляд документация подразумевает, что if exist работает только с файлами, но будьте уверены, что он работает как с папками, так и с файлами.

По мере того, как вы читаете if документации команды вы можете встретить фразу «если расширения команд включены…» В большинстве систем расширения команд включены по умолчанию, но мне все же нравится делать вторую строку любого скрипта setlocal EnableExtensions. Первая строка @echo off, который быстро меняется на rem @echo off пока я не закончу отладку.

Компания setlocal EnableExtensions Команда делает две вещи:

  1. гарантирует, что любые переменные среды, которые вы устанавливаете или изменяете в этом скрипте, не повлияют на вызывающую среду.
  2. гарантирует, что расширения команд включены. Расширения команд хороши

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

  • if
  • набор
  • называть
  • для
  • CMD

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

Например: set Команда может использоваться для многих задач:

  1. Простое задание:
    set myDir=C:Foo

  2. Выполнение математики:
    set /a myCount=myCount + 1

  3. Запрос на ввод:
    set /p myColor=What is favorite color

  4. Извлечение подстрок:
    set myCentury=%myYear:~0,2%

Вот как бы я написал ваш сценарий

@echo off
setlocal EnableExtensions

if exist "%MyDir%tmp" (
    echo Folder exists
) else (
    echo Folder does not exist
)

Удачи и счастливой охоты.

предположим, у меня уже есть папка, созданная в следующем файле пути:"C:userscharqusdesktopMyFolder", и я запускаю следующую команду на CMD:

mkdir "C:userscharqusdesktopMyFolder"

Я получаю такое сообщение: «подкаталог или файл C:userscharqusdesktopMyFolder уже существует».

таким образом, есть ли какая-либо команда в командной строке, чтобы избавиться от этих возвращенных сообщений?
Я попробовал echo off, но это не то, что я ищу.

2 ответов


перенаправить вывод в nul

mkdir "C:userscharqusdesktopMyFolder" > nul

В зависимости от команды вам также может потребоваться перенаправить ошибки:

mkdir "C:userscharqusdesktopMyFolder" > nul 2> nul

Microsoft описывает параметры здесь, что полезно для чтения.


предыдущий ответ показывает, как подавить все выходные данные команды. Это удаляет полезный текст ошибки, который отображается в случае сбоя команды. Лучший способ показан в следующем примере:

C:test>dir
     Volume in drive C has no label.
     Volume Serial Number is 4E99-B781

     Directory of C:test

    20/08/2015  20:18    <DIR>          .
    20/08/2015  20:18    <DIR>          ..
                   0 File(s)              0 bytes
                   2 Dir(s)  214,655,188,992 bytes free

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

C:test>dir new_dir >nul 2>nul || mkdir new_dir >nul 2>nul || mkdir new_dir

как показано выше, эта команда успешно подавляет исходное предупреждение. Однако, если каталог не может быть создан, как в следующем примере:

C:test>icacls c:test /deny "Authenticated Users":(GA)
processed file: c:test
Successfully processed 1 files; Failed processing 0 files

C:test>dir new_dir2 >nul 2>nul || mkdir new_dir2 >nul 2>nul || mkdir new_dir2
Access is denied.

затем, как видно, отображается сообщение об ошибке, описывающее проблема.


  • Remove From My Forums
  • Вопрос

  • есть скрипт…

    ——————————————————
    param ([int]$start, [int]$end = $start)
    [string]$range = ‘192.168.111.’

    function GetWmiClass {
        param ( $target = «» )
        if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
        else { return $false }
    }

    $num = $start
    while ($num -le $end) {
        $comp = $range + $num
        Write-Host $comp»:`t`t» -NoNewline -ForegroundColor Gray
          if (Test-Connection -ComputerName $comp -Quiet -Count 1) {
            If ($wmi = GetWmiClass $comp ) {
                Write-Host $wmi.Name»`t`t» -NoNewline -ForegroundColor DarkGreen
                if ($wmi.UserName) { Write-Host $wmi.UserName -ForegroundColor DarkGreen }
                else { Write-Host «Вход не выполнен»  -ForegroundColor DarkGray }
            }
            else {
                Write-Host «Ошибка доступа к WMI» -ForegroundColor DarkRed
            }
          }
        else { Write-Host «Хост не доступен» -ForegroundColor DarkGray }
        $num++
    }
    ——————————————

    на некоторых хостах видим

    ——————————————
    Get-WmiObject : Отказано в доступе. (Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED))
    D:dev.scriptsgetusers.ps1:6 знак:26
    +     if ($wmi = Get-WmiObject <<<<  -Class Win32_ComputerSystem -ComputerName $comp -ErrorAction SilentlyContinue -Authentication Call) { return $wmi }
        + CategoryInfo          : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException<br/>
        + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
    ——————————————

    как сделать чтоб ошибка не выводилась в консоль при выполнении скрипта?

    -ErrorAction SilentlyContinue указано, но ошибка всё равно прёт


    эээ…

Ответы

  • Во-первых я испробовал get-wmiobject во всех комбинациях, и с 1.0 и с 2.0, с различными типами ошибок, но при -erroraction silentlycontinue ошибка не выводится. Вы можете отключить вывод ошибок глобально, установив для переменной $ErrorActionPreference значение silentlyContinue
    Во-вторых, успешность команды лучше проверять не по наличию данных, а с помощью специальной переменной $? в которой содержится статус выполнения предыдущей команды.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: ServerEnterprise Administrator; Блог: http://xaegr.wordpress.com

    • Предложено в качестве ответа

      23 января 2010 г. 6:35

    • Помечено в качестве ответа
      OlegKrikun
      23 января 2010 г. 10:26

Понравилась статья? Поделить с друзьями:
  • Отключить аккумулятор автомобиля для сброса ошибок
  • Отключив телефон он лег спать грамматическая ошибка
  • Отключено тип wan pppoe неизвестная ошибка dir 300
  • Отключено тип wan dynl2tp неизвестная ошибка
  • Отключено тип wan dynamic неизвестная ошибка dir 300