Batch file 使用批处理文件生成多个Mathematica脚本
希望这不是一个重复的问题;我在搜索时没有太多的结果(大多数情况下不知道要搜索的术语) 我现在有一个mathematica脚本,它打开一个数据文件并在上面运行一系列命令。在脚本中,我必须编辑每个数据文件的某些值,例如,analysis_20_70.m可能会读取:Batch file 使用批处理文件生成多个Mathematica脚本,batch-file,Batch File,希望这不是一个重复的问题;我在搜索时没有太多的结果(大多数情况下不知道要搜索的术语) 我现在有一个mathematica脚本,它打开一个数据文件并在上面运行一系列命令。在脚本中,我必须编辑每个数据文件的某些值,例如,analysis_20_70.m可能会读取: (* ::Package:: *) Clear[NN, TxyzAll, q, Txyz, twospace, dps, threespace, threeclosed, plane] datChoice = ReadList[
(* ::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.dat,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
type static_begin.txt > output.txt
echo A %dynamic% part >> output.txt
type static_end.txt >> output.txt
(理想情况下,20_70.dat将类似于%begin%u%count%.dat)
如果我用一些简单的东西来替换中间部分,比如echo hello world>testfile\u%begin%.txt,我就没有问题了。然而,试图打印整个mathematica脚本似乎很混乱,我不知道结果文件中是否会有换行符问题/隐藏字符。因此,我的问题是:
1) 。有没有比在每行前面放回显更好的打印多行的方法?如果是这样,我会保留使用计数器更改文件名的功能吗
2) 。我的代码自然有()[];=和其他保留字符,所以似乎我要么把每一行都放在引号中(在这种情况下,我不能删除引号),要么手动逃避每一个违规。我可以去做,但我想知道是否有更好的方法
3) 。可能批处理文件不是解决问题的方法。如果有其他方法来解决这个问题,我愿意尝试任何方法
谢谢大家的帮助 1)该命令将脚本内容中的文本打印到文件中(当然包括stdout
)。我还建议使用,它可以从另一个文件复制文本,在这种情况下,您不必考虑特殊字符。所以我会这样写:
@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
type static_begin.txt > output.txt
echo A %dynamic% part >> output.txt
type static_end.txt >> output.txt
它只是复制静态(不变的)开始和结束,并允许在它们之间放置不同的内容。操作符>
表示追加到文件末尾
2) 您可以使用^
指定批处理文件的特殊字符,例如^(
@ECHO OFF)
SETLOCAL
设置“sourcedir=c:\sourcedir”
设置“destdir=c:\destdir”
设置“骨架=%~1”
设置/a计数=0
对于/f“usebackqdelims=“%%S IN(“%2”)DO(
呼叫:genscript%%S
)
后藤:EOF
:genscript
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
设置/a参数计数=1
:paramloop
设置“$%paramcount%=%1”
如果定义了$%paramcount%SET/a paramcount+=1&shift&GOTO paramloop
设置/a参数计数-=1
::现在有$1=第一个参数,$2=第二个参数,依此类推。
::简单替换:仅2个参数(dat和NN)
如果定义为$3,则转到循环
调用:genfile%$1%$2%
后藤:eof
::数据行中有两个以上的参数。
::让我们将参数定义为第一项的%1=开始,%2=增加,%3=结束
:%4=第二项的开始,%5=增加,%6=结束
:%7=第三项的开始,%8=增加,%9=结束
::如何完成-取决于用户
:胡闹
对于(%%$1%%$2%%$3%)中的/L%%a,请执行以下操作(
在(%%$4%%$5%%$6%)中的/L%%b(
对于/L%%c IN(%%$7%%$8%%$9%)DO(
调用:genfile%%a_uuu%%b%%c
)
)
)
后藤:eof
:genfile
设置“$batchline1=“/n/homeserver2/user2a/scallion/mathematica/%1.dat”,{Number,Number,Number}]
设置“$batchline2=NN=%2;”
设置“$batchline3=“/n/homeserver2/user2a/scallion/mathematica/%1_time.txt”
设置/a计数+=1
SET-outscript=脚本%count%.m
(
对于/f“tokens=1*delims=:”%%L IN('FINDSTR/n/r“$”“%skeleton%”)DO(
设置“行=%%M”
呼叫:潜艇
如果定义了线路回波(%%M
)
)>%destdir%\%outscript%“
后藤:eof
::做替换
:潜艇
::如果未定义行,则为空行
如果未定义行,则设置行=Y&GOTO:EOF
设置“行=%line:=%”
设置“行=%line:&=%”
设置“行=%line:)=%”
设置“行=%line:(=%)
对于/f“tokens=1*delims=”('set$batch')中的%%s如果“%%s”=”$%line%”则执行(
设置“行=”
回声(%%t
后藤:eof
)
后藤:eof
我相信这会奏效
将其作为thisbatch skeleton.txt controlfile.txt运行
其中skeleton.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\u 70
和51
,然后,仅仅因为它可能(不知道您的情况)为(20到22步骤1)\u 70到74步骤2)
和(51到66步骤5)
的所有组合构建脚本
似乎对我有用