【问题标题】:Batch file to copy a single folder - not just the contents用于复制单个文件夹的批处理文件 - 不仅仅是内容
【发布时间】:2017-11-16 17:30:58
【问题描述】:

我正在努力创建一个可以在任何文件夹中使用的批处理文件,它将当前文件夹及其所有内容复制到另一个位置。目的是允许我通过运行批处理文件对任何当前文件夹进行非常快速的备份。批处理文件对我来说是新的,但编程不是。这是我的代码。

@echo off
title Copy This Directory
:: get current directory
 set startdir=%cd%
 echo.startdir = %startdir%
:: copy the test folder
 xcopy "%startdir%" "F:\Temp Backup\" /s /y
 pause

这会将源文件夹中的文件和文件夹复制到新目标,但我想将文件夹本身及其内容一起复制。即,如果批处理文件位于名为“FromFolder”的文件夹中,我希望“FromFolder”作为文件夹出现在“F:\Temp Backup\”中,其所有内容都在“F:\Temp Backup\FromFolder”中。我找到了很多关于复制文件的信息,但没有找到关于复制单个目录的信息。我可以复制单个文件,但是当我使用相同的代码并将文件名更改为文件夹名称时,它会复制文件夹的内容而不是文件夹本身。有人可以告诉我我错过了什么。

【问题讨论】:

  • 所以您打算从要备份的文件夹中运行批处理文件?或者你打算做一个拖放批处理文件?不管怎样,基本上你想要做的是获取文件夹路径的父文件夹。这是获取父目录的基本语法:for %%G in ("%cd%\.") do set parent=%%~nxG.
  • ...或者"%~dp0."
  • 这有助于我获取父文件夹的名称。
  • 不小心按下了返回,它在我完整回答之前保存了它。我想在一个文件夹中有一个批处理文件,当我双击时复制包含它的文件夹。您的代码可以帮助我找到父文件夹的名称。我真正的问题是如何使 xcopy 复制该单个文件夹而不仅仅是其中的文件。到目前为止,如果我尝试使用 xcopy 中的文件夹名称复制文件夹,它会复制文件夹的内容,但不会复制文件夹本身。我想复制文件夹及其内容,以便目标包含文件夹,该文件夹又包含文件夹的内容。
  • @Codeabike,您有父文件夹的名称。那么您认为您需要如何处理批处理文件中的这些信息? 1) 在目标文件夹中创建目录。 2) 在 Xcopy 中使用该文件夹路径。

标签: batch-file


【解决方案1】:
@echo off

rem set destination dir
set destDir=C:\tmp\fizz bang

rem get the current dir
set currDir=%cd%

rem set current dir to parent
pushd ..

rem get the parent dir path
set parDir=%cd%

rem replace the parent path part of the dir with the destination
rem see also: https://stackoverflow.com/a/5821366
rem also note the trailing backslash to tell xcopy it's a directory
CALL set destPath=%%currDir:%parDir%=%destDir%%%\

rem copy
xcopy /e "%currDir%" "%destPath%"

rem go back where we started
popd

pause

【讨论】:

  • 谢谢,这些地址正在获取文件夹名称。我的问题是如何复制目录及其内容。批处理文件相当于拖放文件夹而不是拖动其内容。即“xcopy A:\From B:\To\”将“From”的内容复制到“To”,而我想复制“From”目录本身及其内容。也许我需要创建目标目录“B:\To\From”作为第一步,然后使用“xcopy A:\From B:\To\From\”将内容复制到它作为第二步,但我有预计可以一步完成。
  • 你运行脚本了吗?请注意,它会移动到当前目录的父目录,然后复制该目录及其所有内容。
  • 谢谢查兹。起初,当我尝试它时,我收到了无效数量的参数错误,因为我的目标文件夹中有空格,我需要引号。当我将目的地编辑为没有空格时,它运行良好,谢谢。同时,我尝试了两步方法(我也在这里发布了),它也可以处理带有空格的文件名。
  • 我的也可以很好地处理空格。
【解决方案2】:

我决定在目的地创建一个新文件夹,然后将内容复制到其中。这就是我所做的。

@setlocal enableextensions enabledelayedexpansion
@echo off
title Copy This Directory
:: get current directory
@echo off
set startdir=%cd%
set temp=%startdir%
set folder=
:loop
if not "x%temp:~-1%"=="x\" (
    set folder=!temp:~-1!!folder!
    set temp=!temp:~0,-1!
    goto :loop
)
echo.startdir = %startdir%
echo.folder   = %folder%
:: Create new folder if needed
md "F:\Temp Backup\%folder%"
:: copy the contents
xcopy "%startdir%\*.*" "F:\Temp Backup\%folder%\" /s /y
pause
endlocal && set folder=%folder%

【讨论】:

  • 我给了你一行代码来获取父文件夹。使用它有什么问题?
  • 谢谢。我的困难是没有获得文件夹名称,我已经找到并测试了如何做到这一点。我的困难是复制文件夹以及包含的文件。
  • 我原以为这是最简单的部分。 K.I.S.S. 的首字母缩写词曾在这里使用过吗?
  • 如果我知道该怎么做,我就不会发帖了,我想我只是没有找到不能回答我的问题的代码片段有用。
【解决方案3】:

如果您从要备份的目录中运行批处理文件,您只需几行代码即可完成此操作。

@echo off
title Copy This Directory
for %%G in (".") do set folder=%%~nxG
md "F:\Temp Backup\%folder%" 2>nul
xcopy "*.*" "F:\Temp Backup\%folder%\" /s /y

【讨论】:

  • 那是完美的壁球。这正是我所追求的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多