@Djasar

Нужно отсортировать все файлы по папкам.?

Я не сильно силен в CmD
Есть файлы в папке C:\Temp\
A20210423.2300+0300-0000+0300_ATS_60_01_GU.xml.gz
A20210423.2300+0300-0000+0300_ATS_60_02_GULN.xml.gz
A20210423.2345+0300-0000+0300_ATS_60_01_GU.xml.gz
A20210423.2345+0300-0000+0300_ATS_60_02_GULN.xml.gz
нужно что бы создались папки по имени файла с конца имени файла и разложились по папкам.

Должно получиться вот так
Папка С:\Temp\ATS_60_01_GU
A20210423.2300+0300-0000+0300_ATS_60_01_GU.xml.gz
A20210423.2345+0300-0000+0300_ATS_60_01_GU.xml.gz

Папка С:\Temp\ATS_60_02_GULN
A20210423.2300+0300-0000+0300_ATS_60_02_GULN.xml.gz
A20210423.2345+0300-0000+0300_ATS_60_02_GULN.xml.gz
  • Вопрос задан
  • 332 просмотра
Решения вопроса 1
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
Powershell
Set-Location c:/temp
$groups = (Get-ChildItem A*).Name | group-object -property {$_.Substring(30,$_.Length -37)} -ashashtable -asstring
$groups.Keys | foreach-object { 
    $folder=$_; $groups[$folder] | foreach-object {
                  new-item -itemtype file -path "$folder/$_" -force
                  move-item -path $_ -destination "$folder/$_" -force
     }
}

Если нужен однострочник
cd c:/temp;$g=(dir A*).Name | group {$_.Substring(30,$_.Length -37)} -AHT -asstring;$g.keys | %{$f=$_;$g[$f] | %{ni -type file -path $f/$_ -force; mv $_ $f/$_ -force}}

Однострочник можно, взяв в одинарные кавычки, передать параметром в powershell.exe, если вам надо было бы использовать этот функционал в уже написанных cmd скриптах.
Но вообще не надо откапывать стюардессуиспользовать cmd для скриптов. Используйте powershell \ python
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
В вашей задаче несколько проблем:
1. Убрать двойное расширение. Если расширение всегда фиксировано, то можно просто использовать операцию замены, которая есть в set. Если расширение не фиксировано, то можно использовать 2 вызова процедуры (или вложенные циклы for) и модификатор %%~dpnI.
2. Выделить подстроку в имени файла. Само имя файла выделить из пути, из которого уже предварительно удалены расширения, можно с помощью модификатора %%~nI. Далее можно использовать цикл for /f для разбиения имени на составные части, разделителем указать символы "+", "-", "_"

Обход файлов делается в цикле for.

Для справки смотрите:
:: тут описание модификаторов и описание разновидностей for
for /?
:: операция замены, арифметика, ...
set /?
:: Вам нужно будет, скорее всего использовать режим отложенного расширения переменных: ENABLEDELAYEDEXPANSION. Разберитесь с ним, это достаточно тонкий и не очевидный момент
setlocal /?
:: просто так
if /?
:: Каждая команда cmd имеет свою справку используйте ее. Это основной источник информации по программированию cmd
...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы