簡體   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