代码之家  ›  专栏  ›  技术社区  ›  AlliDeacon

批处理脚本中的xcopy-避免文件或目录提示[重复]

  •  0
  • AlliDeacon  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一个简单的从到脚本的副本给我们的一个家伙,他在离我办公桌20公里的地方丢失了一个文件。

    当测试脚本时,系统会提示我 shapes.atc 是文件或文件夹

    我可以告诉你,这是一个文件,但我如何能自动复制它在我的人需要能够只点击批完成。

    xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc
    
    0 回复  |  直到 6 年前
        1
  •  170
  •   Community CDub    11 年前

    一个看似无证的伎俩是 * 在目的地的尽头-然后 xcopy 将复制为文件,就像这样

    xcopy c:\source\file.txt c:\destination\newfile.txt*
    

    这个 echo f | xcopy ... 技巧在本地化版本的Windows上不起作用,因为提示不同。

        2
  •  21
  •   CharlesB Craig McQueen    14 年前

    实际上,xcopy不会询问原始文件是否存在,但如果要将其放入名为shapes.atc的新文件夹中,或者放入文件夹支持(这正是您想要的)。

    为了防止Xcopy询问这个问题,只需告诉他目标文件夹,这样就不会有歧义:

    xcopy /s/y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support"
    

    如果要更改目标中的文件名,只需使用copy(复制文件时比xcopy更合适):

    copy /y "J:\Old path\Shapes.atc" "C:\Documents and Settings\his name\Support\Shapes-new.atc
    
        3
  •  11
  •   Denis Ivin    14 年前
    echo f | xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\Shapes.atc
    
        4
  •  10
  •   Patrick    9 年前

    真正的技巧是:在复制文件的目标路径的末尾使用反斜杠。如果不需要警告,则/y用于覆盖现有文件。

    例子:

    xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\"
    
        5
  •  5
  •   Shane Lu    7 年前

    引用 XCopy Force File

    对于强制文件,我们可以使用管道 “回声F” :

    C:\Trash>xcopy 23.txt 24.txt
    Does 24.txt specify a file name
    or directory name on the target
    (F = file, D = directory)?
    
    C:\Trash>echo F | xcopy 23.txt 24.txt
    Does 24.txt specify a file name
    or directory name on the target
    (F = file, D = directory)? F
    C:23.txt
    1 File(s) copied
    

    对于强制文件夹,我们可以对xcopy使用/i参数,或者在目标文件夹的末尾使用反斜杠()。

        6
  •  3
  •   Andy Morris    14 年前

    /I开关可能是你想要的。

    来自xcopy/?

    /如果目的地不存在并复制多个文件, 假设目标必须是一个目录。

        7
  •  3
  •   Mofi    6 年前

    嗯,按要求完成任务 just me 根据不完整的建议,最好的解决方案可能是以下命令 Andy Morris :

    xcopy "J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc" "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\" /Q /R /S /Y
    

    这适用于这个简单的文件复制任务,因为

    • 仅指定目标目录而不是目标文件,以及
    • 以反斜杠结束目标目录,反斜杠与其他目录一样非常重要 复印件 即使有 /I 复制单个文件时提示输入文件或目录。

    与问题无关的其他参数有:

    • /Q …安静的
    • /Y …是(独立于操作系统语言)覆盖现有文件
    • /R …同时覆盖只读、隐藏和系统文件
    • /S …从指定的目录和所有子目录。

    嗯,我不知道 s 这里真的很需要,因为还不清楚 J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc 应复制或全部复制 Shapes.atc 在目录树的任何位置找到 J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file .

    可以通过打开命令提示窗口并在此窗口中运行来读取参数的说明。 xcopy /? 获取输出帮助 复印件 .


    但是,所提供的任何解决方案都不适用于文件复制任务,在该任务中,应将单个文件复制到与源文件相同的目录中,但由于当前日期和时间的原因,文件扩展名之前的文件名中插入了不同的文件名。

    源文件可以具有隐藏或系统属性集,不包括 拷贝 命令。

    用于创建时间戳文件的批处理文件也应在Windows XP上工作,不包括 机器人学 因为默认情况下在Windows XP上不可用。

    批处理文件应该与任何文件一起使用,包括 .gitconfig .htaccess 它们是没有文件扩展名的文件,从一个隐藏在*nix系统上的点开始。Windows命令处理程序将这些文件解释为没有文件名且只有文件扩展名的文件,因为规则是:最后一点之后的所有内容都是文件扩展名,最后一点之前的所有内容都是文件名。

    有关完整的任务描述和最终的完全注释的解决方案,请参阅文章 Create a backup copy of files 在超级编辑论坛。

    Patrick's , Tirtha R's , Interociter Operator's CharlesB's 解决方案不起作用,因为使用 Y 如果目标文件不存在,则不会避免文件或目录提示。

    Andy Morris' grenix's 解决方案不能用于单个文件复制任务,因为目标必须是目标文件的名称,而不是目标目录的名称。目标目录与源目录相同,但目标文件的名称与源文件的名称不同。

    DosMan's Govert's 解决方案不适用于从一个点开始但没有文件扩展名的文件。

    例如,命令

    xcopy C:\Temp\.gitconfig C:\Temp\.gitconfig_2016-03-07_15-30-00* /C /H /K /Q /R /V /Y
    

    执行时出现以下错误消息:

    英语:无法展开第二个文件名以匹配第一个。
    德语:Zweiter dateiname konnte nicht so erweitert werden,dass er zum ersten passt.

    最后 Denis Ivin's 解决方案有一个限制,即必须知道文件或目录提示自动应答的操作系统语言相关字符。

    所以我想了一些方法 F 对于 文件 在英语窗口或 D 对于 大帝 在德国窗户上或 ? 用于…打开…Windows自动。

    确实可以确定提示自动应答的语言相关字符。

    hack用于从提示文本中获取依赖语言的字母,而不必真正复制任何文件。

    命令 复印件 用于开始将批处理文件本身复制到临时文件的文件夹中,文件扩展名为目标文件的tmp。这将导致提示 复印件 如果临时文件文件夹中没有该名称的文件,这是非常不可能的。

    设备的处理程序 努尔 用作的输入处理程序 复印件 导致在输出提示后中断复制过程 复印件 两次。

    此输出在 为了 从左括号开始的第一行退出的循环。这是第二个字符定义用于指定目标为文件的字母的行。

    这是一个批处理文件,使用 复印件 使用代码来确定自动应答文件所需的字母或目录提示,以便在与源文件相同的目录中创建单个文件的时间戳副本,即使源文件是隐藏文件或系统文件,并且即使源文件以点开头而不是以点开头。保存文件扩展名。

    @echo off
    rem Batch file must be started or called with name of a single file.
    
    if "%~1" == "" exit /B
    for /F "delims=*?" %%I in ("#%~1#") do if not "%%I" == "#%~1#" exit /B
    if not exist "%~1" exit /B
    if exist "%~1\" exit /B
    setlocal EnableDelayedExpansion
    
    rem Determine the character needed for answering prompt of
    rem XCOPY for destination being a file and not a directory.
    
    del /F "%TEMP%\%~n0.tmp" 2>nul
    for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%~f0" "%TEMP%\%~n0.tmp" ^<nul') do (
        set "PromptAnswer=%%I"
        if "!PromptAnswer:~0,1!" == "(" (
            set "PromptAnswer=!PromptAnswer:~1,1!"
            goto CopyFile
        )
    )
    echo ERROR: Failed to determine letter for answering prompt of XCOPY.
    exit /B
    
    :CopyFile
    rem This is a workaround for files starting with a point and having no
    rem file extension like many hidden files on *nix copied to Windows.
    
    if "%~n1" == "" (
        set "FileNameWithPath=%~dpx1"
        set "FileExtension="
    ) else (
        set "FileNameWithPath=%~dpn1"
        set "FileExtension=%~x1"
    )
    
    rem Get local date and time in region and language independent format YYYYMMDDHHmmss
    rem and reformat the local date and time to format YYYY-MM-DD_HH-mm-ss.
    
    for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS get LocalDateTime /format:value') do set "LocalDateTime=%%I"
    set "LocalDateTime=%LocalDateTime:~0,4%-%LocalDateTime:~4,2%-%LocalDateTime:~6,2%_%LocalDateTime:~8,2%-%LocalDateTime:~10,2%-%LocalDateTime:~12,2%"
    
    rem Do the copy with showing what is copied and with printing success or
    rem an error message if copying fails for example on sharing violation.
    
    echo Copy "%~f1" to "%FileNameWithPath%_%LocalDateTime%%FileExtension%"
    
    for /F %%I in ('echo %PromptAnswer% ^| %SystemRoot%\System32\xcopy.exe "%~f1" "%FileNameWithPath%_%LocalDateTime%%FileExtension%" /C /H /K /Q /R /V /Y') do set "FilesCopied=%%I"
    
    if "%FilesCopied%" == "1" (
        echo Success
    ) else (
        echo ERROR: Copying failed, see error message above.
    )
    

    此批处理代码在德语Windows XP SP3 x86和英语Windows 7 SP1 x64上进行了测试。

    看帖子 创建文件的备份副本 在超级编辑论坛中,一个类似的、完全注释的批处理文件解释了批处理代码的所有部分。

    为了了解使用的命令及其工作方式,请打开一个命令提示窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

    • del /?
    • echo /?
    • exit /?
    • for /?
    • goto /?
    • if /?
    • rem /?
    • set /?
    • setlocal /?
    • wmic OS get /?
    • xcopy/?

    微软关于 Using command redirection operators 也应该读。

        8
  •  2
  •   DosMan    9 年前

    当新的扩展名较短时,可以使用附加“*”的技巧。您需要用空格填充新的扩展名,这只能通过用引号括住目标文件名来完成。例如:

    xcopy foo.shtml "foo.html *"
    

    这将在不提示的情况下复制和重命名。

    “这不是一个bug,这是一个功能!”(我曾经在微软的停车场看到过一辆大众甲壳虫,上面有一块“功能”牌。)重命名的语义可以追溯到我写DOS v.1的时候。新名称中的字符将逐个替换旧名称中的字符,除非是通配符(?或*)出现在新名称中。如果不向新名称添加空白,则从旧名称复制剩余字符。

        9
  •  0
  •   Chad Levy    11 年前
    xcopy /s/y J:\"My Name"\"FILES IN TRANSIT"\JOHN20101126\"Missing file"\Shapes.atc C:\"Documents and Settings"\"His name"\"Application Data"\Autodesk\"AutoCAD 2010"\"R18.0"\enu\Support\*.*"
    

    …应该这样做。

    做一个好主意:

    IF NOT EXIST "C:\Documents and Settings\His name\Application Data\Autodesk\AutoCAD 2010\R18.0\enu\Support\Shapes.atc" ECHO/ && ECHO/ && ECHO * * * * * COPY FAILED - Call JustME at 555-555-1212 && ECHO/ && pause
    

    (假设您已将以前的版本重命名为.old)

    XCOPY  /Z  <----- restartable mode - good for large files.
    
        10
  •  0
  •   grenix    10 年前

    虚拟家长技巧

    假设您的源文件和目标文件在

    %SRC_FILENAME% and %DST_FILENAME%
    

    您可以使用两步方法:

    @REM on my win 7 system mkdir creates all parent directories also
    mkdir "%DST_FILENAME%\.."
    xcopy "%SRC_FILENAME% "%DST_FILENAME%\.."
    

    这将被解决,例如

    mkdir "c:\destination\b\c\file.txt\.."
    @REM The special trick here is that mkdir can create the parent
    @REM directory of a "virtual" directory (c:\destination\b\c\file.txt\) that 
    @REM doesn't even need to exist.
    @REM So the directory "c:\destination\b\c" is created here.
    @REM mkdir "c:\destination\b\c\dummystring\.." would have the same effect
    
    xcopy "c:\source\b\c\file.txt" "c:\destination\b\c\file.txt\.."
    @REM xcopy computes the real location of  "c:\destination\b\c\file.txt\.."
    @REM which is the now existing directory "c:\destination\b\c"
    @REM (the parent directory of the "virtual" directory c:\destination\b\c\file.txt\).
    

    我是在无意中发现了一些非常疯狂的../.-构造,这些构造是由构建过程生成的命令行中的。

        11
  •  0
  •   Kalamarico Gopakumar AP    7 年前

    我遇到了完全相同的问题,为了备份的目的,我想把文件复制到一个外部硬盘上。 如果我想复制一个完整的文件夹,那么copy非常乐意创建目标文件夹并用所有文件填充它。 但是,我想每天复制一次文件,并将今天的日期添加到文件中。 copy很乐意复制该文件并以新格式重命名,但前提是目标文件夹已经存在。

    我的复制命令如下:

    拷贝 C:\srcfolder\myfile.doc D:\destfolder\myfile\u yyyymmdd.doc文件

    像你一样,我四处寻找替代开关或其他复制类型的命令,但是没有什么能像我想要的那样工作。 然后我想通过在copy命令之前添加make directory(md或mkdir)命令来分解这两个不同的需求。

    所以现在我有了

    麦克迪尔 D:\目标文件夹

    拷贝 C:\srcfolder\myfile.doc D:\destfolder\myfile\u yyyymmdd.doc文件

    如果目标文件夹不存在,则创建它。 如果目标文件夹确实存在,则会生成一条错误消息。但是,这不会阻止批处理文件继续执行copy命令。

    错误信息显示: 子目录或文件d:\destfolder已经存在

    正如我所说,错误消息不会停止批处理文件的工作,它是解决问题的一个非常简单的方法。

    希望这有帮助。