78

我有一个简单的脚本副本,供我们的一个人在离我办公桌 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
4

11 回答 11

187

一个看似未记录的技巧是将 a*放在目标的末尾 - 然后xcopy将复制为文件,就像这样

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

echo f | xcopy ...技巧不适用于提示不同的本地化版本的 Windows。

于 2013-01-23T20:09:59.650 回答
22

实际上 xcopy 不会询问您原始文件是否存在,而是您是否要将其放在名为 Shapes.atc 的新文件夹中,或者放在文件夹 Support 中(这是您想要的。

为了防止 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
于 2010-11-26T08:20:03.933 回答
16

真正的诀窍是:在复制文件的目标路径末尾使用反斜杠。/Y 用于覆盖现有文件,如果您不想要任何警告。

例子:

xcopy /Y "C:\file\from\here.txt" "C:\file\to\here\"
于 2016-02-10T15:48:13.307 回答
12
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
于 2010-11-26T08:15:42.550 回答
7

引用XCopy Force 文件

对于强制文件,我们可以使用管道“echo 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 参数或在目标文件夹的末尾使用反斜杠()。

于 2017-07-17T00:18:51.600 回答
3

/i 开关可能是您所追求的。

从 xcopy /?

/I 如果目标不存在并且复制多个文件,则假定目标必须是一个目录。

于 2010-11-29T10:55:04.240 回答
3

好吧,对于我所问的任务,根据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

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

  • 仅指定目标目录而不是目标文件和
  • 用反斜杠结束目标目录,这非常重要,否则XCOPY甚至会/I在复制单个文件时提示文件或目录。

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

  • /Q... 安静的
  • /Y...是(与操作系统语言无关)覆盖现有文件
  • /R... 也覆盖只读、隐藏和系统文件
  • /S...来自指定目录和所有子目录。

好吧,我不知道/S这里是否真的需要,因为不清楚是否J:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file\Shapes.atc应该复制或全部Shapes.atcJ:\My Name\FILES IN TRANSIT\JOHN20101126\Missing file.

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


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

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

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

批处理文件应该适用于任何文件,包括非典型文件,例如.gitconfig.htaccess没有文件扩展名的文件,以在 *nix 系统上隐藏它们的点开头。Windows 命令处理器将此类文件解释为没有文件名且仅具有文件扩展名的文件,因为最后一点之后的所有内容都是文件的扩展名,最后一点之前的所有内容都是文件名。

有关完整的任务描述和最终的、完整评论的解决方案,请参阅帖子在 UltraEdit 论坛中创建文件的备份副本。

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

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

DosManGovert 的解决方案根本不适用于以点开头且没有文件扩展名的文件。

例如命令

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 的解决方案有一个限制,即必须知道用于自动回答文件 OR 目录提示的操作系统语言相关字符。

因此,我考虑了在英语 Windows 上F获取File或在德语 Windows 上获取 Datei 或Dfor ...? on ... Windows 自动获取的方法。

并且确实有可能确定自动回答提示的语言相关字符。

hack 用于从提示文本中获取与语言相关的字母,而无需真正复制任何文件。

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

设备NUL的处理程序用作XCOPY的输入处理程序,导致在XCOPY两次输出提示后中断复制过程。

此输出在FOR循环中处理,该循环在以左括号开头的第一行退出。这是第二个字符定义用于指定目标是文件的字母的行。

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

@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 上进行了测试。

请参阅帖子在 UltraEdit 论坛中创建文件的备份副本以获取类似的、完全注释的批处理文件,该文件解释了批处理代码的所有部分。

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

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

此外,还应阅读有关使用命令重定向运算符的 Microsoft 文章。

于 2016-03-06T15:53:33.520 回答
2

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

xcopy foo.shtml "foo.html *"

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

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

于 2016-01-18T20:11:58.297 回答
0
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.
于 2013-07-15T20:04:30.483 回答
0

虚拟父母把戏

假设您有源文件和目标文件

%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\).

当我在构建过程生成的命令行中偶然发现一些非常狂野的 ../..-constructs 时,我产生了这个想法。

于 2015-03-06T13:07:39.517 回答
0

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

我的复制命令如下所示:

复制C:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_YYYYMMDD.doc

像你一样,我四处寻找替代开关或其他复制类型的命令,但没有什么能像我想要的那样奏效。然后我考虑通过在复制命令之前简单地添加一个 make 目录( MD 或 MKDIR )命令来拆分这两个不同的要求。

所以现在我有

MKDIR D:\DESTFOLDER

复制C:\SRCFOLDER\MYFILE.doc D:\DESTFOLDER\MYFILE_YYYYMMDD.doc

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

错误消息说:子目录或文件 D:\DESTFOLDER 已存在

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

希望这会有所帮助。

于 2017-09-14T11:23:13.987 回答