Подстановки в операторе for (cmd.exe)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.02.10 07:19
Оценка:
В виндовом командном языке (cmd.exe) есть операции подстановки (замена подстроки в значении переменной, выборка подстроки и т.п. — подробнее в set /?), но их синтаксис рассчитан только на использование обычных set-переменных. Можно ли эти операции как-то применить к for-переменным внутри цикла, или непременно нужно вызывать подпрограмму либо включать delayed expansion и использовать промежуточную set-переменную с "!"?

Подстановка вида "%~$PATH:I" для for-переменных наводит на мысли, что возможность есть, только как это оформить?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Подстановки в операторе for (cmd.exe)
От: Centaur Россия  
Дата: 01.02.10 12:10
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>В виндовом командном языке (cmd.exe) есть операции подстановки (замена подстроки в значении переменной, выборка подстроки и т.п. — подробнее в set /?), но их синтаксис рассчитан только на использование обычных set-переменных. Можно ли эти операции как-то применить к for-переменным внутри цикла, или непременно нужно вызывать подпрограмму либо включать delayed expansion и использовать промежуточную set-переменную с "!"?


ЕМ>Подстановка вида "%~$PATH:I" для for-переменных наводит на мысли, что возможность есть, только как это оформить?


Встроенный help по команде for замечательно объясняет всё, что можно написать между % и именем переменной.

C:\>for /?
[…]
In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.
Re[2]: Подстановки в операторе for (cmd.exe)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.02.10 13:55
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Встроенный help по команде for замечательно объясняет всё, что можно написать между % и именем переменной.


Если что — я в состоянии догадаться, как попросить хелп, и даже умею его читать.

Если Вы полагаете, что в хелпе описаны все тонкости синтаксиса — попробуйте там найти, например, разъяснение того, как в подстановку вида %var:~n,m% вместо n и m подставить значения переменных.

Смысл моего вопроса был в наличии возможностей интерпретатора за пределами официально заявленного синтаксиса.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Подстановки в операторе for (cmd.exe)
От: Vain Россия google.ru
Дата: 01.02.10 15:10
Оценка: 4 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

C>>Встроенный help по команде for замечательно объясняет всё, что можно написать между % и именем переменной.

ЕМ>Если что — я в состоянии догадаться, как попросить хелп, и даже умею его читать.
ЕМ>Если Вы полагаете, что в хелпе описаны все тонкости синтаксиса — попробуйте там найти, например, разъяснение того, как в подстановку вида %var:~n,m% вместо n и m подставить значения переменных.
ЕМ>Смысл моего вопроса был в наличии возможностей интерпретатора за пределами официально заявленного синтаксиса.
см. двойное раскрытие переменных
Автор(ы): Андрей Дибров
Дата: 15.03.2008
Данная статья позиционируется как дополнение к неосвещённым проблемам в bat-скриптах. Особое внимание уделено примерам, в которых предлагается рассмотреть основные проблемы работы и организации скриптов.

как то так:
set "var=..."
set "n=..."
set "m=..."
call set "X=%%var:~%n%,%m%%%"
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Подстановки в операторе for (cmd.exe)
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.02.10 16:30
Оценка:
Здравствуйте, Vain, Вы писали:

V>
V>set "var=..."
V>set "n=..."
V>set "m=..."
V>call set "X=%%var:~%n%,%m%%%"
V>


Хм, про хитрость с call set я не знал, спасибо. Сам всегда делал это через delayed expansion, с "!".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.