BAT-файл для извлечения имени папки из имени файла и перемещения файла в эту папку

BAT-файл для извлечения имени папки из имени файла и перемещения файла в эту папку

Я не очень хорошо разбираюсь в программировании bat-файлов Windows и был бы признателен за любую помощь в этом вопросе.

Мне нужен bat-файл для выполнения следующих действий:

  • извлечь имя папки из имени файла — например, извлечь Chemistry из имени файла "123-Chemistry-101.rep". "-" можно использовать для обозначения начала и конца токена.
  • переместите тот же файл в папку Chemistry. Chemistry будет подкаталогом, где находятся все отчеты.

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

например, для /RU:\Test %%f в (*.rep) выполните копирование %%f U:\test\Chemistry\

С уважением, Дюран

решение1

Вы просили Batch, но я отвечаю , Powershellпотому что считаю, что today Batchнемного устарел для такой задачи, надеюсь, ваша система поддерживает Powershell:

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep

foreach($file in $files) {
  $folder = $file.toString().split("-")[1]
  $sourcefile = "$rootDir\$file"
  $targetdir = "$rootDir\$folder"
  if(!(Test-Path -Path $targetdir )){
    New-Item -ItemType directory -Path $targetdir
  }
  Move-Item $sourcefile $targetdir
}

Редактировать @Каран:

Рекурсивно (сохраняя дерево подкаталогов):

$rootDir = "U:\Test"

$files = Get-ChildItem $rootDir -Filter *.rep -Recurse

foreach($file in $files) {
  $sourcefile = $file.Fullname
  $filepath = $file.PSParentPath
  $newfoldertocreate=$file.toString().split("-")[1]
  if(!(Test-Path -Path $filepath\$newfoldertocreate)){
    New-Item -ItemType directory -Path $filepath\$newfoldertocreate
  }
  Move-Item $sourcefile $filepath\$newfoldertocreate
}

решение2

Запустите этот пакетный файл из родительской папкиПапка отчетов:

for /f "delims=" %%a in ('dir /b /s "Reports folder\*.rep"') do for /f "tokens=2 delims=-" %%i in ("%%~a") do (
    if not exist "%%~dpa%%i\" md "%%~dpa%%i"
    move "%%~a" "%%~dpa%%i\"
)

%%a и %%i — переменные, используемые в двухдляциклы. Первый содержит полные пути к файлам .REP (предоставлено внешним циклом), а второй содержит имена папок, извлеченные из имен файлов (предоставлено внутренним циклом).

for /?это то, на что действительно следует обратить внимание всем заинтересованным лицам для получения дополнительной помощи (обратите внимание, что в пакетных файлах знаки % удваиваются):

%~I  - expands %I removing any surrounding quotes (")
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only

Так что же означает "%%~dpa%%i"? Предположим, что один из файлов .REP, расположенныйрежкоманда — "C:\Reports folder\123-Chemistry-101.rep".

%%~дпабудет означать букву диска и путь к файлу за вычетом окружающих кавычек, т. е C:\Reports folder\. .

%%ябудет, как я отметил выше, именем папки, извлеченным из имени файла (все, что находится между двумя дефисами в качестве разделителей), поэтому в этом случае Chemistry.

Если собрать все вместе, то "%%~dpa%%i" для этого файла будет расширяться до "C:\Reports folder\Chemistry", поскольку именно туда мы хотим переместить файл.

Связанный контент