Войти

Показать полную графическую версию : [решено] ВВести имя файла в переменную.


Димончик555
09-03-2014, 23:56
Хочу ввести имя .asm файла находящегося в одной папке с батником в переменную.

set filename=Dir /B /A:-D %~dp0*.asm
ECHO filename
ECHO %filename%
set masm_path=\masm32
if exist %filename%.rc (
%masm_path%\bin\rc /v %filename%.rc
%masm_path%\bin\cvtres /machine:ix86 %filename%.res
%masm_path%\bin\ml /Cp /Gz /I%masm_path%\include/coff %filename%.asm || pause exit
%masm_path%\bin\Link/LIBPATH:%masm_path%\lib %filename%.obj %filename%.res
pause
) else (
%masm_path%\bin\ml /Cp /Gz /I%masm_path%\include %filename%.asm || pause exit
%masm_path%\bin\Link /LIBPATH:%masm_path%\lib %filename%.obj
)
pause

http://firepic.org/?v=6.2014-03-09_von8k0lym070.jpg

Iska
10-03-2014, 00:25
Хочу ввести имя .asm файла находящегося в одной папке с батником в переменную. »
Первого из найденных «*.asm»:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
`dir /b /a:-d "%~dp0*.asm" 2^>nul`
) do if not defined sFirstAsmFile set sFirstAsmFile=%%~nxi

if defined sFirstAsmFile (
echo First *.asm file: [%sFirstAsmFile%].
) else (
echo Not found any *.asm files.
)

endlocal
exit /b 0


P.S. Выберете какой-нибудь нормальный хостинг изображений, либо научитесь корректно выбирать и вставлять правильные ссылки. На приведённом изображении трудно разобрать что-либо осмысленное.

Димончик555
10-03-2014, 00:57
Спасибо!!!

Димончик555
10-03-2014, 01:29
Можете ли обьяснить, как этот код работает? Как- бы целые фразы
setlocal enableextensions enabledelayedexpansion
do if not defined sFirstAsmFile set sFirstAsmFile=%%~nxi

Неужели это действующие части кода?

Iska
10-03-2014, 02:09
Как- бы целые фразы
setlocal enableextensions enabledelayedexpansion »
setlocal /?

do if not defined sFirstAsmFile set sFirstAsmFile=%%~nxi »
Здесь три конструкции — «for /f», «if», «set» и вложенная команда:
for /f "usebackq delims=" %%i in (
`dir /b /a:-d "%~dp0*.asm" 2^>nul`
) do if not defined sFirstAsmFile set sFirstAsmFile=%%~nxi
Помощь читается так же:
for /?
if /?
set /?

Суть такова: получив stdout команды «dir», разобрать его построчно. Для каждой строки проверяется условие — не определена ли переменная окружения «sFirstAsmFile»? На первом проходе разбора она ещё не определена, поэтому будет исполнена конструкция «set sFirstAsmFile=%%~nxi», которая присвоит переменной окружения «sFirstAsmFile» содержимое первой строки из stdout команды «dir». На втором и последующем проходах разбора условие не будет истинным, поскольку переменная окружения «sFirstAsmFile» была определена на первом проходе разбора («set sFirstAsmFile=…»), посему команда присвоения на этих проходах больше не исполнится. В результате мы получим на выходе «for /f …» содержимое первой строки из stdout команды «dir».

Для чистоты также можно на всякий случай очищать переменную окружения «sFirstAsmFile» перед циклом разбора «for /f»:
set sFirstAsmFile=

for /f "usebackq delims=" %%i in ( …
— на тот случай, если Вы, например, не пользуете «setlocal» в своих пакетных файлах, или переменная «sFirstAsmFile» может вдруг достаться «по наследству» в унаследованном пакетным файлом окружении.

А что будет, если в каталоге не окажется вовсе ни одного файла «*.asm»? В данном примере сие решается следующим образом — stderr команды «dir» перенаправляется в пустое устройство, а stdout окажется в данном случае пуст. Поэтому переменная окружения «sFirstAsmFile» попросту окажется не определена. И нам остаётся только проверить этот факт аналогичным условием «if defined sFirstAsmFile …».

Димончик555
10-03-2014, 11:08
СПАСИБО!!!!

Димончик555
10-03-2014, 19:36
Спасибо огромное!! Действительно, понятно!! :) :up




© OSzone.net 2001-2012