2014 dxdy logo

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

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




 
 Вопрос по MS-DOS
Сообщение16.11.2007, 00:43 
Пусть у меня есть файл 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 
Аватара пользователя
: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 
luitzen писал(а):
Прав ли я, что экспансии можно подвергнуть только параметры, а переменные — никак нельзя?
Это - давно забытая магия, предания глубокой старины.

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

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

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

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

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

 
 
 
 
Сообщение16.11.2007, 03:07 
Аватара пользователя
:evil:
Тогда уж следует добавить
Код:
@echo off
для подавления вывода во всём файле.

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

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

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

 
 
 
 
Сообщение17.11.2007, 03:03 
Наверное, я что-то неправильно спросил, раз господа так разгневались :(

Стояла задача получить некий аналог для следующего:
Код:
#!/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 
Аватара пользователя
:evil:
luitzen писал(а):
Наверное, я что-то неправильно спросил, раз господа так разгневались

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

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

 
 
 
 
Сообщение17.11.2007, 15:25 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group