Batch file 批处理文件:传递命令块而不是script.tcl

Batch file 批处理文件:传递命令块而不是script.tcl,batch-file,tcl,Batch File,Tcl,我使用.bat文件运行.tcl脚本,如下面的简化示例所示: script.tcl set a "this is the script" puts $a script.bat echo off set tclpath="C:\tclsh.exe" set filepath="C:\script.tcl" %tclpath% %filepath% 我想知道是否可以在.bat文件中包含.tcl脚本的命令,因此我没有两个文件,而是有一个.bat文件运行tclsh.exe并将命令传递给tcl shel

我使用.bat文件运行.tcl脚本,如下面的简化示例所示:

script.tcl

set a "this is the script"
puts $a
script.bat

echo off
set tclpath="C:\tclsh.exe"
set filepath="C:\script.tcl"
%tclpath% %filepath%
我想知道是否可以在.bat文件中包含.tcl脚本的命令,因此我没有两个文件,而是有一个.bat文件运行tclsh.exe并将命令传递给tcl shell

这可能吗?我该怎么做呢

我想知道是否可以在.bat文件中包含.tcl脚本的命令,因此我没有两个文件,而是只有一个.bat文件 它运行tclsh.exe并将命令传递给tcl shell。

简单的豌豆。 您可以在批处理脚本中使用一个子例程,该子例程将命令附加到动态创建的脚本文件中,该脚本文件由
set filepath
变量指定

这样,批处理脚本中就有了所有内容,除了确保创建它的
:tclshScript
例程具有正确的语法等之外,您不需要担心tcl脚本文件

本质上,您可以使用批处理命令构建tcl脚本逻辑,它将在每次运行时创建它

使用带有特殊字符的警告,但如果批处理以其他方式解释某些字符,或者您注意到问题,则tcl脚本中的某些字符可能需要使用克拉
^
符号


进一步资源

对于许多事情,Tcler的Wiki上有一些页面可以查找有趣的事情。特别是,它有一些非常有用的技术。当你通读的时候,你会看到一段被尝试过的技术的历史。它们取决于这样一个事实,即Tcl命令通常可以加上前缀
(在批处理文件语言中将它们标记为一个奇怪的标签),并且您可以使用
注释掉Tcl中的代码块(如果0
(Tcl不解析内容,除了确保它是大括号平衡的,而代码通常是大括号平衡的)

最好的技术不仅使代码具有多语言性,而且使其易于阅读。保持可读性是避免发疯的关键

::if 0 {
@rem This code in here is pure batch script

echo off
set tclpath="C:\tclsh.exe"
%tclpath% "%~f0" %*

@rem Put this at the end; it means terminate since the “eof” label is end-of-file
@goto eof
}

# This code is the pure Tcl code

set a "this is the script"
puts $a
需要注意的其他位:

  • “%~f0”
    -获取“第零个参数”的完整路径,该参数是您正在运行的脚本的名称
  • %*
    -这是所有剩余的参数。传递它们是个好主意,您可以使用global
    argv
    变量中的列表从Tcl访问它们

我想你必须阅读
tclsh
手册。这与批处理无关,因为我在tcl中编写代码,我已将.tcl扩展名设置为由Notepad++或任何其他类似的文本编辑器打开。作为个人快捷方式,我还使用它来定义与tclsh.exe关联的扩展名.tclmine,这样我只需双击它,它就会执行我想要的代码。但是这种方法缺乏到其他机器的可移植性,而任何微软Windows PC都支持.bat文件。这就是为什么我问是否可以将命令从.bat文件传递到tcl shell。您可能可以。我们在Dostips上有一个正在运行的线程,它展示了如何在一个脚本文件中使用批处理文件运行不同的脚本语言。
tclsh
似乎也接受来自其标准输入的命令(根据)。所以
命令|tclsh
形式的东西应该可以工作。您只需使
命令
将正确的tcl命令写入其标准输出即可
command
可以是一个简单的批处理脚本,甚至可以是对
echo
s那些tcl命令的函数的调用。但由于我不习惯tcl,我不知道它是否会起作用(这也是我没有把它作为答案的原因)。我会让tcl专家来处理this@J.Baoby,这是我们需要的批处理专家。如果这是unix shell,我会推荐一个here文档,但我不知道如何在DOS批处理中这样做。正如注释所示,
goto-eof
在开始时不起作用,所以我将其更改为
exit/b
,然后我意识到我只需要编写
goto:eof
,我认为它必须是
@goto:eof
(带冒号)正常工作。
::if 0 {
@rem This code in here is pure batch script

echo off
set tclpath="C:\tclsh.exe"
%tclpath% "%~f0" %*

@rem Put this at the end; it means terminate since the “eof” label is end-of-file
@goto eof
}

# This code is the pure Tcl code

set a "this is the script"
puts $a