繁体   English   中英

使用批处理中的一个参数运行 Octave 函数

[英]Run Octave function with one argument from batch

我正在尝试从批处理文件运行八度函数。 考虑到从 Octave GUI 中启动时的工作方式,该函数写得很好。 除了指向八度函数之外,批处理文件定义了它所需的唯一参数。 不久前,这不是一个函数,而是一个简单的 Octave 脚本,使用的命令还可以。 我现在遇到的唯一问题是能够将批处理文件计算的变量传递给八度函数。

我最近写了一个八度函数来做一些文件管理。 它只需要来自用户的一个输入:

function replace_TMM (file_base)

其中 file_base 是一个字符串,用于指定我正在处理的目录。 所以它必须是类似“Z:”或“I:”之类的东西。 我很确定这个函数写得很好,因为我可以毫无问题地从 Octave GUI 使用它。 事实上,我想从批处理文件中运行这个函数。 在这个批处理文件中,我写道:

SET a=%cd:~0,2%

此命令能够识别工作目录,因此“a”将等于“Z:”或类似的。 现在我的问题是告诉批处理文件使用“a”作为输入参数来计算八度函数。 我试过类似的东西:

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" -q --eval _03_REPLACE_V04("'%cd:~0,2%'")

这似乎不起作用。 这种解决方案在批处理级别给出语法错误,甚至无法输入八度文件。

如果我改为尝试类似的方法:

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" -q _03_REPLACE_V04.m Z:

它能够输入八度文件,但它不处理函数,只是跳过它到达脚本的末尾。

如果我尝试以下操作,情况也是如此:

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" _03_REPLACE_V04.m -"Z:"

简而言之,我相信函数本身可以工作,这只是将变量从批处理传递到八度音程的问题。

非常感谢一些帮助,在此先感谢。

更新 1

我已经完成了@Dariush Gavari 的建议并使用了以下语法:

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" -q --eval "replace_TMM('%a%')"

这让我收到以下错误消息:

error: 'replace_TMM' undefined near line 1, column 1

我认为这是因为无法找到包含该函数的脚本。 这保存在一个名为 _03_REPLACE_V04.m 的文件中因此我尝试了

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" -q --eval _03_REPLACE_V04.m "replace_TMM('%a%')"

导致以下错误:

error: --eval "CODE" and script file are mutually exclusive options

usage: octave [-HVWdfhiqvx] [--debug] [--doc-cache-file file] [--echo-commands]
       [--eval CODE] [--exec-path path] [--experimental-terminal-widget]
       [--gui] [--help] [--image-path path] [--info-file file]
       [--info-program prog] [--interactive] [--line-editing] [--no-gui]
       [--no-history] [--no-init-file] [--no-init-path] [--no-line-editing]
       [--no-site-file] [--no-window-system] [--norc] [-p path]
       [--path path] [--persist] [--server] [--silent] [--traditional]
       [--verbose] [--version] [file]

我认为问题也可能出在函数和具有两个不同名称的文件上。 为了解决这个问题,我保留了相同的文件名,但更改了函数以匹配它:

function _03_REPLACE_V04 (file_base)

然后在批处理中:

"C:\Program Files\GNU Octave\Octave-7.3.0\mingw64\bin\octave-cli.exe" -q --eval "_03_REPLACE_V04('%a%')"

导致:

warning: function '_03_REPLACE_V04' defined within script file '\99_TOOLS\OCTAVE_FILES\_03_REPLACE_V04.m'
error: invalid call to script \99_TOOLS\OCTAVE_FILES\_03_REPLACE_V04.m
error: called from
    _03_REPLACE_V04

换句话说,仍然没有办法让它发挥作用。 :)

Octave 提供了argv函数,它返回一个 cellstring 数组,其中包含在启动时传递给 octave 可执行文件的所有参数,或者在它用于启动脚本的情况下,这就是脚本的参数。

所以大概你需要做的就是从 Octave 中获取你的目录是argv(){1}

如果您想将文件名转换为绝对文件名,您也可以通过make_absolute_filename函数在 Octave 内执行此操作。


顺便说一下,在 Octave 中你应该知道的一个非常有用的命令是lookfor命令。 在终端中编写lookfor arguments会返回一个列表,其中包含所有在其描述中包含“arguments”一词的函数; argv在该列表的顶部。

然后您可以执行help argv以查看有关该命令的更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM