2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Вопрос по MS-DOS
Сообщение16.11.2007, 00:43 
Заслуженный участник


18/03/07
1068
Пусть у меня есть файл myfile.sh следующего содержания:
Код:
#!/bin/sh
X=${PWD##/*/}
echo $X
Вроде бы понятно, что происходит: выводится краткое имя текущего каталога.

Как должен выглядеть аналогичный файл myfile.bat?
Мне не пришло в голову ничего лучше, чем
Код:
set X=%~n1
if not defined X (call myfile.bat %CD%) else (
echo %X%
)

Прав ли я, что экспансии можно подвергнуть только параметры, а переменные — никак нельзя?

 Профиль  
                  
 
 
Сообщение16.11.2007, 02:16 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
luitzen писал(а):
Прав ли я, что экспансии можно подвергнуть только параметры, а переменные — никак нельзя?

Нет.

Во-первых, есть два типа переменных: переменные окружения (environment) и переменные batch-file'а. Первые вставляются как %var%, вторые встречаются редко, и выглядят как %%v.

Дальше вспоминать уже совсем тошно. В XP есть help, например help for

Код:
set xxx=abc
set yyy=%xxx%,%xxx%
for /L %%v in (1,1,5) do echo %%v

help for

 Профиль  
                  
 
 Re: Вопрос по MS-DOS
Сообщение16.11.2007, 02:51 
Заслуженный участник


15/05/05
3445
USA
luitzen писал(а):
Прав ли я, что экспансии можно подвергнуть только параметры, а переменные — никак нельзя?
Это - давно забытая магия, предания глубокой старины.

Если под экспансией Вы имеете в виду нечто вроде
Код:
%~fv
то да, это применимо только к переменным FOR.

Полное имя текущего каталога на текущем диске можно получить командой
Код:
CD

Справку по любой команде можно получить командой
Код:
HELP [<command_name>]
Если команда не задана, то выводится список доступных команд.

Добавлено спустя 13 минут 45 секунд:

И еще, символ "@" перед именем команды подавляет эхо команды и выводит только ее результат. Например, попробуйте:
Код:
@for /L %%v in (1,1,5) do @echo %%v

 Профиль  
                  
 
 
Сообщение16.11.2007, 03:07 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Тогда уж следует добавить
Код:
@echo off
для подавления вывода во всём файле.

Я намеренно не давил вывод, чтобы было видно, что именно исполняется.

Yuri Gendelman писал(а):
Полное имя текущего каталога на текущем диске можно

luitzen, обратите особое внимание: в DOS / Windows текущий каталог определён для каждого диска отдельно. А в Windows CE понятия текущего каталога вовсе нет.

 Профиль  
                  
 
 
Сообщение17.11.2007, 03:03 
Заслуженный участник


18/03/07
1068
Наверное, я что-то неправильно спросил, раз господа так разгневались :(

Стояла задача получить некий аналог для следующего:
Код:
#!/bin/sh
X=${PWD##/*/}
rm $X.xpi
cd chrome
zip -r0 $X.jar content
cd ..
zip -r9 $X.xpi install.rdf defaults chrome/$X.jar
rm chrome/$X.jar

Получилось вот что (7z.exe должен быть где-нибудь в %PATH%):
Код:
echo off
set X=%~n1
if not defined X (call build %CD%) else (
cd chrome
7z a -tzip %X%.jar * -r -mx=0
cd ..
7z a -tzip %X%.xpi defaults install.* chrome\%X%.jar -r -mx=9
del chrome\%X%.jar
)

Имелся вариант bat-файла и без «синтаксического разбора» начального %CD%, но он был нехорош тем, что создавал что-то (%CD%.jar) за пределами каталога, в котором лежал. И вопрос, собственно, заключался в возможности «разобрать» переменную иначе, чем передачей её bat-файлом самому себе в качестве параметра. Например, используя каким-то образом возможность «разбора» переменных FOR.
Например, так (придумал, перечитав справку):
Код:
echo off
for %%X IN (%CD%) DO (
set Y=%%~nX
cd chrome
7z a -tzip %Y%.jar * -r -mx=0
cd ..
7z a -tzip %Y%.xpi defaults install.* chrome\%Y%.jar -r -mx=9
del chrome\%Y%.jar
)

В общем, действительно, «давно забытая магия, предания глубокой старины»…

Добавлено спустя 2 минуты 45 секунд:

Чтобы не затруднять понимание, упрощу «содержательную часть».
Пусть в каталоге есть «одноименный» zip-архив, который нужно удалить.Оригинальный файл myfile.sh, лежащий там, был бы такой:
Код:
#!/bin/sh
X=${PWD##/*/}
rm $X.zip

Тогда его bat-аналог myfile.bat был бы такой:
Код:
set X=%~n1
if not defined X (call myfile.bat %CD%) else ( del %X%.zip )

или такой:
Код:
for %%X in (%CD%) do (del %%~nX.zip)

 Профиль  
                  
 
 
Сообщение17.11.2007, 03:47 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
luitzen писал(а):
Наверное, я что-то неправильно спросил, раз господа так разгневались

Та не, всё нормально.

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

 Профиль  
                  
 
 
Сообщение17.11.2007, 15:25 
Заслуженный участник


15/05/05
3445
USA
luitzen писал(а):
Код:
set X=%~n1
if not defined X (call myfile.bat %CD%) else ( del %X%.zip )
или такой:
Код:
for %%X in (%CD%) do (del %%~nX.zip)

1. Синтаксис %~nV возможен только для переменных команды FOR, так что первый вариант отпадает. Чтобы использовать разбор имени файла, задачу нужно свести к применению FOR. Пример: если некий файл существует, удалить файл с тем же именем, но с расширением *.zip.
а) Создается test.bat
Код:
for %%X in (%1) do del %%~nX.zip
б) Обращение к нему
Код:
test myname.abc
Если myname.zip существует, то он будет удален. Если нет, то на консоли будет соотв. сообщение.

2. Для команды FOR в операторе IN задается не каталог, а маска поиска файлов, т.е. если Вы задаете эту команду:
Код:
@FOR /R %%v IN (*.*) DO @echo %%~nv%%~xv
то получите список имен файлов.

Общее замечание: в классическом ДОС нет аналога Юниксовским shell. Если Вы работаете не в чистом ДОС, а под Windows, то присмотритесь к VBScript. Например, Создайте файл test.vbs
Код:
MsgBox("Hello World!")
и выполните команду
Код:
start test

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group