2

Я не очень знаком с программированием файлов Windows Bat, и я был бы признателен за любую помощь в этом.

Мне нужен файл bat, чтобы сделать следующее:

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

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

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

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

2 ответа2

3

Вы просили Batch , но я отвечаю с Powershell потому что я думаю, что сегодня 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
}

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

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

$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 - переменные, используемые в двух циклах for .Первый содержит полные пути к.Файлы 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, расположенные с помощью команды dir, называются "C:\Reports folder\123-Chemistry-101.rep" .

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .