批量复制并禁止所有输出
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中