批处理显示要从中选择的文件夹,用户选择文件夹,然后将该文件夹复制到另一个文件夹

时间:2018-01-26 16:58:57

标签: batch-file

所以我要做的是,我有一个bat文件,可以进行带时间戳的备份(例如,180126_053327,格式为:yymmdd_hhmmss)。我正在尝试创建这个添加到它的bat,所以我可以让它查找这些备份,在控制台中显示以允许用户通过输入他们想要的数字来选择他们想要恢复的备份,然后将其复制到一个位置

到目前为止我创造了这个:

Pic of what I have so far

上面的图片来自以下脚本:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set i=0
For /f %%a in ('dir I:\AM_Configs-backups\ /B /A /D') do (
set /a i+=1
echo !i!   %%a
set dir!i!=%%a
)

echo. 
set /p uin="Select a directory [1-!i!]: "
set udir=!dir%uin%!

echo Selected - %udir%
md c:\test2
copy %udir% c:\test2
@PAUSE

我一直这样:

Select a directory [1-29]: 27
Selected - 180126_053327
The system cannot find the file specified.
Press any key to continue . . .

我从此链接获得了上面的脚本:Prompting user to select directory in batch file

2 个答案:

答案 0 :(得分:0)

无法找到,因为%udir%不在当前目录中。这意味着您的基本目录I:\AM_Configs-backups需要预先修复为Copy命令。

Copy "I:\AM_Configs-backups\%udir%" "C:\test2"

此处还有您在问题中提供的链接示例的替代方法:

@Echo Off
SetLocal EnableDelayedExpansion
Set "baseDir=I:\AM_Configs-backups"
For /F "Delims==" %%A In ('"(Set dir[) 2>Nul"') Do Set "%%A="
Set "i=0"
For /D %%A In ("%baseDir%\*") Do (Set /A i+=1 & Set "dir[!i!]=%%~nxA")
If %i% Equ 1 (Set "dir[X]=%baseDir%\%dir[1]%") Else Call :Menu

Rem Your commands using the selected directory begin below
Echo you selected %dir[X]%
If Not Exist "C:\test2\" MD "C:\test2"
Copy "%dir[X]%" "C:\test2"
Pause 

Exit /B

:Menu
For /L %%A In (1,1,%i%) Do (Echo %%A. !dir[%%A]!)
Set /P "dir[X]=Select a directory from the above list: "
If Not Defined dir[%dir[X]%] (ClS & GoTo Menu)
Set "dir[X]=%baseDir%\!dir[%dir[X]%]!"

您可以在3行调整基本目录,然后从9行开始,(最多Exit /B

您应该考虑使用RoboCopy复制目录!

修改

对于XCopy版本,您可能需要更改为:

@Echo Off
SetLocal EnableDelayedExpansion
Set "baseDir=I:\AM_Configs-backups"
For /F "Delims==" %%A In ('"(Set dir[) 2>Nul"') Do Set "%%A="
Set "i=0"
For /D %%A In ("%baseDir%\*") Do (Set /A i+=1 & Set "dir[!i!]=%%~nxA")
If %i% Equ 1 (Set "dir[X]=%dir[1]%") Else Call :Menu

Rem Your commands using the selected directory begin below
Echo you selected %dir[X]%
XCopy "%baseDir%\%dir[X]%" "%AppData%\Awesomeminer\%dir[X]%" /S /I /F /Y 2>Nul
Echo Starting Awesome Miner...
Start "" "%ProgramFiles(x86)%\Awesome Miner\AwesomeMiner.exe"
Pause
Call "Switch-N-Bkup.bat"
Pause
Exit /B

:Menu
For /L %%A In (1,1,%i%) Do (Echo %%A. !dir[%%A]!)
Set /P "dir[X]=Select a directory from the above list: "
If Not Defined dir[%dir[X]%] (ClS & GoTo Menu)
Set "dir[X]=!dir[%dir[X]%]!"

对于RoboCopy版本,您需要将行11更改为:

RoboCopy "%baseDir%\%dir[X]%" "C:\test2\%dir[X]%" /S 2>Nul

...以及您可能需要的任何其他开关

答案 1 :(得分:0)

我最终使用这个cus我有另一批用于切换和备份: 有点给你一个想法,我有一个主要的蝙蝠切换和复制配置,这将在复制后自动启动程序。在该bat中我还有使用时间/日期将当前配置备份到某个位置的代码,并以这种格式创建文件夹:yymmdd_hhmmss ...我需要一个简单的恢复功能,它提供的链接和代码帮助用户能够选择要还原的文件夹并将其复制到要使用的程序数据文件夹,然后使用复制的配置自动启动程序。

@Echo Off
SetLocal EnableDelayedExpansion
Set "baseDir=I:\AM_Configs-backups"
For /F "Delims==" %%A In ('"(Set dir[) 2>Nul"') Do Set "%%A="
Set "i=0"
For /D %%A In ("%baseDir%\*") Do (Set /A i+=1 & Set "dir[!i!]=%%~nxA")
If %i% Equ 1 (Set "dir[X]=%baseDir%\%dir[1]%") Else Call :Menu

Rem Your commands using the selected directory begin below
Echo you selected %dir[X]%
REM If Not Exist "C:\test2\" MD "C:\test2"
xcopy "%dir[X]%" "%USERPROFILE%\AppData\Roaming\Awesomeminer\" /S /F /R /Y

START C:\"Program Files (x86)"\"Awesome Miner"\AwesomeMiner.exe
ECHO Starting Awesome Miner...
@Pause
CALL Switch-N-Bkup.bat
exit /b

:Menu
For /L %%A In (1,1,%i%) Do (Echo %%A. !dir[%%A]!)
Set /P "dir[X]=Select a directory from the above list: "
If Not Defined dir[%dir[X]%] (ClS & GoTo Menu)
Set "dir[X]=%baseDir%\!dir[%dir[X]%]!"