Как сделать пакет Windows script полностью бесшумным?
Были варианты этого вопроса, заданные в течение нескольких поколений, но, несмотря на то, что вы писали некоторые довольно сложные сценарии Windows, я не могу понять, как заставить их молчать.
Ниже приведен фрагмент одного из моих текущих скриптов:
@ECHO OFF
SET scriptDirectory=%~dp0
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f"
)
ECHO
Результат:
C:\Temp> test.bat
1 file(s) copied.
File Not Found
Echo is off.
C:\Temp>
В то время как "1 файл скопирован". просто раздражает, "Файл не найден" заставляет пользователя думать, что что-то пошло не так (чего у него нет - никаких файлов не будет).
Ответы
Ответ 1
Чтобы подавить вывод, используйте перенаправление к NUL
.
Существует два вида вывода, которые используют консольные команды:
Из двух, stdout
используется чаще, как внутренними командами, такими как copy
, так и консольными утилитами или внешними командами, такими как find
и другими, а также сторонними консольными программами.
>NUL
подавляет стандартный вывод и работает нормально, например. для подавления сообщения 1 file(s) copied.
команды copy
. Альтернативный синтаксис 1>NUL
. Таким образом,
COPY file1 file2 >NUL
или
COPY file1 file2 1>NUL
или
>NUL COPY file1 file2
или
1>NUL COPY file1 file2
подавляет весь стандартный вывод copy
.
Чтобы подавить сообщения об ошибках, которые обычно печатаются на stderr
, используйте 2>NUL
. Таким образом, чтобы подавить сообщение File Not Found
, которое DEL
выводит, когда, ну, указанный файл не найден, просто добавьте 2>NUL
либо в начале, либо в конце командной строки:
DEL file 2>NUL
или
2>NUL DEL file
Хотя иногда может быть лучше понять, действительно ли файл существует, прежде чем пытаться удалить его, как вы делаете в своем собственном решении. Обратите внимание, однако, что вам не нужно удалять файлы один за другим, используя цикл. Вы можете использовать одну команду для удаления партии:
IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
Ответ 2
Если вы хотите, чтобы весь нормальный вывод вашей партии script был тихим (как в вашем примере), самый простой способ сделать это - запустить пакетный файл с перенаправлением:
C:\Temp> test.bat >nul
Этот метод не требует изменения одной строки в script, и на экране все еще отображаются сообщения об ошибках. Чтобы подавить весь вывод, включая сообщения об ошибках:
C:\Temp> test.bat >nul 2>&1
Если ваш script имеет строки, которые выводят вывод, который вы хотите отображать на экране, возможно, будет проще добавить перенаправление к этим линиям, а не всем строкам, которые вы хотите сохранить:
@ECHO OFF
SET scriptDirectory=%~dp0
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f"
)
ECHO
REM Next line DO appear in the screen
ECHO Script completed >con
Антонио
Ответ 3
Просто добавьте >NUL
в конец строк, создающих сообщения.
Например,
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL
Ответ 4
Вы можете перенаправить stdout на nul
, чтобы скрыть его.
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >nul
Просто добавьте >nul
к командам, из которых вы хотите скрыть вывод.
Здесь вы можете увидеть все различные способы перенаправления потоков std.
Ответ 5
Копирует каталог с именем html и все его содержимое в целевой каталог в бесшумном режиме.
Если целевой каталог отсутствует, он все равно будет его создавать.
@echo off
TITLE Copy Folder with Contents
set SOURCE=C:\labs
set DESTINATION=C:\Users\MyUser\Desktop\html
xcopy %SOURCE%\html\* %DESTINATION%\* /s /e /i /Y >NUL
-
/S Копирует каталоги и подкаталоги, кроме пустых.
-
/E Копирует каталоги и подкаталоги, включая пустые
из них. То же, что и /S/E. Может использоваться для модификации /T.
-
/I Если адресата не существует и копируется более одного
файл, предполагает, что конечным пунктом должен быть каталог.
- /Y Подавляет запрос на подтверждение того, что вы хотите перезаписать
существующий файл назначения.