此篇文章为《用batch批量创建快捷方式》的继续讨论,原文章地址为:http://pzy84.blogbus.com/logs/31964835.html

原文摘要:

用VBScript脚本创建快捷方式 我不知道有没有直接创建快捷方式的windows命令,有的文档提到shortcut命令,但是我看在win xp的命令行中并不存在这个命令。此外还有mklink,估计相当于linux的ln -s,不过貌似也不存在。

我找到一个用于创建快捷方式的VBScript脚本:

Source: http://www.experts-exchange.com/Programming/Languages/Scr...
 

就我目前所知,脚本相比批处理命令有两个好处:

  1. 可以控制子目录迭代层数,跳过太深的子目录会显著加快进度;
  2. 可以灵活地使用关键词排除一些文件,从而减少没有使用价值的快捷方式;
不过要多写不少代码 -_- !
// jscript code - NEVER run this script by double-clicking the saved .js file, 
// instead, call it within cmd.exe, AND with CScript.

var WshShell = WScript.CreateObject("WScript.Shell");

//-----------------------------------------------------------------------------

var exclusionKeywords = new Array("unins", "setup", "inst", "unwise",
"update", "upgrade",
"conf", "patch", "repair", "升级", "注册", "补丁",
"launch", "game", "load", "run", "start",
"help", "tray", "bugreport",
"vshost", "vmware-");


batch_shortcut("D:\\__launcher", "C:\\Program Files", 2);
batch_shortcut("D:\\__launcher", "D:\\Program Files", 2);

//-----------------------------------------------------------------------------

/*
targetFolder - where are the .exe files?
maxDepth - how deep shoud I dive into subfolder? start from 0.
*/
function batch_shortcut(shortcutFolder, targetFolder, maxDepth)
{
var fso, f, f1, fc;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.GetFolder(targetFolder);

if (maxDepth > 0)
{
fc = new Enumerator(f.SubFolders);
for (;!fc.atEnd(); fc.moveNext())
{
batch_shortcut(shortcutFolder, fc.item().Path, maxDepth - 1);
}
}

fc = new Enumerator(f.files);
for (; !fc.atEnd(); fc.moveNext())
{
var s = fc.item().Name.toLowerCase(); // lowercase file name

if (s.substr(s.length - 4, 4) == ".exe")
{
var exclude = false;
for (var i = 0; i < exclusionKeywords.length; ++i)
{
if (s.indexOf(exclusionKeywords[i]) != -1)
{
exclude = true;
break
}
}

if (exclude)
continue;

WScript.echo(fc.item().Path);
var shortcutPath = shortcutFolder + "\\" + fc.item().Name.substr(0, s.length - 4) + ".lnk";
var sc = WshShell.CreateShortcut(shortcutPath);
sc.Description = "Shortcut to " + fc.item().Path;
sc.TargetPath = fc.item().Path;
sc.Save();
}
}
}


2008-12-04

1TB的硬盘

老大近来在意淫1TB的硬盘,而我刚从40GB硬盘的机器升级到160GB的不到半年,至于移动存储,我有一个0.125GB的U盘,必要的时候我会用PSP或手机的记忆卡顶一下,它们的容量分别4G和2G,当然实际可用空间要小得多。

就这么点移动存储,以前用得很嗨的,连CNC3都带回来了,可是到了RA3就麻烦了。CNC3不到4GB,把小P里的游戏删掉刚好揣下,而RA3是——6.xGB。

所以我要搞个移动硬盘。不需要1TB,我还想不好拿什么填它。老大说,他在网速一度达到10MB/s的网吧里同时下载一个电影的四、五个版本,然后择优收藏。对于这种暴发户行径,我除了鄙视没有别的要表达的,因为我在用GPRS MODEM上网,偶尔必须要下载东西的话,10KB/s的速度如果能稳住,我都会感激涕零。

按照我的口味,一部电影400~600MB刚好,那么按平均500M算好了,1TB的硬盘能存2000部电影!2000!!不过既然是收藏,就要选画面品质很高的,按最近我在BT网站上见到的情况,一部这样的电影要1~2GB,所以1TB只存大几百部电影,仍然是个宏大的数目。硬盘当然不是只能用来存电影,然而如果不这样算的话我想象不出1TB有多大。

老大的这个意淫项目对我一点吸引力没有,第一我嫌电影的内容一般配不上那么高质量的介质,第二那么庞大的数量会让我感到压抑。

~~~~~~~

昨晚买了张《爱情左灯右开》的号称比枪版清晰些的DVD,我和安一致认为影片本身太烂,完全没有资格自称“爱情呼叫转移第2”,就这样的片子,也就值得用枪版打发一下。

今晚一个人看了个动画,《从林大反攻》,毕竟是一个人看,没有以前和小曾他们一起看时那么热闹,笑都很难笑出声音来。

