@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
  • Вопрос задан
  • 287 просмотров
Решения вопроса 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
...
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы