找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 38398|回复: 9

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

[复制链接]
发表于 2014-7-8 21:47:49 | 显示全部楼层 |阅读模式
本帖最后由 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
这时为何二者不同?如何用!!号显示出同样的结果?
发表于 2014-7-8 22:31:11 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2014-7-8 23:32:35 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
zhanglei1371 + 1 感谢帮助

查看全部评分

 楼主| 发表于 2014-7-8 23:39:57 | 显示全部楼层
回复 2# wankoilz


   谢谢,单引号是个不错的方法
如果事先把 a b c赋予变量s:
set "s=a b c"
这时,alert(’%s%‘),加单引号就不行了,也就是说,对于变量的情况,有没好的解决方法?
 楼主| 发表于 2014-7-8 23:42:49 | 显示全部楼层
回复 3# CrLf


    感谢大师解答。第一种应该就是先把空格替换为#,然后在js中再进行replace回来;
第二个问题解答的很到位!
发表于 2014-7-9 12:55:45 | 显示全部楼层
第一个问题 单引号可以不
  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
复制代码
发表于 2014-7-10 08:21:31 | 显示全部楼层
回复 3# CrLf
  1. 也可以这样(方法借鉴自 terse):
  2. dir|mshta javascript:alert(new%20ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).ReadAll())(close)
复制代码
我這裡執行時,提示(close)沒有對象,改為(window.close())就不報錯了。

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 感谢指正

查看全部评分

 楼主| 发表于 2014-7-10 10:31:17 | 显示全部楼层
本帖最后由 zhanglei1371 于 2014-7-10 10:42 编辑

回复 6# terse


    第一个问题,单引号不可以;
第二个可以。
此外,mshta运行后进程中会出现许多mshta.exe的进程,甚至多达十几个,该怎么高效解决,总不能测试一次就手动删除一次吧?
发表于 2014-7-10 16:05:41 | 显示全部楼层
本帖最后由 CrLf 于 2014-7-10 17:42 编辑

回复 7# yu2n


    是的,写 mshta vbscript: 习惯了,忘了 js 要加括号...已修正
    其实用 close() 就可以了,window 作为顶级对象可以省掉,大概类似于
  1. with(window){
  2.    //script
  3. }
复制代码
发表于 2014-7-10 17:23:31 | 显示全部楼层
回复 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技术 +1 收起 理由
zhanglei1371 + 1 谢谢,可以了

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 23:58 , Processed in 0.018959 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表