Batch file 批量复制并抑制所有输出

Batch file 批量复制并抑制所有输出,batch-file,windows-10,copy,Batch File,Windows 10,Copy,我有一个批处理文件,将文件从文件夹复制到新的目标 文件夹列表由批处理文件生成: @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION @REM Set defaults SET BASE_FLDR=.\ SET BLD_TYPE=Release SET DST_FLDR=SC_APP @REM Check if base folder specified, if not default to current location IF NOT [%1] == [] SE

我有一个批处理文件,将文件从文件夹复制到新的目标

文件夹列表由批处理文件生成:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
@REM Set defaults
SET BASE_FLDR=.\
SET BLD_TYPE=Release
SET DST_FLDR=SC_APP
@REM Check if base folder specified, if not default to current location
IF NOT [%1] == [] SET BASE_FLDR=%1
@REM Check if build type specified, if not default to Release
IF NOT [%2] == [] SET BLD_TYPE=%2
@REM Display parameters
ECHO Base folder: %BASE_FLDR%
ECHO Build type : %BLD_TYPE%
@REM Does destination folder exist?
IF NOT EXIST %DST_FLDR% MKDIR %DST_FLDR%
@REM Create list of subfolders to search
FOR /F "delims=" %%F IN ('"DIR %BASE_FLDR% /S /B /A:D | FINDSTR /EIC:"%BLD_TYPE%" "') DO (
    @COPY /Y "%%F"\*.DLL "%DST_FLDR%" >NUL
    @COPY /Y "%%F"\*.EXE "%DST_FLDR%" >NUL
)
在复印过程中,我看到很多:

我尝试了各种方法,但未能阻止显示此消息


@
不会阻止它,也不会将输出重定向到
NUL
,我还尝试在另一个
CMD
中启动,也不会阻止它发生。

已解决,请参阅Stephan的评论

已完成的脚本:

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    @REM Set defaults
    SET BASE_FLDR=.\
    SET BLD_TYPE=Release
    @REM Check if base folder specified, if not default to current location
    IF NOT [%1] == [] SET BASE_FLDR=%1
    @REM Check if build type specified, if not default to Release
    IF NOT [%2] == [] SET BLD_TYPE=%2
    SET DST_FLDR=%BASE_FLDR%sc_app
    @REM Display parameters
    ECHO Base folder: %BASE_FLDR%
    ECHO Build type : %BLD_TYPE%
    ECHO Destination folder : %DST_FLDR%
    ECHO Please wait
    @REM Does destination folder exist?
    IF NOT EXIST %DST_FLDR% (
        ECHO Creating %DST_FLDR%
        MKDIR %DST_FLDR%
    )
    @REM Create list of subfolders to search
    ECHO Copying DLL's and EXE's to %DST_FLDR%
    FOR /F "delims=" %%F IN ('"DIR %BASE_FLDR% /S /B /A:D | FINDSTR /EIC:"%BLD_TYPE%" "') DO (
        ECHO | SET /p="."
        @COPY /Y "%%F"\*.DLL "%DST_FLDR%" >NUL 2>&1
        @COPY /Y "%%F"\*.EXE "%DST_FLDR%" >NUL 2>&1
    )
    ECHO "Copy complete"

基于您自我接受的答案,我决定发布此消息,因为您忽略了我在评论中提供的所有建议:

请注意:这不是我执行任务的方式,因此它本身并不是一个答案,而是对您自己答案的补充

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

REM Set defaults
SET "BASE_FLDR=."
SET "BLD_TYPE=Release"

REM Check if base folder specified, if not default to current location
IF NOT "%~1" == "" SET "BASE_FLDR=%~1"

REM Check if build type specified, if not default to Release
IF NOT "%~2" == "" SET "BLD_TYPE=%~2"
SET "DST_FLDR=%BASE_FLDR%\sc_app"

REM Display parameters
ECHO Base folder: %BASE_FLDR%
ECHO Build type: %BLD_TYPE%
ECHO Destination folder: %DST_FLDR%
ECHO Please wait

REM Does destination folder exist?
IF NOT EXIST "%DST_FLDR%\" (
    ECHO Creating %DST_FLDR%
    MD "%DST_FLDR%"
)

REM Create list of subfolders to search
ECHO Copying DLL's and EXE's to %DST_FLDR%
FOR /F "DELIMS=" %%F IN ('"DIR /B /S /AD "%BASE_FLDR%" | FINDSTR /EIC:"%BLD_TYPE%""') DO (
    ECHO | SET /P "=."
    COPY /Y "%%F\*.DLL" "%DST_FLDR%" >NUL 2>&1
    COPY /Y "%%F\*.EXE" "%DST_FLDR%" >NUL 2>&1
)
ECHO "Copy complete"

将STDOUT和STDERR重定向到NUL:`>NUL 2>&1`(出于某种原因,如果源不存在,则错误消息将转到STDOUT,而如果目标文件夹不存在,则转到STDERR)。(对于正确的语法,您应该
copy/y“%%F\*.DLL”“%DST\u FLDR%\>nul 2>&1
)供参考,
[
]
没有特殊意义,因此不会保护输入参数中的任何有毒字符。因此,我建议您使用
如果不是“%~1”=“SET”BASE\u FLDR=%1”
如果不是“%~2”=”“改为设置“BLD\U TYPE=%~2”
。此外,如果不存在“%DST\u FLDR%\”MKDIR“%DST\u FLDR%”,则应使用
,注意反斜杠,它确保您检查的是目录而不是文件的存在。为了安全起见,根据我前面评论中的建议,您应该使用
DIR“%BASE\u FLDR%””“
not
DIR%BASE\u FLDR%
。答案必须归功于Stephan。Stephan已经在您之前发布了有效的解决方案!如果您不想学习,这是您的过去时,请记住将此问题添加到书签中,以便在非健壮代码失败时重新查看我的答案。不管怎么说,这并不是说你的方法是最有效的方法,我只是简单地复制了你低效的方法,并在我忽略的评论中添加了建议的修复。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

REM Set defaults
SET "BASE_FLDR=."
SET "BLD_TYPE=Release"

REM Check if base folder specified, if not default to current location
IF NOT "%~1" == "" SET "BASE_FLDR=%~1"

REM Check if build type specified, if not default to Release
IF NOT "%~2" == "" SET "BLD_TYPE=%~2"
SET "DST_FLDR=%BASE_FLDR%\sc_app"

REM Display parameters
ECHO Base folder: %BASE_FLDR%
ECHO Build type: %BLD_TYPE%
ECHO Destination folder: %DST_FLDR%
ECHO Please wait

REM Does destination folder exist?
IF NOT EXIST "%DST_FLDR%\" (
    ECHO Creating %DST_FLDR%
    MD "%DST_FLDR%"
)

REM Create list of subfolders to search
ECHO Copying DLL's and EXE's to %DST_FLDR%
FOR /F "DELIMS=" %%F IN ('"DIR /B /S /AD "%BASE_FLDR%" | FINDSTR /EIC:"%BLD_TYPE%""') DO (
    ECHO | SET /P "=."
    COPY /Y "%%F\*.DLL" "%DST_FLDR%" >NUL 2>&1
    COPY /Y "%%F\*.EXE" "%DST_FLDR%" >NUL 2>&1
)
ECHO "Copy complete"