批量复制并禁止所有输出

Posted

技术标签:

【中文标题】批量复制并禁止所有输出【英文标题】:batch copy and suppress all output 【发布时间】:2020-05-30 03:34:29 【问题描述】:

我有一个批处理文件,我正在将文件从文件夹复制到新的目的地。

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

@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
)

在复制过程中,我看到了很多:

The system cannot find the file specified.

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

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

【问题讨论】:

将 STDOUT 和 STDERR 都重定向到 NUL:` >nul 2>&1`(由于某种原因,如果源不存在,则错误消息转到 STDOUT,而如果目标文件夹不存在,则转到 STDERR)。 (为了正确的语法,你应该copy /y "%%F\*.DLL" "%DST_FLDR%\ >nul 2>&1 仅供参考,[] 没有特殊含义,因此不会保护输入参数中的任何有毒字符。因此,我建议您改用IF NOT "%~1" == "" SET "BASE_FLDR=%~1"IF NOT "%~2" == "" SET "BLD_TYPE=%~2" 此外,您应该使用IF NOT EXIST "%DST_FLDR%\" MKDIR "%DST_FLDR%"注意反斜杠,它确保您检查的是目录而不是文件的存在。为了安全起见,根据我之前评论中的建议,您应该使用 DIR "%BASE_FLDR%" 而不是 DIR %BASE_FLDR% 答案的功劳归于斯蒂芬。 【参考方案1】:

根据您自己接受的答案,我决定发布此内容,因为您忽略了我在 cmets 中提供的所有建议:

请注意:这不是我执行任务的方式,因此它本身不是作为答案提供的,更多的是对您自己的答案的补充。

@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"

【讨论】:

Stephan 已经在您之前发布了工作解决方案! 如果您不想学习,那是您的要求,请记住将此问题添加为书签,以便在您的非健壮代码失败时重新访问我的答案。无论如何,您的方法并不是最有效的方法,我只是复制了您的低效方法,并在我忽略的 cmets 中添加了建议的修复。【参考方案2】:

已解决,请参阅 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"

【讨论】:

以上是关于批量复制并禁止所有输出的主要内容,如果未能解决你的问题,请参考以下文章

视频转换后如何命名输出文件与输入文件相同但扩展名不同? [复制]

PowerCLI 批量输出vCenter中心所有主机虚拟机到本地csv中

PowerCLI 批量输出vCenter中心所有主机虚拟机到本地csv中

Word批量转PDF(内容转图片,防复制文字)

sql 为所有表创建drop语句,并从表空间转储视图。只需运行此代码,然后将输出复制并粘贴到sql windo

如何使用 Perl 进行批量搜索和替换?