Board logo

标题: [出题] 让批处理自行判断是否被双击运行 [打印本页]

作者: pusofalse     时间: 2008-11-12 18:35    标题: [出题] 让批处理自行判断是否被双击运行

出题目的:了解批处理运行机制。

加分规则:
        思路新颖8分
        无临时文件3分
        代码简洁3分
        完美代码15分

题目内容:
让批处理自行判断是否被双击运行还是在CMD中手动输入运行。
如同tasklist.exe、net.exe、ping.exe,当我们双击这些文件时,会一闪而过,看不到这些命令的帮助信息。只有在CMD中手动输入之后才能看到。现在的题目是编写一个批处理文件,当我们双击运行时(不带任何参数),显示“双击运行”并暂停,如果是在CMD中手动输入运行(同样不带任何参数),显示“CMD中手动输入运行”之后不暂停,直接返回到命令提示符。
作者: lxmxn     时间: 2008-11-12 19:49

@echo off
wmic process where "name='cmd.exe'" get commandline | findstr /ric:"^cmd /c.*%~n0" >nul&& echo/双击运行 || echo/命令行运行
pause
这样可以吗?
作者: pusofalse     时间: 2008-11-12 20:13
赞佩!
作者: BC     时间: 2008-11-12 20:29
lxmxn够牛的
作者: slore     时间: 2008-11-12 22:39    标题: 多cmd会……

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>"C:\Documents and Settings\Administrator
\桌面\123.bat"
双击运行
CommandLine
"C:\WINDOWS\system32\cmd.exe"
cmd /c ""C:\Documents and Settings\Administrator\桌面\123.bat" "
cmd /c ""C:\Documents and Settings\Administrator\桌面\123.bat" "
"C:\WINDOWS\system32\cmd.exe"

请按任意键继续. . .
作者: lxmxn     时间: 2008-11-13 11:00    标题: re slore:

呵呵,特殊情况自然就没考虑那么多啦。
作者: tireless     时间: 2008-12-6 01:01

@echo off
if "%~1"=="" (
  if "%~0"=="%~nx0" (
    echo CMD中手动输入运行
  ) else (
    echo 双击运行 & pause
  )
)
利用:双击会显示批处理自身的完整路径,而在命令提示符窗口中只显示文件名。
(当然,如果在命令提示符窗口中输入完整路径就会误判了)
作者: 523066680     时间: 2009-10-10 19:46
会变成经典的!虽然我不是刚来,不过还是灌水顶一下。
作者: netbenton     时间: 2009-10-10 21:56
除非命令行输入时带上双引号,并且还注意有时大写,有时小写,
否则应该不会误判了吧!
@echo off&setlocal enabledelayedexpansion
set a0=%0
set a1="%cd%\%~nx0"

if !a0! equ !a1! (echo 双击运行) else (echo 命令行运行)
echo !a0!
echo !a1!
pause

作者: plp626     时间: 2009-10-11 18:19
re:netbenton

兄的代码还稍欠考虑,系统变量cd有一个特殊情况就是根目录下最后一个字符不带"\",看来这点还是被不少人忽略啊

其实用cmdcmdline变量判断比较正统些。
作者: netbenton     时间: 2009-10-11 19:42
再加一点呢?
@echo off&setlocal enabledelayedexpansion

set a0=%0
set a1="%cd%\%~nx0"
set a1=!a1:\\=\!

if !a0! equ !a1! (echo 双击运行) else (echo 命令行运行)
echo !a0!
echo !a1!
pause

作者: plp626     时间: 2009-10-12 17:26
这个代码的健壮性大家测试后我再下结论
@if "%cmdcmdline:~0,9%"=="cmd /c """ (echo 双击) else (echo 非双击)
@pause

作者: 523066680     时间: 2009-10-12 17:42
cmd下调用……

  Quote:
C:\Documents and Settings\liubo\桌面>call a.bat
此时不应有 /c。

C:\Documents and Settings\liubo\桌面>@if ""C:\WINDO"=="cmd /c " (echo 双击) els
(echo 非双击)

C:\Documents and Settings\liubo\桌面>

(温馨提示,liubo不是我的名字,我不叫刘波…… 别恶搞我哈)

[ Last edited by 523066680 on 2009-10-12 at 17:49 ]
作者: plp626     时间: 2009-10-12 18:17
健壮性待大家测试
@echo off
echo %cmdcmdline%|findstr/bc:"cmd /c """>nul&&echo 双击||echo 非双击
pause

作者: plp626     时间: 2009-10-12 18:35


  Quote:
Originally posted by pusofalse at 2008-11-12 06:35 PM:
出题目的:了解批处理运行机制。

加分规则:
        思路新颖8分
        无临时文件3分
        代码简洁3分
        完美代码15分

题目内容:
让批处理自行判断是否被 ...

不知道是不是这个意思

http://bbs.bathome.cn/viewthread.php?tid=4725
作者: netbenton     时间: 2009-10-12 19:10
还是不能完美,12楼的被破解了:

cmd /c ""D:\myfiles\Desktop\bat\test3.bat" "
作者: plp626     时间: 2009-10-12 19:16


  Quote:
Originally posted by netbenton at 2009-10-12 07:10 PM:
还是不能完美,12楼的被破解了:

cmd /c ""D:\myfiles\Desktop\bat\test3.bat" "

14楼的有更新,你测试下
作者: netbenton     时间: 2009-10-12 19:38
14楼的也破解了
你按16楼方法,在命令行输入试试看,

结果:
“双击”
作者: plp626     时间: 2009-10-12 20:23


  Quote:
Originally posted by netbenton at 2009-10-12 07:38 PM:
14楼的也破解了
你按16楼方法,在命令行输入试试看,

结果:
“双击”

我服了,你专门找bug
可话说回来,谁会这样输入,cmd/c 不说,还要在文件明前带""
作者: szweiw     时间: 2009-10-14 14:57


  Quote:
Originally posted by plp626 at 2009-10-12 20:23:


我服了,你专门找bug
可话说回来,谁会这样输入,cmd/c 不说,还要在文件明前带""

不是和你抬杠哈,但有个实例就是:
我在启动项里面加了个A.vbs脚本,作用就只是隐藏窗口调用B.bat,因为B.bat在programfiles目录下,目录名带空格,所以调用的时候我习惯加上双引号。

刚看到这个帖子的时候我就在想,可不可以借鉴来加强B.bat的安全性,即只能通过A.vbs来调用B.bat,甚至直接在CMD下面也不能执行。
作者: RuiIsRui     时间: 2009-10-23 22:26
I 服了 you 2楼的。