使用批处理文件列出文件,并允许用户选择要复制到新目标的文件

时间:2018-03-25 22:21:04

标签: windows batch-file

我是Windows Scripting的新手。 我试图在几个子目录中列出一些txt文件&想要将用户选择的文件复制到新目标。请注意,文件名在不同位置是唯一的。 我使用以下脚本完成了第一部分工作(列出文件和位置),但我无法将所选文件复制到新位置。

@ECHO OFF
SET index=1

SETLOCAL ENABLEDELAYEDEXPANSION 

SET FFPath="C:\Scripts - Backup Server\DKXpress_bkp"
SET NewPath=C:\DKServer

ECHO Recursively searching %FFPath% 
echo.

FOR /F "delims=" %%f in ('DIR %FFPath%\*.txt /a:-d /s /b') DO (
SET file!index!=%%f
ECHO !index! - %%f
SET /A index=!index!+1
)

SETLOCAL DISABLEDELAYEDEXPANSION

SET /P selection="select file by number:"

SET file%selection% >nul 2>&1

IF ERRORLEVEL 1 (
ECHO invalid number selected   
EXIT /B 1

)

SET NewFile=file%selection%

ECHO Copying %NewFile% to %NewPath%
ECHO.
COPY /Y "%NewFile%" "%NewPath%"
ECHO. 
PAUSE

我认为我这部分做错了

SET NewFile=file%selection%

提前谢谢大家

3 个答案:

答案 0 :(得分:1)

如果让Find为您完成工作,则无需设置索引变量或延迟扩展:

@Echo Off
Set "FFPath=C:\Scripts - Backup Server\DKXpress_bkp"
Set "NewPath=C:\DKServer"
Echo Recursively searching %FFPath%
Echo=
For /F "Delims==" %%A In ('"Set File[ 2>Nul"') Do Set "%%A="
For /F "Tokens=1* Delims=]" %%A In (
    '"Dir /B/S/A-D-S-L "%FFPath%\*.txt" 2>Nul|Find /N /V """') Do (
    Echo %%A] %%B
    Set "File%%A]=%%B"
)
Echo=
Set /P "#=Select file by number: "
Echo=
For /F "Tokens=1* Delims==" %%A In ('"Set File[%#%] 2>Nul"') Do (
    Echo Copying %%B to %NewPath%&Echo= 
    Copy /Y "%%B" "%NewPath%"
    GoTo :End
)
Echo Invalid number selected   
:End
Echo=
Pause

答案 1 :(得分:0)

您需要使用延迟扩展来正确分配给变量的文件名。

SET NewFile=!file%selection%!

删除setlocal以禁用延迟扩展。

答案 2 :(得分:0)

你可以尝试这样的事情:

@ECHO OFF
:Main
cls
SET index=1
SETLOCAL ENABLEDELAYEDEXPANSION 
SET FFPath="C:\Scripts - Backup Server\DKXpress_bkp"
SET "NewPath=C:\DKServer"
ECHO Recursively searching %FFPath% 
echo.

FOR /F "delims=" %%f in ('DIR %FFPath%\*.txt /a:-d /s /b') DO (
    SET filepath[!index!]=%%f
    ECHO [!index!] - %%~nxf - %%f
    SET /A index=!index!+1
)
echo(
echo select file by number :
set /p Input=""
For /L %%i in (1,1,%index%) Do (
    If "%INPUT%" EQU "%%i" (
        ECHO Copying "!filepath[%%i]!" to "!NewPath!"
        COPY /Y "!filepath[%%i]!" "!NewPath!"
    )
) 
echo Copying another file ? (Y = Yes or N = No) ?
set /p input2=""
If /I "!input2!"=="Y" (
    goto :Main
) else (
    goto :eof
)