Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Группировка файлов (http://forum.oszone.net/showthread.php?t=295245)

r1sh 09-02-2015 15:44 2468975

Группировка файлов
 
Всем привет!

Есть структура папок:

archive
|
+2014-Apr-01
|
+2014-Apr-02
|
+2014-Apr-03


Нужно все файлы в папках переместить в каталог соответcтвующий формату 2014-Apr

Я написал скрипт:

Код:

chcp 1251
setlocal enabledelayedexpansion
set input=d:\arch
set output=d:\test
set h="string"
mkdir %output%\2014
mkdir %output%\2014\2014-Jan
mkdir %output%\2014\2014-Feb
mkdir %output%\2014\2014-Mar
mkdir %output%\2014\2014-Apr
mkdir %output%\2014\2014-May
mkdir %output%\2014\2014-Jun
mkdir %output%\2014\2014-Jul
mkdir %output%\2014\2014-Aug
mkdir %output%\2014\2014-Sep
mkdir %output%\2014\2014-Oct
mkdir %output%\2014\2014-Nov
mkdir %output%\2014\2014-Dec
for /f %%i in ('dir /b %input%\') do (
for /f %%j in ('dir /b %input%\%%i\"#msgs"\') do (
ren %%j %%i_%%j
)
set h=%%i
move %input%\%%i\#msgs\* %output%\2014\%h:~0,8%\
)

проблема в том, что значение переменной h после set h=%%i все равно остается "string"

Подскажите пожалуйста с чем связана проблема?

Georgio 09-02-2015 15:59 2468982

Код:

move %input%\%%i\#msgs\* %output%\2014\!h:~0,8!\

r1sh 09-02-2015 16:50 2469016

спасибо заработало!!! блин а почему??? о_О

Georgio 09-02-2015 17:01 2469019

Цитата:

Цитата r1sh
а почему??? »


Потому что переменные, задаваемые внутри цикла, должны расширяться не с помощью символов процента, а с помощью восклицательных знаков при обязательном включении отложенного расширения переменных ("setlocal enabledelayedexpansion"), что у Вас, кстати, в коде есть.

r1sh 09-02-2015 17:33 2469050

Цитата:

Цитата Georgio
Потому что переменные, задаваемые внутри цикла, должны расширяться не с помощью символов процента, а с помощью восклицательных знаков при обязательном включении отложенного расширения переменных ("setlocal enabledelayedexpansion"), что у Вас, кстати, в коде есть. »

а без "setlocal enabledelayedexpansion" они не будут вообще расширяться?

Iska 09-02-2015 17:58 2469079

Цитата:

Цитата r1sh
а без "setlocal enabledelayedexpansion" они не будут вообще расширяться? »

Будут. Но только обычным образом — сразу, не «отложенно». Результат Вы видели в первом сообщении.

Иногда можно обойтись без отложенного расширения, используя технику опосредованного раскрытия переменных по «call»:
Код:

@echo off
setlocal enableextensions disabledelayedexpansion

set sVar1=Some Value 1

(
        set sVar2=Some Value 2
       
        echo [%sVar1%]
        echo [%sVar2%]
        call echo [%%sVar2%%]
)

endlocal
exit /b 0



Время: 09:44.

Время: 09:44.
© OSzone.net 2001-