1 (изменено: Kot_Begimot, 2012-04-09 19:41:59)

Тема: CMD/BAT: Переменная цикла For и имена переменных окружения...

Есть несколько переменных окружения:

set Fixdisk1=C:
set Fixdisk2=D:
set Fixdisk3=E:
set Fixdisk4=F:
set Fixdisk5=G:
set Fixdisk6=H:
set Fixdisk7=I:
set Fixdisk8=J:
...

и т.д. в зависимости от количества дисков


Теперь в cmd-командном файле нужно обращаться к именнам переменных через цикл for. Типа:

for /l %%i in (1,1,9) do if exist %Fixdisk%%i%\filename.ext set %Fixdisk%%i%=%Fixdisk%%i%\

Что то типа этого. Только этот мой код, к сожалению, не работает.

Заранее спасибо.

2

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

Я добавил префикс «CMD/BAT: » к заголовку темы и обрамил код тэгом «code».

И что?

3 (изменено: Kot_Begimot, 2012-04-09 19:48:22)

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

for /l %%i in (1,1,9) do if exist %Fixdisk%%%i\filename.ext set %Fixdisk%%i%=%Fixdisk%%i%\

Этот мой код к сожалению не работает, поэтому прошу помощи уважаемых участников форума:

Вот еще пример. Нормальный вызов переменной:

set Fixdisk1=%Fixdisk2%

так работает

а как через цикл for, где переменная %%i должна стать частью имени переменной:

set Fixdisk%%i=%Fixdisk%%i+1%

так нет. А как?

4

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

Для вычислений предназначена форма команды «set /a».

Подозреваю, что, то, что Вы хотите получить, делается гораздо проще:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in (c d e f g h) do if exist "%%i:\filename.ext" if not defined sDisk set sDisk=%%i:

if defined sDisk (
    echo [%sDisk%]
) else (
    echo Not found
)

endlocal
exit /b 0

Если по условиям задачи допустимо использование «wmic.exe» или «fsutil.exe», то можно и не задавать перечень дисков «ручками».

5

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

alexii пишет:

Для вычислений предназначена форма команды «set /a».

Подозреваю, что, то, что Вы хотите получить, делается гораздо проще:

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

set Fixed1=C:
set Fixed2=D:
set Fixed3=E:
...
set Removable1=M:
set Removable2=N:
...
set CDROM1=X:
set CDROM2=Y:

Поэтому нет смысла снова перебирать весь алфавит. Надо работать с этими уже установленными переменными окружения.

6

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

Избегайте излишнего цитирования. Я поправил Ваш пост.

Kot_Begimot пишет:

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

Вы не дали комментариев по:

Если по условиям задачи допустимо использование «wmic.exe» или «fsutil.exe», то можно и не задавать перечень дисков «ручками».

Ибо в этом случае нет нужды устанавливать переменные окружения:

wmic.exe LogicalDisk where "DriveType = '…'"
Kot_Begimot пишет:

Надо работать с этими уже установленными переменными окружения.

Не надо.

7

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

alexii пишет:

enabledelayedexpansion

а не используете

setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do if exist !Fixdisk%%i!\filename.ext set sDisk=!Fixdisk%%i!
set sDisk

8 (изменено: alexii, 2012-04-09 21:26:31)

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

!k, супер! То что надо! Спасибо.

9

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

Kot_Begimot, второй и последний раз говорю:

Избегайте излишнего цитирования.

Я поправил Ваш пост

10 (изменено: Kot_Begimot, 2012-04-09 21:43:18)

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

!k пишет:
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do if exist !Fixdisk%%i!\filename.ext set sDisk=!Fixdisk%%i!
set sDisk

Здесь цитирование необходимо.
А как прервать цикл, чтобы он не крутил до 9, если файл уже нашелся при значении %%i, например там 2 или 3?

11

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

for /l %%i in (1,1,9) do if exist !Fixdisk%%i!\filename.ext set sDisk=!Fixdisk%%i! &goto :go
:go

12 (изменено: Kot_Begimot, 2012-04-09 23:32:11)

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

%PATH:~0,-1%

::извлечет все символы переменной PATH, за исключением 1-го последнего.

А в этом случае не проходит :

for /l %%i in (1,1,9) do if defined REMOVABLE%%I (
if "!REMOVABLE%%I:~-1,1!"=="\" set REMOVABLE%%I=!REMOVABLE%%I:~0,-1!

set выдает ошибку.

13

Re: CMD/BAT: Переменная цикла For и имена переменных окружения...

Сам разобрался. В цикле For переменная %%i, а в set и if вызывалась %%I. Оказывается строчные и прописные имена переменных в командном файле различны. Не знал.