Я не очень хорошо разбираюсь в программировании 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"
, поскольку именно туда мы хотим переместить файл.