Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Выбор файла из меню и копирование в нужную директорию. (http://forum.oszone.net/showthread.php?t=199510)

gaikinn 14-02-2011 23:02 1613044

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

gaikinn 16-02-2011 07:34 1614113

Ну как, друзья мои, столько народу просмотрело, и никто не знает решения? Помогите плиз, шибко нужно!

gaikinn 16-02-2011 10:22 1614185

Вот чем мне смогли помочь:
Код:

@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 1614249

Код:

@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 1614317

Так?!
Код:

@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 1614322

Цитата:

Цитата Iska
как обойтись без костыля »

увы, никак... AFAIK единственный способ прервать цикл - перейти по метке, обходной путь - отфильтровать только одну строку (как в моём примере выше - через дополнительный FindStr)

Iska 16-02-2011 13:17 1614333

Цитата:

Цитата amel27
…обходной путь - отфильтровать только одну строку (как в моём примере выше - через дополнительный FindStr) »

Точно, помнится, так и было! Спасибо за напоминание.

amel27 16-02-2011 16:12 1614493

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 1614618

Позвольте свой вариант:
Код:

@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 1614662

amel27, спасибо, добавил в «Избранное».

gaikinn 17-02-2011 13:52 1615313

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


Время: 17:36.

Время: 17:36.
© OSzone.net 2001-