Как переместить определенные файлы на основе расширения входного файла пользователя в другую папку и создать ярлыки в исходном каталоге для каждого перемещенного файла? - PullRequest
0 голосов
/ 26 сентября 2018

Я хотел бы создать файлы .bat, которые запрашивают расширение файла и путь, затем сканирует каталог и подпапки, в которых находится сам файл .bat, просматривая все файлы с предоставленным расширением, и перемещает их вуказанный путь при создании .lnk в исходном местоположении.

Например, .bat будет вести себя так:

Введите расширение файла: mkv
Введите новый путь: e:\movies

Затем он сканирует папку и подпапки, в которых находится файл .bat, и перемещает все файлы .mkv по новому пути, одновременно создавая .lnk в исходной папке для каждого файла, который был перемещен..

Я хочу скопировать также исходную структуру источника в новую.Например, если у меня есть файл .mkv в d:\star trek\movie1\a.mkv, я бы хотел получить e:\movies\star trek\movie1\a.mkv, а затем d:\star trek\movie1\a.lnk..lnk должен ссылаться на перемещенный файл в папке на диске e:.

Любые идеи будут высоко оценены.


В качестве первого шага я хотел бы создатьпростой пакет, который запрашивает у пользователя расширение, а затем просто перечисляет все файлы с этим расширением.

Я написал:

@echo off
set /p type= File type?
dir *.type > list.txt

Но это не работает.Любые предложения?


Я нашел здесь некоторый код Как скопировать структуру каталогов, но включить только определенные файлы (используя пакетные файлы Windows) , и я только изучаю это.Я записал эту простую адаптацию, но я не понимаю, почему последнее эхо не выводит то, что я намереваюсь, например, полный путь назначения и имя файла.Я должен делать что-то глупое, я знаю!

@echo off
cls

setlocal enabledelayedexpansion
set SOURCE_DIR=K:\source
set DEST_DIR=K:\dest
set FILENAMES_TO_COPY=*.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        echo source: %%F
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        set FILE_NAME_EXT=%%~nxF
        set FILE_DIR
        set FILE_INTERMEDIATE_DIR
        set FILE_NAME_EXT
        xcopy /S /I /Y /V "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
        echo destination "%DEST_DIR%!FILE_INTERMEDIATE_DIR%FILE_NAME_EXT!"
        pause
    )
)

1 Ответ

0 голосов
/ 30 сентября 2018

Для пакетного файла ниже загрузите очень маленький ZIP-файл Shortcut.zip из Загрузки Optimum X - Freeware Utilities , извлеките ZIP-файл во временный каталог, прочитайте файл ReadMe.txtэтой бесплатной утилиты и переместите Shortcut.exe в ту же папку, что и пакетный файл.

Вот код комментария для этой задачи:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "%~dp0Shortcut.exe" (
    echo ERROR: Missing Shortcut.exe in "%~dp0".
    goto EndBatch
)

:GetExtension
set "FileExt="
set /P "FileExt=Enter file extension: "
rem Has the user not entered any string?
if not defined FileExt goto GetExtension
rem Remove all double quotes.
set "FileExt=%FileExt:"=%"
rem Is there nothing left after removing double quotes?
if not defined FileExt goto GetExtension
rem Is the first character a dot, then remove it.
if "%FileExt:~0,1%" == "." set "FileExt=%FileExt:~1%"
rem Is there nothing left after removing the dot?
if not defined FileExt goto GetExtension
rem Does the entered file extension string contain a
rem character which is not allowed in a file extension?
set "TempVar="
for /F "eol=| delims=*./:<>?\|" %%I in ("%FileExt%") do set "TempVar=%%I"
if not "%TempVar%" == "%FileExt%" goto GetExtension
rem Don't allow moving *.lnk shortcut files.
if /I "%FileExt%" == "lnk" goto GetExtension


:GetSourcePath
set "SourcePath=%~dp0"
set /P "SourcePath=Enter source path: "
set "SourcePath=%SourcePath:"=%"
if not defined SourcePath goto GetSourcePath
rem Replace all forward slashes by backslashes.
set "SourcePath=%SourcePath:/=\%"
rem Remove a trailing backslash.
if "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath:~0,-1%"
rem Recreate the environment variable if the entered source directory path
rem was just a backslash to reference root directory of current drive.
if not defined SourcePath set "SourcePath=\"
rem Does the entered source path string contain a
rem character which is not allowed in a folder path?
set "TempVar="
for /F "eol=| delims=*<>?|" %%I in ("%SourcePath%") do set "TempVar=%%I"
if not "%TempVar%" == "%SourcePath%" goto GetSourcePath
rem Determine full qualified source folder path.
for %%I in ("%SourcePath%") do set "SourcePath=%%~fI"
rem Remove once again a trailing backslash which can occur
rem if the source folder is the root folder of a drive.
if "%SourcePath:~-1%" == "\" set "SourcePath=%SourcePath:~0,-1%"
rem The source directory must exist.
if not exist "%SourcePath%\" (
    echo/
    echo ERROR: Source directory "%SourcePath%" does not exist.
    echo/
    goto GetSourcePath
)


:GetTargetPath
set "TargetPath="
set /P "TargetPath=Enter target path: "
if not defined TargetPath goto GetTargetPath
set "TargetPath=%TargetPath:"=%"
if not defined TargetPath goto GetTargetPath
rem Replace all forward slashes by backslashes.
set "TargetPath=%TargetPath:/=\%"
rem Remove a trailing backslash.
if "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath:~0,-1%"
rem Recreate the environment variable if the entered target directory path
rem was just a backslash to reference root directory of current drive.
if not defined TargetPath set "TargetPath=\"
rem Does the entered target path string contain a
rem character which is not allowed in a folder path?
set "TempVar="
for /F "eol=| delims=*<>?|" %%I in ("%TargetPath%") do set "TempVar=%%I"
if not "%TempVar%" == "%TargetPath%" goto GetTargetPath
rem Determine full qualified target folder path.
for %%I in ("%TargetPath%") do set "TargetPath=%%~fI"
rem Remove once again a trailing backslash which can occur
rem if the target folder is the root folder of a drive.
if "%TargetPath:~-1%" == "\" set "TargetPath=%TargetPath:~0,-1%"
rem Is the target path identical to source folder path?
if /I "%SourcePath%" == "%TargetPath%" (
    echo/
    echo ERROR: Target path cannot be the source path.
    echo/
    goto GetTargetPath
)


rem Does the specified target folder exist?
if exist "%TargetPath%\" goto GetPathLength

rem Ask user if target folder should be created or not.
echo/
echo ERROR: Folder "%TargetPath%" does not exist.
echo/
%SystemRoot%\System32\choice.exe /C YN /N /M "Create path (Y/N)? "
echo/
if errorlevel 2 goto GetTargetPath

md "%TargetPath%" 2>nul
if exist "%TargetPath%\" goto GetPathLength
echo ERROR: Could not create "%TargetPath%".
echo/
goto GetTargetPath


rem Determine length of source path (path of batch file).
:GetPathLength
setlocal EnableDelayedExpansion
set "PathLength=0"
:GetLength
if not "!SourcePath:~%PathLength%!" == "" set /A "PathLength+=1" & goto GetLength
rem For the additional backslash after source folder path.
set /A PathLength+=1
endlocal & set "PathLength=%PathLength%"


rem Move the non-hidden files with matching file extension with exception
rem of the batch file and Shortcut.exe. Use FOR /F with a DIR command line
rem instead of FOR /R to get this code working also on FAT32 and ExFAT
rem drives and when target folder is a subfolder of the batch file.
set "FileCount=0"
for /F "eol=| delims=" %%I in ('dir "%SourcePath%\*.%FileExt%" /A-D-H /B /S 2^>nul') do if /I not "%%I" == "%~f0" if /I not "%%I" == "%~dp0Shortcut.exe" call :MoveFile "%%I"

set "PluralS=s"
if %FileCount% == 1 set "PluralS="
echo Moved %FileCount% file%PluralS%.
goto EndBatch


:MoveFile
rem Do not move a file on which there is already a shortcut file
rem with same file name in source directory because then it would
rem not be possible to create a shortcut file for the moved file.
if exist "%~dpn1.lnk" goto :EOF

rem Get entire path of source file and remove path of batch file.
set "SourceFilePath=%~dp1"
call set "RelativePath=%%SourceFilePath:~%PathLength%%%"

rem Create target file path for this file.
set "TargetFilePath=%TargetPath%\%RelativePath%"
echo TargetFilePath=%TargetFilePath%
rem Remove trailing backslash if there is one.
if "%TargetFilePath:~-1%" == "\" set "TargetFilePath=%TargetFilePath:~0,-1%"

rem Create the target folder independent on its existence
rem and verify if the target folder really exists finally.
md "%TargetFilePath%" 2>nul
if not exist "%TargetFilePath%\" (
    echo ERROR: Could not create folder "%TargetFilePath%".
    goto :EOF
)

rem Move the file to target folder and verify if that was really successful.
rem On error remove a just created target folder not containing a file.
move /Y %1 "%TargetFilePath%\" 2>nul
if errorlevel 1 (
    rd "%TargetFilePath%" 2>nul
    echo ERROR: Could not move file %1.
    goto :EOF
)

rem Create the shortcut file in source directory of moved file.
"%~dp0Shortcut.exe" /F:"%~dpn1.lnk" /A:C /T:"%TargetFilePath%\%~nx1" /W:"%TargetFilePath%" /R:1 >nul
set /A FileCount+=1
goto :EOF


:EndBatch
endlocal
pause

Пакетный файл содержит много дополнительного кодабыть максимально защищенным от ошибок при неправильном вводе пользователем.

Для понимания используемых команд и их работы откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой из них.Команда очень осторожно.

  • call /?
  • choice /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • md /?
  • move /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...