【问题标题】:Octave 'input' function, run through batch fileOctave 'input' 函数,通过批处理文件运行
【发布时间】:2021-04-26 22:12:37
【问题描述】:

我正在使用批处理文件:

@echo off
C:\Octave\Octave-4.4.1\octave.vbs --force-gui --eval batchTest("'%~dp0'")
cmd /c

运行 Octave 脚本

function [] = batchTest(fPath)

disp(fPath);
cd(fPath);

optionNumber = input('Choose option 1 or 2:  ');

if optionNumber == 1            
    fName = input('Input file description:  ',"s");
    filename = [fName ".xlsx"];
    xls = xlsopen(filename,1);       % <-- THIS DOES NOT WORK, PRODUCES "FILE POINTER PRESERVED MESSAGE"
    xls = oct2xls({"OutputData"},xls,1,"A1");
    xlsclose(xls);
end

if optionNumber == 2            
    filename = "TestFile.xlsx";
    xls = xlsopen(filename,1);           %  <-- THIS WORKS AS EXPECTED
    xls = oct2xls({"OutputData"},xls,1,"A1");
    xlsclose(xls);
end

在批处理文件的目录中创建一个 Excel 文件。

选项编号 1 会产生“文件指针保留”警告,并且不会创建 Excel 文件。似乎我不能使用由 Octave 的“输入”函数全部或部分创建的任何字符串。使用“.xlsx”输入完整文件名并将该变量传递给“xlsopen”函数没有帮助。选项 2 工作正常,但我需要生成多个文件,因此“fName”描述符很重要。我尝试将 SETLOCAL ENABLEDELAYEDEXPANSION 添加到批处理文件中。我还尝试了使用选项 2 的解决方法,然后添加了

rename("TestFile.xlsx",[fName ".xlsx"])

到 Octave 脚本,但这会在“重命名”函数中产生“无效输入”错误,因此它也不喜欢“输入”创建的字符串。问题仅在于“xlsopen”和“重命名”函数; “输入”功能可以很好地选择选项编号。

当从 Octave 命令行直接执行“batchTest(pwd)”时,任何一个选项都有效。该问题仅在从批处理文件执行时出现。任何建议将不胜感激。

【问题讨论】:

  • “这行不通”:当然不行。您用oct2xls 对象覆盖xls 文件句柄。它不再是同一个文件句柄。我更惊讶的是第二个“作品”。如果您向我们展示您的输出而不是仅仅说“它不起作用”,那将真的很有帮助。您的 .bat 文件是否正确传递了预期的路径?作为字符串?使用正确的文件分隔符?你在传递一个unix文件路径吗?视窗?使用有效驱动器?只是文件名?生成的filename 是否指向预期的失败并带有有效的路径字符串? (第一个)xls 对象是否正常打开?
  • 如果我不得不猜测,我猜你的文件名不是你想象的那样,并且那个八度将路径中的反斜杠解释为转义序列。您不应该像那样手动输入路径,而是要使用fullfile
  • @Tasos Papastylianou,我很欣赏fullfile 的提示,虽然我只是使用路径名来更改当前工作目录,因此它不会出现在xlsopen 函数中,只有文件名。我的问题似乎在 excel 文件问题出现之前就出现了,因为当我执行 f1 = "String1"; f2 = input('Input file description: ',"s"); (::type String2::) fExt = ".xlsx"; filename = [f1 f2 fExt]; disp(filename) strncmp(filename,f1,length(f1)) 时出现:.xlsxg1String2。但是,strncmp 输出为 1,所以它只是看起来显示不正确,实际上并不是 be 那种形式。
  • @smcmi 对,这证实了我的怀疑。当您通过输入收集 f2 时,您不小心将\r 字符附加到您的输入,该字符对应于“回车”字符。您的字符串不包含您认为的内容。输入 double(f2) 以查看最后是否有一个额外的字符(大概是十进制数 13,\r 字符的 ascii 数)。如果您在连接字符串之前在字符串上使用strtrim,它应该可以工作(假设没有其他愚蠢的事情发生)。
  • @TasosPapastylianou,您在上一条评论中所做的每一点都完全正确。 strtrim 函数删除了回车,现在一切正常。我最诚挚的感谢!我可以将您的评论标记为已接受的答案吗?

标签: batch-file octave export-to-excel


【解决方案1】:

问题听起来是,当您创建字符串时,您包含了混淆文件名的转义字符。

从 cmets 中的讨论看来,您的字符串中包含回车符,导致文件名错误。

目前尚不清楚为什么只有从批处理文件运行时才会出现这种情况,但作为一种解决方法,您可以通过使用 strtrim 预处理字符串输入以删除任何不需要的空格来确保删除回车。

【讨论】:

  • 亲爱的@smcmi,由于尚不清楚为什么在批处理模式下而不是在解释器中运行时回车会进入字符串,所以我提交了一个错误报告:Bug #60453。如果您不介意,请在必要时也为该讨论做出贡献:)
猜你喜欢
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多