Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用批处理文件生成多个Mathematica脚本_Batch File - Fatal编程技术网

Batch file 使用批处理文件生成多个Mathematica脚本

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[

希望这不是一个重复的问题;我在搜索时没有太多的结果(大多数情况下不知道要搜索的术语)

我现在有一个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.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)
的所有组合构建脚本

似乎对我有用