CMD-код для цикла для упорядочивания имени файла - PullRequest
0 голосов
/ 11 марта 2019

Это моя функция в партии CMD.Цель состоит в том, чтобы классифицировать 9 папок по разным именам, например, если имя содержит 109, тогда файл будет размещен в папке 109. Однако здесь я могу написать только 9 для циклов

(имя папки - номер телефона101-109 и формат файла - date-phone1-phone2 - идентификатор записи, некоторые из идентификатора записи будут дублироваться, потому что настройка строки поиска)

for /r %%i in (*) do ( 
If %%i contains '-101-' (move %%i 101)
else if %%i contains '-102-' (move %%i 102))

Но это не сработает.Я также пытаюсь, если %% i in ( -101- ), но тоже не работает.Есть ли более простой способ написать forloop для сортировки, как она идет вместо того, чтобы запрашивать цикл 9 раз.

setlocal

set year=%date:~10,4%
set month=%date:~4,2%
set day=%date:~7,2%

cd C:\Users\SQ\Desktop\MWRecord
IF EXIST %year% (cd %year%) ELSE (mkdir %year% & cd %year%)
IF EXIST %year%%month% (cd %year%%month%) ELSE (mkdir %year%%month% & cd %year%%month%)
IF EXIST %year%%month%%day% (cd %year%%month%%day%) ELSE (cd ..\.. & move %year%%month%%day% %year%\%year%%month% & cd %year%\%year%%month%\%year%%month%%day%)

for /r %%i in (*-101-*) do ( IF EXIST 101 (move %%i 101) ELSE (mkdir 101 & move %%i 101))
for /r %%i in (*-102-*) do ( IF EXIST 102 (move %%i 102) ELSE (mkdir 102 & move %%i 102))
for /r %%i in (*-103-*) do ( IF EXIST 103 (move %%i 103) ELSE (mkdir 103 & move %%i 103))
for /r %%i in (*-104-*) do ( IF EXIST 104 (move %%i 104) ELSE (mkdir 104 & move %%i 104))
for /r %%i in (*-105-*) do ( IF EXIST 105 (move %%i 105) ELSE (mkdir 105 & move %%i 105))
for /r %%i in (*-106-*) do ( IF EXIST 106 (move %%i 106) ELSE (mkdir 106 & move %%i 106))
for /r %%i in (*-107-*) do ( IF EXIST 107 (move %%i 107) ELSE (mkdir 107 & move %%i 107))
for /r %%i in (*-108-*) do ( IF EXIST 108 (move %%i 108) ELSE (mkdir 108 & move %%i 108))
for /r %%i in (*-109-*) do ( IF EXIST 109 (move %%i 109) ELSE (mkdir 109 & move %%i 109))

endlocal

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Вы можете сделать это следующим образом:

@echo off

for /L %%A IN (101 1 109) do (
    for /F "delims= eol=" %%B IN ('dir /S /B /A-D "*-%%A-*"') do (
        md "%%A" 2>nul
        move "%%~fB" "%%A"
    )
)

Однако это не будет полностью работать, если файл содержит, например, 101 и 102, и вы хотите переместить его в папку 102.

Итак, я бы порекомендовал следующий довольно сложный код:

@echo off
setlocal EnableDelayedExpansion

for /F "delims= eol=" %%A IN ('dir /S /B /A-D "*%%A*"') do (
    set "fname=%%~nA"
    set "all=!fname:--=-random-!"

    rem The code below is for the first phone:
    for /F "tokens=2 delims=-" %%C IN ("!all!") do (
        md "%%B"
        move "%%~fA" "%%~dpA%%~nxB"
    )
)

Замените tokens=2 на tokens=3, если вам нужен второй телефон.

0 голосов
/ 11 марта 2019

Если у вас есть полный список чисел (который, кажется, имеет место), который вы хотите найти, если это так, то, возможно, это поможет.Он не перемещает файлы, вместо этого он копирует файл, поэтому, если вы ищете 104, он скопирует его в папку 104, если, тем не менее, вы будете искать оба числа, как для второго примера в вашем списке, то есть 104 и 109 он скопирует файл в обе папки 104 и 109 После этого вы можете просто сделать del *.wav после обоих циклов.

@echo off
set "list=101 102 103 104 105 106 107 108"
for %%i in (%list%) do (
  for /F %%a in ('dir /b /a-d "*-%%i-*"') do (
      mkdir %%i
      copy "%%a" %%i
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...