пакетный скрипт для файловой системы: использование переменной for-loop в другом вложенном for-loop

63
8

последние 4-5 часов, которые я потратил на исправление моего скрипта, и попробовал несколько вещей, но он все еще не работает так, как предполагалось. Вот рабочая часть:

    @echo off
rem automatically sort MP3s into an existing structure or add folders if needed
rem example of MP3-file pattern: Wu-Tang Clan - Gravel Pit (LP Version Clean).mp3

SETLOCAL

rem set variables
SET "source=g:\music\folder"
SET "str=Wu-Tang Clan - Gravel Pit (LP Version Clean).mp3"
SET "test=%source%\%str%"

rem split the filename from the remaining path. Take the left part
rem and assign it to %band% while the right part gets assigned to %song%
FOR /f "delims=" %%i IN ("%test%") DO SET "result=%%~nxi"

SET "band=%result: - =" & SET "song=%"

rem If there is no such folder (%band%), create it
IF not exist "%source%\%band%" MD "%source%\%band%"

rem As soon as there definetely is a fitting folder
rem move the file over there.
MOVE /-Y "%source%\%result%" "%source%\%band%"

Следующим шагом будет усиление кода с помощью цикла for, поэтому мне не нужно редактировать сценарий для каждого из моих 3k+ файлов;)

Я очень старался получить этот код, но не смог: @echo off SETLOCAL

    SET "source=g:\music\folder"

FOR %%f IN (%source%\*.mp3) DO (
echo %%f

FOR /f "delims=" %%i IN ("%%f") DO SET "result=%%~nxi"

SET "band=!result: - =" & SET "song=%"

IF not exist "%source%\%band%" MD "%source%\%band%"

MOVE /-Y "%source%\%result%" "%source%\%band%"
)
pause

Поэтому я добавил цикл for, и %% f был правильно заполнен вначале и не был в следующем for-loop.

    FOR %%f IN (%source%\*.mp3) DO (
echo %%f

Это привело к: "g:\music\folder\Wu-Tang Clan - Gravel Pit (версия LP Clean).mp3"

Как и предполагалось. Но после этого

    FOR /f "delims=" %%i IN ("%%f") DO SET "result=%%~nxi"

результат, и каждая следующая переменная была пуста, всегда.

Я попытался исправить его со второй переменной как "помощник":

    FOR %%f IN (%source%\*.mp3) DO (
SET "helper=%%f"
FOR /f "delims=" %%i IN ("%helper%") DO SET "result=%%~nxi"

Даже добавил "enabledelayedexpansion" после того, как я прочитал об этом и пошел

    FOR /f "delims=" %%i IN ("!helper!") DO SET "result=%%~nxi"

все еще не работает.

Теперь мне действительно нужна была какая-то помощь, и я был бы очень признателен :)

рассматривает Феникс

спросил(а) 2021-01-25T16:54:14+03:00 5 месяцев назад
1
Решение
63

Следующий фрагмент кода может работать. Обратите внимание, что команда SET "band=%result: - =" & SET "song=%" не может быть выполнена с использованием ! в отличие от % -expansion. Поэтому эта команда перемещается в подпрограмму :myset и выполняется с помощью команды call.

@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion
SET "source=g:\music\folder"
FOR %%f IN (%source%\*.mp3) DO (
echo %%f
FOR /f "delims=" %%i IN ("%%f") DO SET "result=%%~nxi"
call :myset
IF not exist "%source%\!band!" MD "%source%\!band!"
MOVE /-Y "%source%\!result!" "%source%\!band!"
)
goto :skipMyset

:myset
SET "band=%result: - =" & SET "song=%"
goto :eof

:skipMyset
pause

Ресурсы (требуемое чтение):

ответил(а) 2021-01-25T16:54:14+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема