BATCH, создайте копии файлов в отдельные каталоги с VARIABLE NAME - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь создать командный файл, который будет:

  1. Запросить каталог (в котором содержится много файлов)

  2. Запросить второй каталог (это место, где пакет будет создавать каталоги для каждого файла, а затем скопировать каждый файл в свой собственный каталог)

  3. Количество символов, удаляемых справасторона созданного каталога.(Например, два документа «NewDoc_Ver1» и «NewDoc_Ver2» будут скопированы в один и тот же каталог «NewDoc»).

Ниже приведены некоторые похожие вопросы, которые могут помочь.

https://superuser.com/questions/1138283/batch-script-for-moving-files-to-the-same-name-folder

Как узнать длину строки в пакетном файле?

пакетных файлов, вызывающих% ~ 1 и получающих текущий переменнуюзначение / строка

https://ss64.com/nt/syntax-substring.html

В настоящее время я застрял при попытке заставить 'String Left' работать с динамическим числом.(Я еще не посмотрел, как вставить пользовательский ввод). Любая помощь была бы отличной.

@echo off
setlocal enabledelayedexpansion
set folderpath=C:\Users\james.shaw\Desktop\R2
for %%f in (%folderpath%\*.*) do (
  set "foldername=%%~nf"
  set f1=!foldername!
  call :strlen folderlength foldername
REM set JS1=%%foldername:~0,!folderlength!%%
set JS1=!f1!:~0,!folderlength!
  md !JS1!
REM md "!foldername:~0,!folderlength!!" >nul 2>&1
  move "%%f" "!foldername:~0,!folderlength!!"
pause
)
goto :eof

:strlen <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

Обновление:

ниже я нашел пакет, похожий нато, что я ищу (я потерял веб-URL), однако он работает только в том же каталоге, что и пакетный файл, и не позволяет усекать созданные каталоги: мне все еще интересно узнать, что я делал неправильнов моей первоначальной попытке.

@echo off
setlocal EnableDelayedExpansion

set RemoveStrings="[ www.AnnoyingSpam.com ]",
Rem     RemoveStrings     variable notes:
Rem     Surround strings to remove with double quotes.
Rem     Separate each separate string to remove with a comma.

goto :main

: trim_leading_spaces VariableName
setlocal EnableDelayedExpansion
    set "_=!%~1!"
    set _=%_:"=%
: trim_leading_spaces__while
    if "%_:~0,1%"==" " ( set "_=%_:~1%"& goto :trim_leading_spaces__while)
endlocal & set "%~1=%_%"
goto :eof

: trim_trailing_spaces VariableName
setlocal EnableDelayedExpansion
    set "_=!%~1!"
    set _=%_:"=%
: trim_trailing_spaces__while
    if "%_:~-1%"==" " ( set "_=%_:~0,-1%"& goto :trim_trailing_spaces__while)
endlocal & set "%~1=%_%"
goto :eof

: main
for /f "delims=" %%I in (     dir /b /a:-d ^| findstr /vixc:"%~nx0"     ) do (
    Set file = "%%~I"
    for %%J in (%REMOVESTRINGS%) do set "file=!FILE:%%~J=!"
    call :trim_leading_spaces  file
    call :trim_trailing_spaces file
    for %%J in ("!FILE!") do set "NewDirName=%%~nJ"
    md "!NEWDIRNAME!"
    ren "%%~I" "!FILE!"
    move "!FILE!" "!NEWDIRNAME!"
)

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вот пример сценария для работы с вами:

@Echo Off
SetLocal EnableDelayedExpansion
Set /P "dirSrc=Enter full path of your files source directory: "
Set /P "dirDst=Enter the full path to hold your destination directories: "
Set /P "numEnd=Enter the number of characters to right trim the filenames by: "
For %%A In ("%dirSrc%\*") Do (Set "fileNm=%%~nA"
    If "%numEnd%"=="0" (XCopy "%%A" "%dirDst%\%%~nA\" 2>Nul
    ) Else XCopy "%%A" "%dirDst%\!fileNm:~,-%numEnd%!\" 2>Nul)

Это должно работать нормально, если входные данные верны.

Я ожидаю, что вы реализуете этипроверяет и проверяет введенные данные (ваш конечный пользователь может ввести все, что пожелает) .

0 голосов
/ 18 мая 2018

Судя по вашим примерам:

NewDoc_Ver1
NewDoc_Ver2

Похоже, что у вас может быть общий разделитель, равный _

Если это действительно так, и вы просто хотите первое слово, перед _ в качестве имени папки, тогда это может помочь.

@echo off
setlocal enabledelayedexpansion
cls
:input
set /p "input=1. Enter Source directory: "
if not exist "%input%" echo Invalid source: "%input%" enter valid path && goto :input 
:output
set /p "output=2. Select Destination Directory: "
if not exist "%output%" echo Invalid Dest: "%output%" enter valid path && goto :output

for %%i in (%input%\*) do (
 set "file=%%~nxi"
 for /f "delims=_" %%a in ("!file!") do (
 set "folder=%%a"
 if not exist "!output!\!folder!" mkdir "!output!\!folder!"
  copy /Y "!input!\!file!" "!output!\!folder!" >nul
  echo Copied "!input!\!file!" to "!output!\!folder!\!file!"
  )
)

Объяснение:

Это запрашивает у пользователя каталог source.Если каталог не существует, он запросит его повторно, если он существует, он запросит каталог destination, если путь назначения недопустим, отобразите его и повторите запрос.

Затем мы берем каждый файл и присваиваем ему имя переменной %file%, а точнее в этом enabledelayedexpansion случае !file!, затем для каждого имени файла мы делим его на _ и присваиваем первую часть имени !folder!.Теперь мы просто проверяем, существует ли папка в указанном ранее месте назначения пользователя, если нет, то создаем ее, а затем копируем каждый файл в source в соответствующий каталог назначения, где создаются новые папки.

Если вашформат файла не соответствует вашим примерам, пожалуйста, предоставьте мне правильные примеры, и я исправлю свой ответ.

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