Пакетное создание папок на основе части имени файла без сохранения расширения - PullRequest
0 голосов
/ 17 января 2019

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

Получил это до сих пор:

@ECHO OFF
SETLOCAL
SET "sourcedir=D:\Sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4 delims=" %%a IN (
 'dir /b /a-d "*.pdf"'
 ) DO (  
 ECHO MD %%c
 ECHO MOVE "%%a %%b %%c %%d" .\%%c\
)
POPD
GOTO :EOF

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

Пример имени файла:

"Файл № 10.pdf

Ожидаемое имя папки:

10

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вы можете запустить цикл 2 для получения полного имени в первом цикле, затем разделить имя во втором цикле, получить третий токен, создать каталог и затем скопировать фактическое имя файла из первого цикла.

Таким образом, вам не нужно снова пытаться исправить имя вместе, я знаю, что это работает, но это уродливо и не является предпочтительным:

@echo off
setlocal enabledelayedexpansion
set "sourcedir=D:\Sourcedir"
pushd %sourcedir%
for %%a in (*.pdf) do (
    set "var=%%a"
   for /f "tokens=3" %%i in ("!var!") do (
     echo md "%%~ni"
     echo move "%%~a" "%%~ni"
  )
)
popd
goto EOF

Для получения дополнительной информации об этих командах см. Справку для каждогос cmd.exe т.е.

for /?
set /?
setlocal /?

set и setlocal содержит очень конкретную информацию относительно отложенного расширения.

0 голосов
/ 18 января 2019

Вот альтернатива, которая будет просто использовать последнюю строку / число, разделенную пробелом, независимо от того, сколько их будет, (если их нет, будет использоваться целое имя файла) !

@Echo Off
For %%A In ("D:\Sourcedir\*.pdf") Do Call :L "%%A"
Exit /B

:L
Set "F=%~n1"
Set "F=%F: ="&Set "F=%"
If Not Exist "%~dp1%F%\" MD "%~dp1%F%"
Move /Y %1 "%~dp1%F%"

И если вы хотите переместить только те из них, которые имеют хотя бы один пробел, вы можете включить это в For скобки.

@Echo Off
For %%A In ("D:\Sourcedir\* *.pdf") Do Call :L "%%A"
Exit /B

:L
Set "F=%~n1"
Set "F=%F: ="&Set "F=%"
If Not Exist "%~dp1%F%\" MD "%~dp1%F%"
Move /Y %1 "%~dp1%F%"
0 голосов
/ 17 января 2019

Почему вы использовали delims=? Это удалит разделитель и примет всю строку до %%a.
Попробуйте это:

@ECHO OFF
SETLOCAL
SET "sourcedir=D:\Sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3" %%a IN (
 'dir /b /a-d "*.pdf"'
 ) DO (  
 ECHO MD %%~nc
 ECHO MOVE "%%a %%b %%c" .\%%~nc\
)
POPD

GOTO :EOF

Если delims= не установлено, будет использоваться пробел. Таким образом, %%c будет 10.pdf, ~n - для извлечения n ame части.

Это основано на вашем вопросе, который вы можете объединить %%a %%b %%c вместе с spaces, тогда все просто.
Если ваши имена файлов более сложные, лучше использовать внутренний цикл for.
- Какой другой вопрос уже дал отличное решение.

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