ITPub博客

首页 > 自动化运维 > 应用服务器 > [20210510]变态的windows批处理7.txt

[20210510]变态的windows批处理7.txt

原创 应用服务器 作者:lfree 时间:2021-05-12 08:40:23 1 删除 编辑

[20210510]变态的windows批处理7.txt

--//想写一个批处理在windows下,遇到一个奇怪的问题,记录自己的分析过程.

d:\>seq  3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q;\nselect count(name) from from t where id=1;"
;lter session set optimizer_index_cost_adj = 1
select count(name) from from t where id=1;
;lter session set optimizer_index_cost_adj = 2
select count(name) from from t where id=1;
;lter session set optimizer_index_cost_adj = 3
select count(name) from from t where id=1;

--//很奇怪,分号跑到最前面,什么回事,加入多个空格,继续测试:

d:\>seq  3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q  ;\nselect count(name) from from t where id=1;"
 ;ter session set optimizer_index_cost_adj = 1
select count(name) from from t where id=1;
 ;ter session set optimizer_index_cost_adj = 2
select count(name) from from t where id=1;
 ;ter session set optimizer_index_cost_adj = 3
select count(name) from from t where id=1;

--//视乎Q后面的字符都会到前面.

d:\>seq  3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q  ;\nselect count(name) from from t where id=1;" > aa.txt

--//使用vim下打开发现问题所在:
alter session set optimizer_index_cost_adj = 1
 ;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 2
 ;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 3
 ;
select count(name) from from t where id=1;

--//可以发现后面多了一个^M,实际上就是回车字符\r.导致显示输出感觉分号跑到前面.
--//实际上问题出在seq的输出以及windows对于文本格式的处理,windows文本默认是回车换行.
--//对于windows下的seq的输出也包含回车换行与linux的seq输出有一点点不通.知道问题所在解决就很简单.加入一个tr处理就ok了.

d:\>seq  3 | tr -d '\r' |xargs -iQ echo "alter session set optimizer_index_cost_adj = Q;\nselect count(name) from from t where id=1;"
alter session set optimizer_index_cost_adj = 1;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 2;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 3;
select count(name) from from t where id=1;

--//另外一个细节要注意xargs后面调用的命令echo是外部命令,windows下的内部命令echo也很变态.看下面的例子:

d:\>echo '123' "456"
'123' "456"

d:\>D:\tools\linux\usr\local\wbin\echo  '123' "456"
'123' 456

--//注意看两者的区别,windows下命令行仅仅将双引号的作为字符串,而单引号不是.导致awk命令在windows写的很难看或者难写.
--//我个人建议widnows下还是在Cygwin64 Terminal下使用来写shell脚本.看下面的输出:

$ echo '123' "456"
123 456

--//总之,windows下会变得非常麻烦.







来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2771852/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969672