然后我又翻了翻今天刚下载的两份SIM卡方面的文档,有点头大。起因是这阵子需要在程序中切换一卡多号。现在看来,以我现有的知识和资源,STK编程难了些,还是前些天采取的方法最简单可行;通过模拟屏幕事件来与STK程序交互。从完成任务的角度来说已经搞定了,剩下的就是业余钻研了,但是我估计这个会浅尝辄止,因为我实在想不出以后还能碰到什么样的任务会涉及到这块东西。

一个古老的阁楼?

http://www.bookcase.com/

年代:

Copyright © 1996-2000 Ctrl Computer Systems. All rights reserved.
Comments: webmaster@bookcase.com
Last updated: 02/22/00 

好多上个世纪的东东, MSDOS, WIN3.X, ……

这些单纯的程序:

http://www.bookcase.com/library/software/msdos.util.text.html

http://www.bookcase.com/library/software/msdos.util.batch.html

...

VBScript脚本创建快捷方式

我不知道有没有直接创建快捷方式的windows命令,有的文档提到shortcut命令,但是我看在win xp的命令行中并不存在这个命令。此外还有mklink,估计相当于linuxln -s,不过貌似也不存在。

我找到一个用于创建快捷方式的VBScript脚本:

Source: http://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Batch/Q_23794453.html


'===============================================================================

' Function Name : CreateShortcut(pShortcutPath, pTargetPath)

' Return value : True if shortcut created successfuly, False if not

' Author : Alex Simenduev, www.planetit.ws

' Date : 21/04/2008

' Description : Very basic creation of Shortcut, without extra stuff like

' Icon, Working directory, Hotkeys, Arguments...

'===============================================================================

Function CreateShortcut(pShortcutPath, pTargetPath) : CreateShortcut = False : On Error Resume Next

Dim objShell : Set objShell = WScript.CreateObject("WScript.Shell")

Dim objShortcut : Set objShortcut = objShell.CreateShortcut(pShortcutPath)

If Err.Number <> 0 Then

LogEchoLine "Error " & Err.Number & ": " & Err.Description

Err.Clear

Else

objShortcut.Description = "Shortcut to " & pTargetPath

objShortcut.TargetPath = pTargetPath

objShortcut.Save

If Err.Number = 0 Then CreateShortcut = True

End If

Set objShortcut = Nothing

Set objShell = Nothing

End Function


VBScript脚本传递参数

上面这个脚本的全部内容是一个函数,需要两个参数。我不知道可不可以在batch中直接调用VBScript中的某个函数,不过把参数传给整个脚本是可以的,形式就跟执行普通的带参数的命令一样。

那么,在VBScript中怎么访问这样的参数?——形式上比batch从命令行获取参数要复杂那么一点点,这家伙是面向对象的:var = Wscript.Arguments(index)

Source: http://www.eggheadcafe.com/forumarchives/scriptingVisualBasicscript/Jun2005/post23376183.asp


The VBScript (A.vbs) can access the parameters using the Arguments collection of the Wscript object. For example, in A.vbs:

' Make sure there are at least 2 arguments.

If (Wscript.Arguments.Count < 2) Then

Wscript.Echo "Required Parameter missing"

Wscript.Quit

End If

' Retrieve the first argument (index 0).

strName = Wscript.Arguments(0)

' Retrieve the second argument.

strServer = Wscript.Arguments(1)


把这段示例代码放在刚才的VBScript中,再加上一句对CreateShortCut函数的调用,那个脚本就可以执行了。

VBScript返回值


in vbscript:


wscript.quit(<the integer you want to return>)


in command line:


%ErrorLevel%


遍列文件

for 命令。下面这句话输出d:\mp3 目录及其子目录下的所有.mp3.wma的文件名。


for /r "d:\mp3" %I in (*.mp3 *.wma) do @echo %~nI

最终的batch文件

目的:创建d:\program files 目录下的所有.exe文件的快捷方式,存到 d:\__launcher 目录下.


batch文件内容:


@echo off


for /r "d:\program files" %%I in (*.exe) do (d:\__launcher\mkshortcut.vbs "d:\__launcher\%%~nI.lnk" "%%~fI")


注意与命令行不同,在batch文件中,for 的参数需要两个%

备注


  • 快捷方式的目录必须存在,比如上面的 “d:\__launcher

  • for 中,似乎一次只能 do 一个命令,所以不能在屏幕上显示正在处理的文件;

  • 这样生成的结果是比较粗糙的,因为不少软件的目录下存在不止一个.exe,并不全部需要,而且有些软件的.exe的名称比较抽象,离开当前目录就不太好辨认了;

  • xcopy命令很好很强大,如果它增加一个“仅创建快捷方式”……;

  • 这种事情没有多少技术含量,然而却正是计算机好玩的地方,我想起来做这个,一方面是它真的有点用处,另一方面也是因为那天受同事启发;

  • 现在需要一个.vbs和一个.bat,既然必须用VBScript创建快捷方式,如果连遍列文件也用它,即全部事情都在VBScript完成,肯定更清爽些。关于在VBScript遍列文件系统,这里有份参考:http://stackoverflow.com/questions/138497/batch-scripting-iterating-over-files-in-a-directory;

