懂NetTerm(门店管理系统)的来下,高分悬赏
答案:1 悬赏:0 手机版
解决时间 2021-05-02 17:15
- 提问者网友:人傍凄凉立暮秋
- 2021-05-01 17:08
我在一家超市做EDP,每天晚上日结后最麻烦的工作就是从NetTerm里复制数据,太浪费了我的下班时间了,谁知道有什么更好的方法从netterm里复制数据吗?比如 全选 快捷键之类的。说的更清楚点,打个比方,有一个子分类是:清洁用品,可想而知,有多少个商品的销售记录啊,我得把这些销售记录全部复制到EXCEL中去。
求更好的方法,或者关于netterm的一切实用方法
最佳答案
- 五星知识达人网友:荒野風
- 2021-05-01 17:21
相信很多人的工作环境是兼用windows和unix的,典型的情境是在win2k下用一个终端软件来
登录一台Unix主机,或是本地虚拟机里跑的unix。这种环境下,把windows剪贴板里的内容
复制到终端里不成问题,但反过来就麻烦了: 如何把终端里的内容复制到windows剪贴板里?
当然,典型的终端支持鼠标在上面选取,复制。但这是作为一个windows应用程序的终端程序
与windows OS之间的接口,而且这样的用法还有诸多限制:(1)终端的缓冲区大小限制(2)复制
时需要滚动,而Netterm还不支持鼠标滚轮滚动。这样就显得更不方便了。
有华人居住的地方就有金庸小说,有unix的地方就有vi. 有vi的地方你用ls -l一看, 原来是
一个链接指向了vim.
如何在vim 操作窗口中随心所欲地把文本内容复制到剪贴板里呢?
先看看vim 所提供的对文本的操作功能:
(1)指定两个行之间的内容, 可以写入/追加到一个文件。写入/追加到26个内部寄存器中(这
26个内部寄存器是以字母a-z 命名的, 大写表示追加。另外vim中的特殊寄存器*"/%: 等与本文
讨论无关,不说
例子:
将10-100行的内容强制写入文件tmp.txt, 如果该文件存在则覆盖之:
[Copy to clipboard] [ - ]CODE: :10,100w! tmp.txt
将所有包含BEGIN的行到包含END的行之间的内容追加到寄存器 v 中:
[Copy to clipboard] [ - ]CODE: :g/BEGIN/;/END/y V
(2)任何一个区块之间的内容,可以写入/追加到一个文件/寄存器。这个区块可以是起始或结束
于一行的任意位置,也可以是一个矩形块(ultraEdit或word里也可以进行的那种列选择)
被操作的文本对象可以以一种可视模式进行选择,调整好文本对象的范围后,再进行操作
如何将一行文本复制到剪贴板中,先看看基本的,终端下的操作
方法一:
SecureNetterm(5.4.3.1) 提供了一个Special escape sequence:
[Copy to clipboard] [ - ]CODE: ^[[]TEXT^[[11*
它可以把TEXT处的内容复制到windows剪贴板中。其中^[是一个字符:ESCAPE字符,ASCII为27。
可以这样试一下:
[Copy to clipboard] [ - ]CODE: echo -ne "\e[]hello, world\e[11*"
这在终端上不会显示任何东西, 但是hello, world这个字串已经跑到剪贴板里去了
它的缺点是
o TEXT的最大长度为2048
o 不能复制多行文本
cat tmp.txt
[Copy to clipboard] [ - ]CODE: 1
2
3
比如echo -ne "\e[]"; cat tmp.txt; echo -ne "\e[11*"
剪贴板里的内容是123,而不是3行
方法二:
Netterm的安装目录里有几个C源文件:neted.c netedit.c netsend.c
这些文件都不大,在unix上编译后你可以用它来操作一个unix主机上
的文件,而所用的编辑器是windows上的notepad. 它们是怎么实现的呢。其基本
原理是: 用zmodem或其它协议将unix主机上的文件传至windows主机,然后发送
一个Special Escape Sequence给终端,你的windows终端软件会截获这个特殊序列。
根据这个特殊序列执行相应的操作,如neted.c中发送 "\033[6i" 表示让终端启动
一个本地的编辑器来打开指定文件。这个具体的编辑器可以在Netterm软件中配置。
编辑完毕退出时,再用同样的协议把文件从windows主机上下载下来更新。
注意:
这些终端软件的Special Escape Sequence, 并不是shell或tty或任何你想到的Unix
下标准的或很通用的一部分。同样的Special Escape Sequence, 你在一个unix的本
地登录终端中使用就不是这个作用。这些Sequence的选择必需是用户几乎不可能用到
的键的序列。这是终端软件Netterm自己的附加值部分。
这些键序列中比较有用的一个是 ^[[]command^[[1* , 它可以运行一个由command指定
的,windows主机中%PATH%环境变量所能访问到的一个命令。有了这个,我们就可以从
上面的机制中取出有用的部分:文件传输。如用sz -b filename命令把文件传至windows
主机下。然后执行一个命令来把这个文件的内容放到剪贴板中。这样的小工具很多。
windows的resource kit中也提供了一个, 叫clip.exe,可以读取标准输入的内容,然后
复制到windows剪贴板中。如clip.exe < filename.txt. 我所试用的是下载自
[Copy to clipboard] [ - ]CODE: http://www.dmst.aueb.gr/dds/sw/outwit/
的winclip, 它的功能几乎跟clip.exe 一样。 用法是 winclip -c filename.txt
下面的一个shell脚本把文件 ~/tmp.txt 复制到剪贴中:
[Copy to clipboard] [ - ]CODE: #!/bin/sh
sz -y ~/tmp.txt #将文件~/tmp.txt 传至windows主机,默认路径是C:\. 可以在终端软件中配置
#参数-y 会覆盖已经存在的文件
echo -ne "\e[]doit.bat tmp.txt\e[1*"
其中doit.bat是一个windows下的批处理文件:
[Copy to clipboard] [ - ]CODE: @rem 如果文件不存在,直接退出
if ! exist C:\%1% goto exit
@winclip.exe -c C:\%1%
@del C:\%1%
:exit
命令前面加的@可以禁止命令本身被echo 出来
恼人的一点是sz 运行的时候会弹出一个窗口表示进度。另外用上面的特殊键序来运行一个
windows主机的命令时,会有一个一闪而过的cmd窗口。后面我们有对策。
绕过sz的一个绝好的东西是samba. 我这里不再说samba的详细配置了,总之你共享出一个
C:\下的目录,然后在unix中主机中建一个目录,把它mount上,这样你可以直接用cp 命令
来把文件传至windows主机。而且不着痕迹。不象sz那么讨厌。
友情提示:
普通用户不能执行smbmount,chmod u+s /usr/bin/smbmount之后也不行,这是因为smbmount
实际上是一个wrapper, 真正干活的是/usr/bin/smbmnt. chmod u+s /usr/bin/smbmnt之后
普通用户就可以mount了
最后的步骤是配置我们的vi(你可以配置你的emacs做同样的事)
.vimrc
[Copy to clipboard] [ - ]CODE: nnoremap g<C-I>; :silent redir! >; ~/.secureNetterm/clipboard.txt<Bar>;silent echo @v<Bar>;silent redir END<Bar>;silent !echo -ne "\e[]winclip.exe -c C:\\SecureNetterm\\clipboard.txt\e[1*"<CR>;<C-L>;
这一行定义了vim中的一个映射,看着头痛没关系,我来授之以渔
nnoremap :定义一个normal模式下的map, 其中nore 意思是不要递归的这么map下去。
g<C-I>; 按下字母g后按Control-I
:silent 可以让后面的命令不输出到终端上
redir! >; ~/.secureNetterm/clipboard.txt 指定重定向到这个文件里。 其中这个目录
.secureNetterm 就是mount后的windows上的目录。!会覆盖原来存在的文件
<Bar>; 一个用在VIM里键映射定义语句中的特殊键的描述符,表示多个命令一个接一个地
执行
echo @v 这是保存要复制的东西的寄存器, silent echo @v的效果既是不显示,但又能重定向
到文件中去。
redir END 是结束重定向
!echo -ne "\e[]winclip.exe -c C:\\SecureNetterm\\clipboard.txt\e[1*" 既是前面分析过的调用windows主机上命令的特殊代码序列
咕咚咕咚.....
刚才说的有个问题是执行的时候会有一个一闪而过的DOS窗口。 这可以用一个包裹程序把它
给遮掩起来:
==============
[Copy to clipboard] [ - ]CODE: #include <windows.h>;
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
ShellExecute(NULL, "open", "C:\\dos\\winclip.exe",
"-c C:\\secureNetterm\\clipboard.txt",
"", SW_HIDE);
return 0;
}
==============
关键之处就是那个 SW_HIDE.
假如这个程序名为blindClip.exe. 前面的Special escape sequence就可以改为
!echo -ne "\e[]blindClip.exe\e[1*"
遗憾在哪?
存出来的文件是unix格式的, 当然可以用unix2dos或vim自己的方法来把它转成dos格式的
但各种解决方法都不能令我满意。不过对我来说,我在windows下的文本编辑器也是VIM,它
里面COPY/PASTE各种不同平台的文本格式都没有问题。 你要是在记事本里PASTE就不行了。
在word或wordpad里面没问题。
最后再总结一下步骤:
(1)你需要有一个支持上述功能的终端
(2)需要向.vimrc中加入上面的map
(3)windows需要共享出来一个文件夹
(4)linux需要配置好samba并把windows共享出来的文件夹mount上
(5)需要下载一个winclip.exe 来把文件的内容COPY到剪贴板里
(6)如果你忍受不了那个一闪一闪的窗口,把我上面的几行代码编成一个程序。里面的文件名
路径名什么的大家就请心领神会了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