[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【已解决】调用mshta的输出带空格的字符串出错的问题

本帖最后由 pcl_test 于 2017-6-19 13:39 编辑

问题如下:
第一个:
  1. set s="hello world ABC"
  2. mshta "javascript:alert(%s%)"
复制代码
当变量s有空格时,就会出问题,当然可以用\x20来表示【感谢CRLF大师的提示】,但是如果s中有很多空格,如何在mshta中直接加个东西来避免空格的影响?
第二个,表示回车的方法:
我对下面的方法有些不理解,因为在启用变量延迟的情况下,只要不在循环内,%%和!!的结果基本相同,但是下面这个:
  1. set "hc=&echo."
  2. echo abc%hc%def
  3. echo abc!hc!def
复制代码
第一种情况能显示两行:abc,def
但是第二种!!方法的结果只有一行:abc&echo.def
这时为何二者不同?如何用!!号显示出同样的结果?

本帖最后由 pcl_test 于 2017-6-19 13:36 编辑

试试下面的方法:
1.
  1. mshta "javascript:alert('a b c')"
复制代码
2.将换行符保存到变量:
  1. @echo off&setlocal enabledelayedexpansion
  2. set Lf=^
  3. echo !Lf!end
  4. pause
复制代码

TOP

本帖最后由 CrLf 于 2014-7-10 17:41 编辑

1、
可以这样:
  1. mshta javascript:alert('a#b#c'.replace(/#/g,'%%20'));close()
复制代码
也可以这样(方法借鉴自 terse):
  1. dir|mshta javascript:alert(new%20ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).ReadAll());close()
复制代码
2、
变量延迟与普通变量的区别就在于是否影响语法解释
  1. echo abc%hc%def
复制代码
是先把 %hc% 解释为 &echo.,再理解成两个 echo 命令,而
  1. echo abc!hc!def
复制代码
是先理解为一个 echo 命令,再将 !hc! 解释为 &echo.
1

评分人数

TOP

回复 2# wankoilz


   谢谢,单引号是个不错的方法
如果事先把 a b c赋予变量s:
set "s=a b c"
这时,alert(’%s%‘),加单引号就不行了,也就是说,对于变量的情况,有没好的解决方法?

TOP

回复 3# CrLf


    感谢大师解答。第一种应该就是先把空格替换为#,然后在js中再进行replace回来;
第二个问题解答的很到位!

TOP

第一个问题 单引号可以不
  1. @echo off
  2. set "s=hello world ABC"
  3. mshta "javascript:alert('%s%');close()"
复制代码
第二个问题 换行回车
  1. @echo off&setlocal enabledelayedexpansion
  2. set "s=hello world ABC"
  3. for /f "delims=b" %%i in ('cmd /u /c echo;戍') do set s=!s: =%%i^
  4. !
  5. echo s=!s!
  6. pause
复制代码

TOP

回复 3# CrLf
  1. 也可以这样(方法借鉴自 terse):
  2. dir|mshta javascript:alert(new%20ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).ReadAll())(close)
复制代码
我這裡執行時,提示(close)沒有對象,改為(window.close())就不報錯了。
1

评分人数

    • CrLf: 感谢指正技术 + 1
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

本帖最后由 zhanglei1371 于 2014-7-10 10:42 编辑

回复 6# terse


    第一个问题,单引号不可以;
第二个可以。
此外,mshta运行后进程中会出现许多mshta.exe的进程,甚至多达十几个,该怎么高效解决,总不能测试一次就手动删除一次吧?

TOP

本帖最后由 CrLf 于 2014-7-10 17:42 编辑

回复 7# yu2n


    是的,写 mshta vbscript: 习惯了,忘了 js 要加括号...已修正
    其实用 close() 就可以了,window 作为顶级对象可以省掉,大概类似于
  1. with(window){
  2.    //script
  3. }
复制代码

TOP

回复 8# zhanglei1371
处理空格的话 单引号可以的吧  貌似引号有问题
变通一下 行不
我走了系统 win7 通过 (引号成单出现会报错)
  1. @echo off
  2. set "s=hello'  "world"  ' 'ABC"
  3. setlocal enabledelayedexpansion
  4. set "s=!s:'=\'!"
  5. mshta "javascript:alert('!s:"=\"!');close()"
复制代码
空格换行的话 直接替换
  1. mshta "javascript:alert('!s:'=\'!'.replace(/ +/g,"\r\n"));close()"
复制代码
1

评分人数

TOP

返回列表