2016-09-28 3 views
1

My Windows пакетный файл должен прочитать имена файлов и создать каталог, который называется в соответствии с 2-го имени файла к 5-ой букве:Перебор значений строк с использованием набора в Windows, CMD

for %%f in (.\*.txt) do (
set string=%%~nf 
mkdir %string:~2,5%  
) 

Значение «строки 'не обновляется, т.е., то же самое на каждом шаге цикла. Как я могу его обновить?

Это CMD выход:

>for %f in (.\*.txt) do (
set string=%~nf 
mkdir le3 
) 

>(
set string=file1 
mkdir le3 
) 

>(
set string=file2 
mkdir le3 
) 
A subdirectory or file le3 already exists. 

>(
set string=file3 
mkdir le3 
) 
A subdirectory or file le3 already exists. 
+0

Попробуйте консультационные сотни статей о SO о 'delayedexpansion'. По существу, '% var%' внутри кодового блока заменяется значением 'var', когда блок анализируется. Чтобы получить доступ к изменяющемуся значению в блоке, вы сначала загружаете вызов 'delayedexpansion' с помощью команды setlocal enabledelayedexpansion', а затем используйте'! Var! 'Для доступа к динамическому значению переменной. – Magoo

+0

Благодарим вас за ответ. Я консультировался с несколькими сайтами, например. [link] (http://stackoverflow.com/questions/6679907/how-do-setlocal-and-enabledelayedexpansion-work) и придумал «SETLOCAL ENABLEDELAYEDEXPANSION для %% f в (. \ *. txt) do (set ! string! = %% ~ nf mkdir! string: ~ 2,5!) ', но замедленное расширение пока не работает. Есть ли у вас какие-либо советы, что не так? – Joan

+0

'set! String! = %% ~ nf' должно быть' set string = %% ~ nf' - вы намерены установить переменную 'string', а не переменную' current content of string' – Magoo

ответ

1

Проблема вы бежите в это из-за %variable% expansion. Весь оператор FOR (включая до закрывающей круглой скобки) - это один оператор. Когда он считывается, командный процессор заменяет переменную %string% на любое значение строка установлена ​​на доSET внутри исполняет. (На самом деле, вы получаете подмножество строки, начиная с 2-го символа и исходящей 5 символов, но это не очень важно. Я предполагаю, что у вас есть %string% сета «file3».)

В любом случае, вы можете исправить это, добавив SETLOCAL ENABLEDELAYEDEXPANSION вверху и используя синтаксис, например !string!, вместо %string% внутри FOR.

Вы также можете переместить обработку %string% за пределы FOR.

Посмотрите HELP SETLOCAL и HELP SET, чтобы узнать больше.

Кроме того, если вы не заметили, вы не получите второй и пятый символы имени файла ... Как я уже упоминал, вы получаете подстроку (до) длины 5, начиная с символа 2. Посмотрите HELP SET для получения дополнительной информации.

+0

Теперь я включил задержку расширения и адаптировать код: 'SETLOCAL ENABLEDELAYEDEXPANSION для %% е в делать ( набор строка = %% ~ Н.Ф. MkDir строка!!!: ~ 2,5 \t \t ) (\ * .txt.).' Я понимаю эту идею, также пытался установить кавычки в разных местах, но все-таки я не получил отсроченное расширение для работы. Любые идеи? – Joan

0

Почти, у вас есть несколько ненужных восклицательные знаки в вашей последнюю попытке:

SETLOCAL ENABLEDELAYEDEXPANSION 
for %%f in (*.txt) do (
    set string=%%~nf 
    if not exist "!string:~2,5!\" mkdir "!string:~2,5!" 
) 
+0

Большое спасибо! Это решило проблему! – Joan

+0

Я помогаю сайту и протективным респондентам, если вы правильно помечаете правильные ответы. – Compo

Смежные вопросы