Razvedka2020 40 / 35 / 9 Регистрация: 01.01.2014 Сообщений: 201 |
||||
1 |
||||
Как скрыть ошибку выполнения?22.02.2020, 22:15. Показов 13240. Ответов 8 Метки нет (Все метки)
Здравствуйте уважаемые форумчане. Решил навести красоту в своих скриптах и столкнулся с неприятностями, а именно с отображением ошибок (код импровизированный):
Вопрос: как можно избавится от отображения ошибок?
0 |
alpap 4332 / 2122 / 661 Регистрация: 26.04.2015 Сообщений: 6,823 |
||||
23.02.2020, 03:54 |
2 |
|||
1 |
Razvedka2020 40 / 35 / 9 Регистрация: 01.01.2014 Сообщений: 201 |
||||||||
23.02.2020, 05:45 [ТС] |
3 |
|||||||
Я может быть не понимаю ваш ответ, но в строке 3 я уже пробовал конструкцию (она не помогла и я ее закоментировал)
Это не помогает избавится от вывода ошибки, так же как и
Результат одинаков, на скриншоте.
0 |
6571 / 1773 / 302 Регистрация: 10.12.2013 Сообщений: 6,250 |
|
23.02.2020, 07:11 |
4 |
Решил навести красоту в своих скриптах И тут же воткнёшься носом в неразрешимое противоречие понятия красоты.
0 |
5851 / 2563 / 1007 Регистрация: 06.06.2017 Сообщений: 8,750 |
|
23.02.2020, 07:16 |
5 |
но в строке 3 я уже пробовал конструкцию А где там
0 |
Razvedka2020 40 / 35 / 9 Регистрация: 01.01.2014 Сообщений: 201 |
||||
23.02.2020, 07:20 [ТС] |
6 |
|||
А где там 2>nul спереди? Можно для особо «одаренных» пояснить что за
или где про это почитать?
0 |
6571 / 1773 / 302 Регистрация: 10.12.2013 Сообщений: 6,250 |
|
23.02.2020, 07:47 |
7 |
Сообщение было отмечено Razvedka2020 как решение Решение Программная абстракция существования стандартных файловых потоков в виде их описателей (handles) Код ECHO "раз два три-пять зайтчик погулять" 1 > NUL 2 > &1 интерпретатор распознает сочетание 1 > 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.
asked Nov 30, 2013 at 9:35
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 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
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 commandecho| set /p="..."
ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless commandecho| 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.
asked Nov 30, 2013 at 9:35
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 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
user1976user1976
3333 silver badges14 bronze badges
Razvedka2020 38 / 33 / 9 Регистрация: 01.01.2014 Сообщений: 191 |
||||
1 |
||||
Как скрыть ошибку выполнения?22.02.2020, 22:15. Показов 5586. Ответов 8 Метки нет (Все метки)
Здравствуйте уважаемые форумчане. Решил навести красоту в своих скриптах и столкнулся с неприятностями, а именно с отображением ошибок (код импровизированный):
Вопрос: как можно избавится от отображения ошибок?
__________________ 0 |
alpap 4330 / 2120 / 661 Регистрация: 26.04.2015 Сообщений: 6,823 |
||||
23.02.2020, 03:54 |
2 |
|||
1 |
Razvedka2020 38 / 33 / 9 Регистрация: 01.01.2014 Сообщений: 191 |
||||||||
23.02.2020, 05:45 [ТС] |
3 |
|||||||
Я может быть не понимаю ваш ответ, но в строке 3 я уже пробовал конструкцию (она не помогла и я ее закоментировал)
Это не помогает избавится от вывода ошибки, так же как и
Результат одинаков, на скриншоте. 0 |
5539 / 1682 / 291 Регистрация: 10.12.2013 Сообщений: 5,934 |
|
23.02.2020, 07:11 |
4 |
Решил навести красоту в своих скриптах И тут же воткнёшься носом в неразрешимое противоречие понятия красоты. 0 |
5286 / 2479 / 983 Регистрация: 06.06.2017 Сообщений: 8,472 |
|
23.02.2020, 07:16 |
5 |
но в строке 3 я уже пробовал конструкцию А где там 0 |
Razvedka2020 38 / 33 / 9 Регистрация: 01.01.2014 Сообщений: 191 |
||||
23.02.2020, 07:20 [ТС] |
6 |
|||
А где там 2>nul спереди? Можно для особо «одаренных» пояснить что за
или где про это почитать? 0 |
5539 / 1682 / 291 Регистрация: 10.12.2013 Сообщений: 5,934 |
|
23.02.2020, 07:47 |
7 |
Сообщение было отмечено Razvedka2020 как решение Решение Программная абстракция существования стандартных файловых потоков в виде их описателей (handles) Код ECHO "раз два три-пять зайтчик погулять" 1 > NUL 2 > &1 интерпретатор распознает сочетание 1 > 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 commandecho| set /p="..."
ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless commandecho| 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 commandecho| set /p="..."
ends: 0 if writing the file succeeded, 1 if it failed. On the contrary, using a nameless commandecho| 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, но чтобы сделать невидимым окно самой командной строки, потребуется нечто иное.
Решение очень простое. Чтобы скрыть исполнение 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-скрипт, а он в свою очередь запустит ваш «батник», который выполнится в скрытом режиме. Столь раздражающего вас чёрного окна командной строки вы больше не увидите.
Наверное, кто-то из наших читателей спросит: а для чего все эти сложности? Неужели то, что делает файл CMD, не может сделать VBS? Может, просто язык Visual Basic Script знают весьма немногие, а с командной строкой более или менее хорошо знакомы все, кто считает себя продвинутым пользователем.
Загрузка…
Содержание
Отключение отображения ошибок
Информация в данном разделе актуальна для Windows 10: 1607, 1809.
Для проверки отключения сообщений об ошибках Вы можете воспользоваться
любой программой, которая не работает под Windows и выдает ошибку.
Для отключения отображения ошибок необходимо в реестре «HKLMSYSTEMCurrentControlSetControlWindows» изменить
значение параметра «ErrorMode». Допустимые значения параметров:
-
«0» — Отображать все сообщения
-
«1» — Отключить только сообщения об ошибках системы
-
«2» — Отключить все сообщения об ошибках
Ниже описаны возможные способы изменения параметра
С помощью графического интерфейса
-
Перейдите по пути реестра «HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlWindows»
-
Раскройте значение «ErrorMode» двойным нажатием левой кнопки мыши, значение находится в правой части редактора реестра.
-
Измените значение параметра на необходимое. Допустимые параметры описаны в начале статьи.
-
Нажмите «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
Команда делает две вещи:
- гарантирует, что любые переменные среды, которые вы устанавливаете или изменяете в этом скрипте, не повлияют на вызывающую среду.
- гарантирует, что расширения команд включены. Расширения команд хороши
Если вы хотите произвести впечатление на своих друзей, написав сложные и полезные сценарии в пакетной программе (задача, которая когда-то считалась невыполнимой), внимательно прочитайте и изучите встроенную документацию по каждой из этих команд:
- if
- набор
- называть
- для
- CMD
Вам придется использовать все приемы и нюансы, которые могут предложить эти команды, чтобы писать действительно хорошие сценарии.
Например: set
Команда может использоваться для многих задач:
-
Простое задание:
set myDir=C:Foo
-
Выполнение математики:
set /a myCount=myCount + 1
-
Запрос на ввод:
set /p myColor=What is favorite color
-
Извлечение подстрок:
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
-
Предложено в качестве ответа