Board logo

标题: [其他] 【已解决】Bat和JS混编传值过程中符号丢失 [打印本页]

作者: 回家路上    时间: 2015-10-24 00:10     标题: 【已解决】Bat和JS混编传值过程中符号丢失

本帖最后由 回家路上 于 2015-10-24 22:36 编辑
  1. @set @n=0;/* & echo off
  2. set test=aaaa,bbbb,cccc
  3. set ceshi=aaaa,bbbb,cccc
  4. :: 这么直接调是正常的。
  5. (echo;%test%&echo;%ceshi%)|cscript -nologo -e:jscript "%~0"
  6. :: 在for循环里这么写,为什么逗号没了,中间成空格了。
  7. for /f "delims=" %%i in ('(echo;%test%^&echo;%ceshi%^)^|cscript -nologo -e:jscript "%~0"') do echo;%%i
  8. pause & exit/b & rem */
  9. var test = WScript.StdIn.ReadLine();
  10. var ceshi = WScript.StdIn.ReadLine();
  11. WSH.Echo(test);
  12. WSH.Echo(ceshi);
复制代码

作者: terse    时间: 2015-10-24 00:39

代码前 是你变义一下
要不 开启启延缓环境变量 试试
作者: CrLf    时间: 2015-10-24 00:40

本帖最后由 CrLf 于 2015-10-24 02:57 编辑

  1. for /f %%a in (' xxxx ^| oooo ') do ooxxooxxooxx
复制代码
实际执行的时候相当于:
  1. cmd /c xxxx ^| oooo >NamePipe 2>con
  2. for /f %%a in (NamePipe) do ooxxooxxooxx
复制代码
而假如 xxxx 或 oooo 中包含内部命令或命令连接语法 () & && | || 时也会有所不同
  1. echo xxxx | findstr oooo
  2. systeminfo | pause
复制代码
相当于
  1. cmd /c echo xxxx | findstr oooo
  2. systeminfo | cmd /c pause
复制代码

-----------------------------------------------------------------------
哦噗...仔细看了想楼主的代码发现我答非所问了
其实解释起来很简单,逗号是 for 命令的分隔符(包括 {空格} {Tab} = , ;),预处理的时候被转换为空格了
参考下这个帖子也是不错的
http://www.bathome.net/viewthread.php?tid=2393
解决办法:转义
作者: CrLf    时间: 2015-10-24 02:56

除了转义外,单就楼主的代码而言个人建议直接读取变量:
  1. var WshShell = new ActiveXObject('Wscript.Shell')
  2. var path = WshShell.Environment("process")("path")
  3. WSH.Echo(path)
复制代码

作者: 回家路上    时间: 2015-10-24 22:19

回复 2# terse
回复 4# CrLf


高手的代码果然“晦涩”。

解决方法:
1)变量延迟
pcl也是立马就想到了变量延迟,很神奇,延迟一下就好了。
  1. setlocal enabledelayedexpansion
  2. ... ...
  3. for /f "delims=" %%i in ('(echo;!test!^&echo;!ceshi!^)^|cscript -nologo -e:jscript "%~0"') do echo;%%i
复制代码
2)反正就是不让其“转义”
  1. for /f "delims=" %%i in ('(echo;"%test%"^&echo;"%ceshi%"^)^|cscript -nologo -e:jscript "%~0"') do echo;%%i
复制代码
3)改变传值/取数方式
①Crlf这直接从环境变量里取
②pcl建议,传值
  1. for /f "delims=" %%i in ('cscript -nologo -e:jscript "%~0" "%test%" "%ceshi%"') do echo;%%i
复制代码
取值用
  1. var test = WScript.Arguments(0);
  2. var ceshi = WScript.Arguments(1);
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2