【发布时间】:2022-06-13 08:12:54
【问题描述】:
我正在尝试制作一个脚本来复制文件夹的内容并将其粘贴到指定的目的地。
我尝试了 xcopy 和 robocopy 的多种变体,但它在复制所述源文件夹的内容时留下了源文件夹。
这是我的代码。
批次:
@echo off
:home
cls
color 02
title COPYFF
echo Do you want to copy a file or an entire folder?
echo Choose one: A - Copy a file B - Copy a folder
echo/
%SystemRoot%\System32\choice.exe /C AB /N /M "Your choice: "
if errorlevel 2 goto copyfolder
if errorlevel 1 goto copyfile
:copyfile
cls
color 02
call file.vbs
set /p src=<copypath.txt
set /p dst=<pastepath.txt
echo Copying...
for /D /R "%dst%" %%D in ("*") do xcopy /F /Y /D "%src%" "%%~D\"
del copypath.txt
del pastepath.txt
echo.
echo Do you want to copy another file?(Y/N)
echo/
%SystemRoot%\System32\choice.exe /C YN /N /M "Your choice: "
if errorlevel 2 goto done
if errorlevel 1 goto copyfile
:copyfolder
cls
color 02
call folder.vbs
set /p src=<copyfolpath.txt
set /p dst=<pastefolpath.txt
echo Copying...
for %%I in ("%src%") do %SystemRoot%\System32\xcopy.exe "%src%" "%dst%\%%~nxI\" /C /S /H /R /K /Y > nul
del copyfolpath.txt
del pastefolpath.txt
echo.
echo Do you want to copy another folder?(Y/N)
echo/
%SystemRoot%\System32\choice.exe /C YN /N /M "Your choice: "
if errorlevel 2 goto done
if errorlevel 1 goto copyfolder
:done
cls
echo Copy operation successful
echo Press Enter to close this program
pause > nul
文件.vbs
Dim objText, objFile, wShell, objExec
Public objShell, objWord, oShell, objFolder
Set objText = CreateObject("Scripting.FileSystemObject")
Set objFile = objText.CreateTextFile("copypath.txt", True)
Set wShell = CreateObject("WScript.Shell")
Set objExec = wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
sFileSelected = objExec.StdOut.ReadLine
If Not (objExec Is Nothing) Then
objFile.WriteLine (sFileSelected)
End If
Set objShell = CreateObject("Scripting.FileSystemObject")
Set objWord = objShell.CreateTextFile("pastepath.txt", True)
Set oShell = CreateObject("Shell.Application")
Set objFolder = oShell.BrowseForFolder(0, "Which folder do you want to copy the file to?", 1, "")
cFileSelected = objFolder.Self.path
If Not (objFolder Is Nothing) Then
objWord.WriteLine (cFileSelected)
End If
和文件夹.vbs
Dim objText, objFile, wShell, objExec
Public objShell, objWord, oShell, objFolder
Set objText = CreateObject("Scripting.FileSystemObject")
Set objFile = objText.CreateTextFile("copyfolpath.txt", True)
Set wShell = CreateObject("Shell.Application")
Set objExec = wShell.BrowseForFolder(0, "Which folder do you want to copy?", 1, "")
sFileSelected = objExec.Self.path
If Not (objExec Is Nothing) Then
objFile.WriteLine (sFileSelected)
End If
Set objShell = CreateObject("Scripting.FileSystemObject")
Set objWord = objShell.CreateTextFile("pastefolpath.txt", True)
Set oShell = CreateObject("Shell.Application")
Set objFolder = oShell.BrowseForFolder(0, "Where do you want to copy the folder to?", 1, "")
cFileSelected = objFolder.Self.path
If Not (objFolder Is Nothing) Then
objWord.WriteLine (cFileSelected)
End If
文件副本已经在工作,但文件夹一仍然缺少我之前提到的内容,它在复制内容时将源文件夹留在后面。
【问题讨论】:
-
我建议在 How to stop Windows command interpreter from quitting batch file execution on an incorrect user input? 上阅读我的答案,应该使用命令 CHOICE 作为选择菜单,而不是
set /P,原因在参考答案中完整描述详情。 -
解决方案是在最后的目标文件夹路径中也使用源文件夹名称,即将
for /D /R "%dst%" %%D in ("*") do xcopy /F /Y /D "%src%" "%%~D\"替换为for %%I in ("%src%") do %SystemRoot%\System32\xcopy.exe "%src%" "%dst%\%%~nxI\" /C /S /Q /H /R /K /Y >nul。使用%SystemRoot%\System32\robocopy.exe也可以做到这一点,并确保源和目标目录路径不以\结尾,因为 ROBOCOPY 会将其解释为"或目录的转义字符如果需要,路径以两个反斜杠结尾,例如在根目录中。 -
应该指定像
D:\这样的根目录,而不是在ROBOCOPY 的参数列表中的路径周围使用",否则使用"D:\\"。是的,ROBOCOPY 类似于 REG,因此在解释参数字符方面与大多数其他 Windows 命令不同。 ROBOCOPY 和 REG 将左斜杠解释为另一个反斜杠或双引号字符作为\的转义字符,分别为",这对于 REG,但不是真正用于 ROBOCOPY,因为"在文件/目录名称中不是有效字符。 -
:copyfile下的代码部分按预期工作。所以,我想我应该在:copyfolder下使用for %%I in ("%src%") do %SystemRoot%\System32\xcopy.exe "%src%" "%dst%\%%~nxI\" /C /S /Q /H /R /K /Y >nul来代替 -
请注意,我发布的命令行仅在定义
src时没有包含"并且末尾没有反斜杠时才有效。不知道哪个字符串存储在copypath.txt中。因此,对于一个健壮的批处理文件,有必要确保分配给环境变量src和dst的源和目标目录路径没有用双引号括起来,并且没有以反斜杠结尾,除了源或目标引用驱动器的根目录,该驱动器也需要由批处理文件正确处理特殊代码。
标签: windows batch-file cmd vbscript