安上中班,所以现在我可以随意的趴在电脑前做任何事。

上午9点到公司,下午8点才到家。日,不曾想前些天在fedora 9上安装wine,以及在rhel4上安装firefox3的失败经历充分地锤炼了我,所以今天听张BOSS关切道“你别紧张,其实平时我们用yast装的话没那么复杂的“,我心说这个阵势还不算最狠。话说那俩东西要手工解决依赖问题还真不是凡人能干的活,尤其是firefox3,对它来说rhel4实在太老了!我逆着依赖树也不知向上跋涉了多少层,终于放弃了,恨不得吐口鲜血以示悲愤。

我发现同事们基本都对打游戏有点热情,当然也有些很有趣的特点。比如一位老员工热爱星际,说天天玩,但我说我最近在玩CNC3时,他又说“我以为命令与征服就是红警”——so,我估计他只玩星际,就像老二只玩红警一样。另一个家伙,一起装机时,我看到他电脑里有星际的快捷方式,没吭声,一小会儿后听到他手机响了,标准的“军方女声”说:“Nuclear launch detected",这个比裴裴的“You have a incoming call"强大多了。

这个家伙的快捷方式值得一说的。他的桌面很干净,用他自己的话说,他对此有洁癖。不过上面有个小小的、邪恶的文件夹,确切地说这也是一个快捷方式,它里面有上百个……还是快捷方式,starcraft, foxmail, winscp...,都在里面。他说他写了个小程序,能根据一个软件清单把硬盘上安装的那些软件的快捷方式都生成出来,得到现在这个包罗万象的文件夹——就这一点说,他显然更比我有程序员精神。

老二玩红警也值得一说。我不道他后来换了机器后玩过没有,在他的主频500M左右的老赛扬上,老二有句名言,经常被老四和我拿来调侃:“速度太慢?你开全速啊!调到6!”

刚刚过去的这个星期我几乎天天都在来两盘CNC3,在今天得知大家都在玩游戏之前,我都有点不好意思了。说实话,在家打游戏被安鄙视得不行啊:又赛车!有本事自己买个哪怕差点的真的!又打仗!虚荣心怎么这么幼稚!

没得办法,喜欢差异太大了,而且这个差异是渊源流长的。我一点也不奇怪安为什么不理解我的爱好,因为我也完全理解不了她和她妈为会那么喜欢看娱乐节目,尤其阿姨,哪怕那些人在舞台上光打喷嚏,她也看得乐呵呵。

但我其实还是很困惑:安从来不看卡通片,不管是传统的动画片,还是现在的3D电影。那天我在她旁边看迪斯尼新出的《WALL-E》,又欢喜又感动,几乎要一把鼻涕一把泪,可安始终懒得正眼瞧瞧。大惑啊!你喜欢哈啰KITTY,可那小猫也就是头顶上一个蝴蝶结+腮帮上两撮毛,跟电影角色比,这个形象也太单薄了啊!

叔叔的则对历史、政治感兴趣,也涉及一些科技,笼统地说,跟我还是相像的。不过他居然非常留意国内的政治人物的“发迹史”,比如某某部长是“正是”某某乡人,以前曾任某省某职。相像是因为都是男人,不同是因为代沟,肯定的。

昨天把笔记本的前盖拆了,因为不然取不出GPRS网卡,就这我还是动用了活口扳手才把它搞下来的,SORRY,没有钳子。

取不出网卡是因为专门用来弹出PCMCIA卡的开关失灵了。可能怪我以前老对叔叔和安说:要是不能正常上网了,你就把卡弹出来再插回去,再不行就把机器关了再开!这样说很不负责,不过确实省事,以前我在向安解释一件事时,如果试图从原理角度多讲一点,她马上会不耐烦地总结说我总是把事情弄得太复杂。后果之一是,我现在就怂恿她用上面的方式解决拔号不正常的问题,对于叔叔,我就把hao123.net丢给他;后果之二是,她至今坚持认为在一台电脑上如果按CTRL+SHIFT出不来拼音输入法,这台电脑就有毛病,进而可以认为负责维护这台电脑的人,比如我,也有毛病。

睡觉前也许可以再来一盘CNC3。目前为止,我对这个游戏有个不适:建筑和步兵单位的外形(包括颜色)差异都不像RA2那样明显,混在一起不好分辨。