PDA

Показать полную графическую версию : [решено] Выбор файла из меню и копирование в нужную директорию.


gaikinn
14-02-2011, 23:02
Доброго дня. Помогите незнатоку одолеть следующую задачу. Имеется папка (к примеру на флешке), в ней находится определенное, изменяющееся количество файлов с одним и тем же расширением. При запуске батника нужно, чтобы проверялась эта папка и выводилось меню с выбором файлов. После выбора одного из них, его необходимо скопировать в другую директорию (на жесткий диск).

gaikinn
16-02-2011, 07:34
Ну как, друзья мои, столько народу просмотрело, и никто не знает решения? Помогите плиз, шибко нужно!

gaikinn
16-02-2011, 10:22
Вот чем мне смогли помочь:
@echo off
if exist choose.txt del /f choose.txt
setlocal enabledelayedexpansion
set q=1
set papka1=F:\Backups
set papka2=D:\New
if not exist "%papka2%" md "%papka2%"
for /f "tokens=*" %%i in ('dir /b "%papka1%"') do (
echo !q!.%%i
echo !q!;%%i>> choose.txt
set /a q+=1
)
echo.
set /p vibor="Enter number of file: "
echo.
for /f "delims=; tokens=1,2" %%i in ('more choose.txt') do (
if "%vibor%"=="%%i" copy /y "%%j" "%papka2%"
)
del /f choose.txt
pause
Он сканирует папку F:\Backups, создает текстовый файл-список, выводит меню выбора, но при выборе номера файла пишет, что файл не найден...:(
В чем подвох?..

amel27
16-02-2011, 12:05
@echo off

set SRC=C:\TEST
set DST=E:\TEST

if not exist "%SRC%" echo ERROR:"%SRC%" not exist!& pause>nul& exit
if not exist "%DST%" md "%DST%"||(echo ERROR:"%DST%" not exist!& pause>nul& exit)

:LOOP
cls
echo 1. List files from directory: "%SRC%"
echo 2. Copy single file to directory: "%DST%"
echo 3. Exit
echo(
set /p $F="Select menu item [1-3]:"
set /a "$F=%$F%+0"

if %$F% equ 1 call:SUB_1& echo(&pause
if %$F% equ 2 call:SUB_2& echo(&pause
if %$F% equ 3 Exit
GoTo:LOOP

:SUB_1
cls
echo Files in "%SRC%":
echo(
pushd "%SRC%"
dir/b/a-d *|findstr/n $|more
popd
GoTo:EOF

:SUB_2
cls
call:SUB_1
set /p $2="Enter file name or number in list:"
set "$2=%$2:\=\\%"
pushd "%SRC%"
for /f "tokens=1* delims=:" %%a in (
'dir/b/a-d *^|findstr/n $^|findstr/irc:"^%$2%:" /c:":%$2%$"'
) do copy/-y "%SRC%\%%b" "%DST%\"
popd
GoTo:EOF

Iska
16-02-2011, 12:56
Так?!
@echo off
setlocal enableextensions enabledelayedexpansion

set sFolderSource=E:\Песочница\0033\01
set sFolderDest=E:\Песочница\0033\02

if not exist "%sFolderDest%" md "%sFolderDest%"

dir /b /a:-d "%sFolderSource%" |find.exe /n /v ""

echo.
set /p iChoose="Enter file's number: " && set /a iChoose-=1
echo.

for /f "delims=" %%i in (
'dir /b /a:-d "%sFolderSource%"^|more +%iChoose%'
) do copy /y "%sFolderSource%\%%i" "%sFolderDest%\" & goto :LabelBreak

:LabelBreak

endlocal
exit /b 0

2amel27: как обойтись без костыля:
…& goto :LabelBreak

:LabelBreak
дабы делать только один проход в цикле разбора? Как-то видел у Вас иной вариант, но забыл.

amel27
16-02-2011, 13:01
как обойтись без костыля »
увы, никак... AFAIK единственный способ прервать цикл - перейти по метке, обходной путь - отфильтровать только одну строку (как в моём примере выше - через дополнительный FindStr)

Iska
16-02-2011, 13:17
…обходной путь - отфильтровать только одну строку (как в моём примере выше - через дополнительный FindStr) »
Точно, помнится, так и было! Спасибо за напоминание.

amel27
16-02-2011, 16:12
Iska, а вот... еще применял такой прием:

set "$F=F"& for /f "delims=" %%i in (
'dir /b /a:-d "%sFolderSource%"^|more +%iChoose%') do (
set "$F="&& copy /y "%sFolderSource%\%%i" "%sFolderDest%\"
)
Хоть это и не выход из цикла, но работает быстрей... До того как отработает DIR работа скрипта не продолжится, а GoTo - очень медленная команда, которая заключается в построчном просмотре всего батника, поиска нужной строки и установки нового значения счетчика команд... т.е. является операцией ввода-вывода, в то время как блок FOR предварительно прочитывается и кэшируется целиком (аналогично блоку кода в скобках).

El Sanchez
16-02-2011, 18:33
Позвольте свой вариант:

@Echo Off
Set Source=C:\Source
Set Output=C:\Output

If Not Exist "%Source%" Echo Source directory not found! Exit.&Exit /B 1
If Not Exist "%Output%" Echo Output directory not found! Exit.&Exit /B 1

SetLocal
For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Source%"^|FindStr /N .') Do Set _%%A=%%B&Echo %%A: %%B
Echo.
Set /P "Choice=Enter file's number: "
If Defined _%Choice% (Call Copy /Y "%Source%\%%_%Choice%%%" "%Output%\") Else (Echo Wrong number! Exit.)
EndLocal

Iska
16-02-2011, 19:23
amel27, спасибо, добавил в «Избранное».

gaikinn
17-02-2011, 13:52
Спасибо добрые люди всем вам за участие, ОЧЕНЬ помогли, все работатет!:)




© OSzone.net 2001-2012