2014-01-28 2 views
1

Надеюсь, это не повторяющийся вопрос; Я искал без слишком большого количества результатов (в основном, не зная терминов для поиска).Создание сценариев Mathematica с использованием пакетных файлов

В настоящее время у меня есть скрипт mathematica, который открывает файл данных и запускает на нем ряд команд. В сценарии, я должен изменить определенные значения для каждого файла данных, например, analysis_20_70.m может прочитать:

(* ::Package:: *) 

Clear[NN, TxyzAll, q, Txyz, twospace, dps, threespace, threeclosed, plane] 
datChoice = ReadList[ 
    "/n/homeserver2/user2a/scallion/mathematica/20_70.dat", {Number, Number, Number}]; 
NN = 51; 
% LOTS OF CODE HERE 
Export[ 
    "/n/homeserver2/user2a/scallion/mathematica/20_70_time.txt", 
    time]; 
Exit[] 

Таким образом, редактирования для каждого файла я хочу работать неэффективно. Я новичок в написании сценариев в целом, но подумал, что я могу использовать пакетный скриптинг для автоматизации этого процесса (т.е. сценарий 1 читает 20_70.dat, NN = 51, сценарий 2 читает 20_75.dat, NN = 56, сценарий 3 читает 20_80. Дат, NN = 61 и т.д.)

до сих пор, я сколотил что-то вроде этого:

@echo off 
set "begin=20" 
set "end=150" 
set "count=70" 

:LOOP 
if %count% GTR %end% (goto END) 

(
echo (* ::Package:: *) 
echo Clear[NN, TxyzAll, q, Txyz, twospace, dps, threespace, threeclosed, plane] 
echo datChoice = ReadList[ 
echo  "/n/homeserver2/user2a/scallion/mathematica/20_70.dat", {Number, Number, Number}]; 
echo NN = 51; 
echo Exit[] 
) > testfile_%begin%.txt 

set /a count+=5 
goto LOOP 
:END 

(в идеале 20_70.dat бы стать чем-то вроде% начинают% _% Количество% .dat).

Если я заменю середину чем-то простым, например, echo hello world> testfile_% begin% .txt, у меня нет проблем. Тем не менее, попытка распечатать весь скрипт mathematica кажется беспорядочной, и я не знаю, будут ли проблемы с новой строкой/скрытые символы в полученном файле. Таким образом, мои вопросы:

1). есть ли лучший способ напечатать несколько строк, чем поставить эхо перед каждой строкой? и если да, сохранит ли я возможность изменять имена файлов с помощью счетчиков?

2). мой код, естественно, имеет() []; = и другие зарезервированные символы повсюду, поэтому мне показалось, что я должен либо поместить каждую строку в цитаты (в этом случае я не могу удалить кавычки), либо вручную избежать каждого единственного нарушения. Я могу пройти и сделать это, но хотел бы знать, есть ли лучший способ.

3). возможно, что пакетные файлы не подходят. Если есть другие способы решения этой проблемы, я пытаюсь что-то предпринять.

Спасибо всем за помощь!

ответ

0

1) Команда echo печатает текст из содержимого сценария в файл (включая, конечно, stdout). Я также рекомендую использовать type, который может копировать текст из другого файла, и в этом случае вам не нужно заботиться о специальных символах. Так что я бы написать что-то вроде этого:

type static_begin.txt > output.txt 
echo A %dynamic% part >> output.txt 
type static_end.txt >> output.txt 

Он просто копирует статические (неизменности) начала и окончания и позволяет поставить что-то изменяющееся между ними. Оператор >> означает присоединение к концу файла.

2) Вы можете escape специальных символов пакетных файлов с использованием ^, например ^(.

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=c:\sourcedir" 
SET "destdir=c:\destdir" 
SET "skeleton=%~1" 
SET /a count=0 
FOR /f "usebackqdelims=" %%S IN ("%~2") DO (
CALL :genscript %%S 
) 

GOTO :EOF 
:genscript 
:: remove variables starting $ 
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 
SET /a paramcount=1 
:paramloop 
SET "$%paramcount%=%1" 
IF DEFINED $%paramcount% SET /a paramcount+=1&shift&GOTO paramloop 
SET /a paramcount -=1 

:: Now have $1=1st param, $2=second, etc. 

:: Simple substitution : only 2 parameters (dat and NN) 
IF DEFINED $3 GOTO loopy 

CALL :genfile %$1% %$2% 
GOTO :eof 

:: We have more than two parameters in the data line. 
:: Let's define params as %1=start, %2=incr, %3=end for first item 
:: %4=start, %5=incr, %6=end for second item 
:: %7=start, %8=incr, %9=end for third item 
:: how it's done - up to the user 
:loopy 

FOR /L %%a IN (%$1% %$2% %$3%) DO (
FOR /L %%b IN (%$4% %$5% %$6%) DO (
    FOR /L %%c IN (%$7% %$8% %$9%) DO (
    CALL :genfile %%a_%%b %%c 
) 
) 
) 

GOTO :eof 

:genfile 
SET "$batchline1= "/n/homeserver2/user2a/scallion/mathematica/%1.dat", {Number, Number, Number}];" 
SET "$batchline2=NN = %2;" 
SET "$batchline3= "/n/homeserver2/user2a/scallion/mathematica/%1_time.txt"," 
SET /a count+=1 
SET outscript=script%count%.m 
(
FOR /f "tokens=1*delims=:" %%L IN ('FINDSTR /n /r "$" "%skeleton%"') DO (
    SET "line=%%M" 
    CALL :subs 
    IF DEFINED line ECHO(%%M 
) 
)>"%destdir%\%outscript%" 
GOTO :eof 

:: Do the substitution 
:subs 
:: if LINE is not defined, empty line 
IF NOT DEFINED line SET line=Y&GOTO :EOF 
SET "line=%line:"=%" 
SET "line=%line:&=%" 
SET "line=%line:)=%" 
SET "line=%line:(=%" 
FOR /f "tokens=1*delims==" %%s IN ('set $batch') DO IF "%%s"=="$%line%" (
SET "line=" 
ECHO(%%t 
GOTO :eof 
) 
GOTO :eof 

Я считаю, что это сработает.

Выполнить это как thisbatch skeleton.txt controlfile.txt

Где скелет.TXT является

(* ::Package:: *) 

Clear[NN, TxyzAll, q, Txyz, twospace, dps, threespace, threeclosed, plane] 
datChoice = ReadList[ 
batchline1 
batchline2 
% LOTS OF CODE HERE 
Export[ 
batchline3 
    time]; 
Exit[] 

То есть, ваш оригинальный .m файл с переменной строкой заменена batchline1..3 и этими линиями построены и замещен сценарием.

controlfile.txt является

20_70 51 
20 1 22 70 2 74 51 5 66 

, который будет строить сценарий из скелета, подставляя 20_70 и 51 стратегически, то только потому, что это возможно (не зная ситуацию в любом случае) так же строить сценарии для всех комбинации (20 to 22 step 1)_(70 to 74 step 2) и (51 to 66 step 5)

Показалось работать для меня ...

Смежные вопросы