﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-It is just c plus plus.</title><link>http://www.cppblog.com/zmllegtui/</link><description>Nothing in my mind.</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 09:41:45 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 09:41:45 GMT</pubDate><ttl>60</ttl><item><title>xcopy</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/19/112997.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Mon, 19 Apr 2010 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/19/112997.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112997.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/19/112997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112997.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112997.html</trackback:ping><description><![CDATA[<p>Xcopy <br>复制文件和目录，包括子目录。 </p>
<p>语法 <br>xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:mm-dd-yyyy]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a|/m}] [/n] [/o] [/x] [/exclude:file1[+[file2]][+[file3]] [{/y|/-y}] [/z] </p>
<p>参数 <br>Source <br>必需的。指定要复制的文件的位置和名称。该参数必须包含驱动器或路径。 <br>Destination <br>指定要复制的文件的目标。该参数可以包含驱动器盘符和冒号、目录名、文件名或者它们的组合。 <br>/w <br>在开始复制文件之前将显示以下消息并等待您的响应： <br>Press any key to begin copying file(s) </p>
<p>/p <br>提示您确认是否要创建每个目标文件。 <br>/c <br>忽略错误。 <br>/v <br>在写入目标文件时验证每个文件，以确保目标文件与源文件完全相同。 <br>/q <br>禁止显示 xcopy 消息。 <br>/f <br>复制时显示源文件名和目标文件名。 <br>/l <br>显示要复制的文件列表。 <br>/g <br>创建解密的目标文件。 <br>/d[:mm-dd-yyyy] <br>只复制那些在指定日期或指定日期之后更改过的源文件。如果不包括 mm-dd-yyyy 值，xcopy 会复制比现有 Destination 文件新的所有 Source 文件。该命令行选项使您可以更新更改过的文件。 <br>/u <br>只从 source 复制 destination 中已有的文件。 <br>/i <br>如果 Source 是一个目录或包含通配符，而 Destination 不存在，xcopy 会假定 destination 指定目录名并创建一个新目录。然后，xcopy 会将所有指定文件复制到新目录中。默认情况下，xcopy 将提示您指定 destination 是文件还是目录。 <br>/s <br>复制非空的目录和子目录。如果省略 /s，xcopy 将在一个目录中工作。 <br>/e <br>复制所有子目录，包括空目录。同时使用 /e、/s 和 /t 命令行选项。 <br>/t <br>只复制子目录结构（即目录树），不复制文件。要复制空目录，必须包含 /e 命令行选项。 <br>/k <br>复制文件，如果源文件具有只读属性，则在目标文件中保留该属性。默认情况下，xcopy 会删除只读属性。 <br>/r <br>复制只读文件。 <br>/h <br>复制具有隐藏和系统文件属性的文件。默认情况下，xcopy 不复制隐藏或系统文件。 <br>/a <br>只复制那些具有存档文件属性设置的源文件。/a 不修改源文件的存档文件属性。有关如何通过使用 attrib 来设置存档文件属性的信息，请参阅&#8220;&#8221;。 <br>/m <br>复制具有存档文件属性设置的源文件。与 /a 不同，/m 关闭在源中指定的文件的存档文件属性。有关如何通过使用 attrib 来设置存档文件属性的信息，请参阅&#8220;&#8221;。 <br>/n <br>使用 NTFS 短文件或目录名创建副本。将文件或目录从 NTFS 卷复制到 FAT 卷或者当目标文件系统需要 FAT 文件系统命名约定（即 8.3 个字符）时，需要 /n。目标文件系统可以是 FAT 或 NTFS。 <br>/o <br>复制文件所有权与自由选择的访问控制列表 (DACL) 信息。 <br>/x <br>复制文件审核设置和系统访问控制列表 (SACL) 信息（包含 /o）。 <br>/exclude:filename1[+[filename2]][+[filename3]] <br>指定包含字符串的文件列表。 <br>/y <br>禁止提示您确认要覆盖现存的目标文件。 <br>/-y <br>提示您确认要覆盖现有目标文件。 <br>/z <br>在可重启模式中通过网络复制。 <br>/? <br>在命令提示符显示帮助。 <br>注释 <br>使用 /v <br>XOX </p>
<p>使用 /exclude <br>列出每个文件的单独行中的每个字符串。如果列出的任何字符串与要复制的文件的绝对路径的任何部分匹配，就从复制进程排除该文件。例如，如果指定字符串 "\Obj\"，则会排除 Obj 目录下的所有文件。如果指定字符串 ".obj"，则排除具有 .obj 扩展名的所有文件。 </p>
<p>使用 /z <br>如果在复制过程中丢失连接（例如，如果用于连接的服务器脱机），复制过程将在重新建立连接后恢复。/z 也显示每个文件完成的复制操作的百分比。 </p>
<p>在 COPYCMD 环境变量中使用 /y <br>可在 COPYCMD 环境变量中使用 /y。在命令行上使用 /-y 可以覆盖该命令。默认情况下，会提示您覆盖，除非您从批处理脚本内运行 copy。 </p>
<p>复制加密的文件 <br>将加密文件复制到不支持 EFS 的卷会导致错误。应首先解密文件或将文件复制到支持 EFS 的卷中。 </p>
<p>附属文件 <br>要附加文件，请指定单个目标文件，多个源文件（使用通配符或文件 1 + 文件 2 + 文件 3 格式）。 </p>
<p>Destination 的默认值 <br>如果省略 Destination，xcopy 命令将文件复制到当前目录。 </p>
<p>指定 Destination 是文件还是目录 <br>如果 Destination 不包含现有目录且不以反斜杠 (\) 结尾，会出现下列消息： </p>
<p>Does destination specify a file name <br>or directory name on the target <br>(F = file, D = directory)? </p>
<p>如果要将一个或多个文件复制到一个文件，请按 F。如果要将一个或多个文件复制到一个目录，请按 D。 </p>
<p>使用 /i 命令行选项可抑制显示该消息，从而导致 xcopy 认定在源是多个文件或一个目录的情况下，目标是一个目录。 </p>
<p>使用 xcopy 命令设置 Destination 文件的存档属性 <br>xcopy 命令创建具有存档属性设置的文件，无论源文件中是否设定了此属性。有关文件属性和 attrib 的详细信息，请参阅&#8220;&#8221;。 </p>
<p>比较 xcopy 和 diskcopy <br>如果磁盘的子目录中包含文件，要将其复制到具有不同格式的磁盘中，请使用 xcopy 命令，而不要使用 diskcopy。因为 diskcopy 命令是一个磁道接一个磁道地复制磁盘，所以需要源磁盘和目标磁盘的格式必须相同。xcopy 命令没有该要求。通常情况下请使用 xcopy，除非您需要完整的磁盘图像副本。 </p>
<p>xcopy 的退出码 <br>要处理 xcopy 返回的退出码，请在批处理程序的 if 命令行上使用 errorlevel 参数。有关使用&#8220;if&#8221;处理退出码的批处理程序的范例，请参阅&#8220;&#8221;。下表列出每一个退出码和说明。 </p>
<p>退出码 说明 <br>0 文件复制没有错误。 <br>1 没有找到要复制的文件。 <br>2 用户按 CTRL+C 终止了 xcopy。 <br>4 出现了初始化错误。没有足够的内存或磁盘空间，或命令行上输入了无效的驱动器名称或语法。 <br>5 出现了磁盘写入错误。 </p>
<p>范例 <br>要从驱动器 A 将所有文件和子目录（包括所有空的子目录）复制到驱动器 B，请键入： </p>
<p>xcopy a:b:/s /e </p>
<p>要包含上一示例中的任何系统或隐藏文件，请按如下所示添加 /h 命令行选项： </p>
<p>xcopy a:b:/s /e /h </p>
<p>要使用 \Rawdata 目录中 1993 年 12 月 29 日后更改的文件更新 \Reports 目录中的文件，请键入： </p>
<p>xcopy \rawdata \reports /d:12-29-1993 </p>
<p>要更新上例中 \Reports 中存在的所有文件，而不考虑日期，请键入： </p>
<p>xcopy \rawdata \reports /u </p>
<p>如果只想获得前一个命令要复制的文件列表，而不复制文件，请键入： </p>
<p>xcopy \rawdata \reports /d:12-29-1993 /l &gt; xcopy.out </p>
<p>文件 Xcopy.out 列出了要复制的所有文件。 </p>
<p>要将 \Customer 目录和所有子目录复制到网络驱动器 H: 上的目录 <a href="file://public/Address">\\Public\Address</a>，保留只读属性，并在 H: 上创建新文件时对您做出提示，请键入： </p>
<p>xcopy \customer h:\public\address /s /e /k /p </p>
<p>要发出上一个命令，确保在 \Address 目录不存在时 xcopy 会创建该目录，同时应抑制显示创建新目录时要显示的消息，请按如下所示添加 /i 命令行选项： </p>
<p>xcopy \customer h:\public\address /s /e /k /p /i </p>
<p>可以创建批处理程序执行 xcopy 操作，并且使用 if 批处理命令在发生错误时处理退出码。例如，以下的批处理程序使用可替换的 xcopy 源和目标参数： </p>
<p>@echo off <br>rem COPYIT.BAT transfers all files in all subdirectories of <br>rem the source drive or directory (%1) to the destination </p>
<p>rem drive or directory (%2) </p>
<p>xcopy %1 %2 /s /e </p>
<p>if errorlevel 4 goto lowmemory <br>if errorlevel 2 goto abort <br>if errorlevel 0 goto exit </p>
<p>:lowmemory <br>echo Insufficient memory to copy files or <br>echo invalid drive or command-line syntax. <br>goto exit </p>
<p>:abort <br>echo You pressed CTRL+C to end the copy operation. <br>goto exit </p>
<p>:exit </p>
<p>要使用该批处理程序将 C:\Prgmcode 目录和其子目录中的所有文件复制到驱动器 B 中，请键入： </p>
<p>copyit c:\prgmcode b: </p>
<p>该命令解释程序将用 C:\Prgmcode 替换 %1 与 B:。对于 %2，然后使用 xcopy 与 /e 和 /s 命令行选项。如果 xcopy 遇到错误，批处理程序将读取退出码并转到相应 IF ERRORLEVEL 语句中指示的标签，然后显示相应的消息并退出批处理程序。<br>详细出处参考：<a href="http://www.jb51.net/article/11313.htm">http://www.jb51.net/article/11313.htm</a></p>
<img src ="http://www.cppblog.com/zmllegtui/aggbug/112997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-19 17:00 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/19/112997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WindowsXP运行命令</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/12/112282.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 11 Apr 2010 18:18:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/12/112282.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112282.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/12/112282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112282.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112282.html</trackback:ping><description><![CDATA[<p>可用于bat文件中的call调用（大多项未经测试= =）<br>&nbsp;<br>辅助功能选项 &nbsp;&nbsp;&nbsp;&nbsp;access.cpl&nbsp;&nbsp; <br>添加硬件向导 &nbsp;&nbsp;&nbsp;&nbsp;hdwwiz.cpl&nbsp;&nbsp; <br>添加或删除程序 &nbsp;&nbsp;&nbsp;&nbsp;appwiz.cpl&nbsp;&nbsp; <br>管理工具 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control admintools&nbsp;&nbsp; <br>自动更新 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wuaucpl.cpl&nbsp;&nbsp; <br>Bluetooth文件传送向导 &nbsp;&nbsp;fsquirt&nbsp;&nbsp; <br>计算器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calc&nbsp;&nbsp; <br>证书管理控制台 &nbsp;&nbsp;&nbsp;&nbsp;certmgr.msc&nbsp;&nbsp; <br>字符映射表 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charmap&nbsp;&nbsp; <br>磁盘检查工具&nbsp;&nbsp;&nbsp;&nbsp;chkdsk&nbsp;&nbsp; <br>剪贴簿查看器 &nbsp;&nbsp;&nbsp;&nbsp;clipbrd&nbsp;&nbsp; <br>命令行提示符 &nbsp;&nbsp;&nbsp;&nbsp;cmd&nbsp;&nbsp; <br>组件服务 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dcomcnfg&nbsp;&nbsp; <br>计算机管理 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compmgmt.msc&nbsp;&nbsp; <br>日期和时间属性 &nbsp;&nbsp;&nbsp;&nbsp;timedate.cpl&nbsp;&nbsp; <br>DDE共享 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ddeshare&nbsp;&nbsp; <br>设备管理器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;devmgmt.msc&nbsp;&nbsp; <br>Direct X控制面板 &nbsp;&nbsp;&nbsp;directx.cpl&nbsp;&nbsp; <br>Direct X诊断工具&nbsp;&nbsp;&nbsp;dxdiag&nbsp;&nbsp; <br>磁盘清理工具 &nbsp;&nbsp;&nbsp;&nbsp;cleanmgr&nbsp;&nbsp; <br>磁盘碎片整理程序 &nbsp;&nbsp;&nbsp;dfrg.msc&nbsp;&nbsp; <br>磁盘管理 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskmgmt.msc&nbsp;&nbsp; <br>磁盘分区管理器 &nbsp;&nbsp;&nbsp;&nbsp;diskpart&nbsp;&nbsp; <br>个性化&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control desktop&nbsp;&nbsp; <br>显示属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desk.cpl&nbsp;&nbsp; <br>显示属性的外观选项卡 &nbsp;&nbsp;control color&nbsp;&nbsp; <br>Dr. Watson系统诊断工具 &nbsp;&nbsp;drwtsn32&nbsp;&nbsp; <br>Driver Verifier Manager &nbsp;verifier&nbsp;&nbsp; <br>事件查看器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eventvwr.msc&nbsp;&nbsp; <br>文件签名验证 &nbsp;&nbsp;&nbsp;&nbsp;sigverif&nbsp;&nbsp; <br>快速查找 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;findfast.cpl&nbsp;&nbsp; <br>文件夹选项 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control folders&nbsp;&nbsp; <br>字体文件夹 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control fonts&nbsp;&nbsp; <br>字体文件夹 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fonts&nbsp;&nbsp; <br>空档接龙游戏 &nbsp;&nbsp;&nbsp;&nbsp;freecell&nbsp;&nbsp; <br>游戏控制 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;joy.cpl&nbsp;&nbsp; <br>本地组策略编辑器 &nbsp;&nbsp;&nbsp;gpedit.msc&nbsp;&nbsp; <br>红心大战游戏 &nbsp;&nbsp;&nbsp;&nbsp;mshearts&nbsp;&nbsp; <br>Iexpress向导 &nbsp;&nbsp;&nbsp;&nbsp;iexpress&nbsp;&nbsp; <br>索引服务 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ciadv.msc&nbsp;&nbsp; <br>Internet属性 &nbsp;&nbsp;&nbsp;&nbsp;inetcpl.cpl&nbsp;&nbsp; <br>IP配置实用程序(显示连接配置) &nbsp;&nbsp;&nbsp;ipconfig /all&nbsp;&nbsp; <br>IP配置实用程序(显示DNS缓存内容) &nbsp;&nbsp;ipconfig /displaydns&nbsp;&nbsp; <br>IP配置实用程序(删除DNS缓存内容) &nbsp;&nbsp;ipconfig /flushdns&nbsp;&nbsp; <br>IP配置实用程序(释放全部(或指定)适配器的由DHCP分配的动态IP地址) &nbsp;&nbsp;ipconfig /release&nbsp;&nbsp; <br>IP配置实用程序(为全部适配器重新分配IP地址) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipconfig /renew&nbsp;&nbsp; <br>IP配置实用程序(刷新DHCP并重新注册DNS) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipconfig /registerdns&nbsp;&nbsp; <br>IP配置实用程序(显示DHCP Class ID) &nbsp;&nbsp;ipconfig /showclassid&nbsp;&nbsp; <br>IP配置实用程序(修改DHCP Class ID) &nbsp;&nbsp;ipconfig /setclassid&nbsp;&nbsp;&nbsp;&nbsp; <br>键盘属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control keyboard&nbsp;&nbsp; <br>本地安全设置 &nbsp;&nbsp;&nbsp;&nbsp;secpol.msc&nbsp;&nbsp; <br>本地用户和组 &nbsp;&nbsp;&nbsp;&nbsp;lusrmgr.msc&nbsp;&nbsp; <br>从Windows注销 &nbsp;&nbsp;&nbsp;&nbsp;logoff&nbsp;&nbsp; <br>微软聊天程序 &nbsp;&nbsp;&nbsp;&nbsp;winchat&nbsp;&nbsp; <br>扫雷游戏 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;winmine&nbsp;&nbsp; <br>鼠标属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control mouse&nbsp;&nbsp; <br>鼠标属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main.cpl&nbsp;&nbsp; <br>网络连接 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control netconnections&nbsp;&nbsp; <br>网络连接 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ncpa.cpl&nbsp;&nbsp; <br>网络安装向导 &nbsp;&nbsp;&nbsp;&nbsp;netsetup.cpl&nbsp;&nbsp; <br>记事本 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notepad&nbsp;&nbsp; <br>Nview桌面管理器(如果已经安装) &nbsp;&nbsp;&nbsp;nvtuicpl.cpl&nbsp;&nbsp; <br>对象包装程序 &nbsp;&nbsp;&nbsp;&nbsp;packager&nbsp;&nbsp; <br>ODBC数据源管理器 &nbsp;&nbsp;&nbsp;odbccp32.cpl&nbsp;&nbsp; <br>屏幕键盘 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;osk&nbsp;&nbsp; <br>AC3解码器(如果已经安装) &nbsp;ac3filter.cpl&nbsp;&nbsp; <br>密码属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password.cpl&nbsp;&nbsp; <br>性能 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perfmon.msc&nbsp;&nbsp; <br>性能 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perfmon&nbsp;&nbsp; <br>电话与调制解调器选项 &nbsp;&nbsp;telephon.cpl&nbsp;&nbsp; <br>电源选项属性 &nbsp;&nbsp;&nbsp;&nbsp;powercfg.cpl&nbsp;&nbsp; <br>打印机和传真 &nbsp;&nbsp;&nbsp;&nbsp;control printers&nbsp;&nbsp; <br>打印机文件夹 &nbsp;&nbsp;&nbsp;&nbsp;printers&nbsp;&nbsp; <br>TrueType造字程序 &nbsp;&nbsp;&nbsp;eudcedit&nbsp;&nbsp; <br>Quicktime(如果已经安装) &nbsp;QuickTime.cpl&nbsp;&nbsp; <br>区域和语言选项 &nbsp;&nbsp;&nbsp;&nbsp;intl.cpl&nbsp;&nbsp; <br>注册表编辑器 &nbsp;&nbsp;&nbsp;&nbsp;regedit&nbsp;&nbsp; <br>注册表编辑器 &nbsp;&nbsp;&nbsp;&nbsp;regedit32&nbsp;&nbsp; <br>远程桌面 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mstsc&nbsp;&nbsp; <br>可移动存储 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntmsmgr.msc&nbsp;&nbsp; <br>可移动存储操作请求 &nbsp;&nbsp;&nbsp;ntmsoprq.msc&nbsp;&nbsp; <br>策略的结果集 (XP专业版) &nbsp;rsop.msc&nbsp;&nbsp; <br>扫描仪与相机 &nbsp;&nbsp;&nbsp;&nbsp;sticpl.cpl&nbsp;&nbsp; <br>任务计划 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;control schedtasks&nbsp;&nbsp; <br>Windows安全中心 &nbsp;&nbsp;&nbsp;wscui.cpl&nbsp;&nbsp; <br>服务 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;services.msc&nbsp;&nbsp; <br>共享文件夹 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fsmgmt.msc&nbsp;&nbsp; <br>关闭Windows &nbsp;&nbsp;&nbsp;&nbsp;shutdown&nbsp;&nbsp; <br>声音和音频设备属性 &nbsp;&nbsp;&nbsp;mmsys.cpl&nbsp;&nbsp; <br>蜘蛛牌游戏 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spider&nbsp;&nbsp; <br>SQL Client客户端网络实用工具 &nbsp;&nbsp;&nbsp;cliconfg&nbsp;&nbsp; <br>系统配置编辑器&nbsp;&nbsp;&nbsp;&nbsp;sysedit&nbsp;&nbsp; <br>系统配置实用程序 &nbsp;&nbsp;&nbsp;msconfig&nbsp;&nbsp; <br>系统文件检查工具(立即扫描) &nbsp;&nbsp;&nbsp;&nbsp;sfc /scannow&nbsp;&nbsp; <br>系统文件检查工具(下次启动时扫描) &nbsp;&nbsp;sfc /scanonce&nbsp;&nbsp; <br>系统文件检查工具(每次启动时扫描) &nbsp;&nbsp;sfc /scanboot&nbsp;&nbsp; <br>系统文件检查工具(返回默认设置) &nbsp;&nbsp;&nbsp;sfc /revert&nbsp;&nbsp; <br>系统文件检查工具(清除文件缓存) &nbsp;&nbsp;&nbsp;sfc /purgecache&nbsp;&nbsp; <br>系统文件检查工具(设置缓存大小=x) &nbsp;&nbsp;sfc /cachesize=x&nbsp;&nbsp; <br>系统属性 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysdm.cpl&nbsp;&nbsp; <br>任务管理器 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskmgr&nbsp;&nbsp; <br>Telnet客户端 &nbsp;&nbsp;&nbsp;&nbsp;telnet&nbsp;&nbsp; <br>用户帐户管理 &nbsp;&nbsp;&nbsp;&nbsp;nusrmgr.cpl&nbsp;&nbsp; <br>辅助工具管理器 &nbsp;&nbsp;&nbsp;&nbsp;utilman&nbsp;&nbsp; <br>Windows防火墙 &nbsp;&nbsp;&nbsp;&nbsp;firewall.cpl&nbsp;&nbsp; <br>Windows放大镜 &nbsp;&nbsp;&nbsp;&nbsp;magnify&nbsp;&nbsp; <br>Windows管理体系结构 &nbsp;&nbsp;wmimgmt.msc&nbsp;&nbsp; <br>Windows系统安全工具 &nbsp;&nbsp;syskey&nbsp;&nbsp; <br>运行Windows更新 &nbsp;&nbsp;&nbsp;wupdmgr&nbsp;&nbsp; <br>漫游Windows XP &nbsp;&nbsp;&nbsp;&nbsp;tourstart&nbsp;&nbsp; <br>写字板 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write </p>
<img src ="http://www.cppblog.com/zmllegtui/aggbug/112282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-12 02:18 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/12/112282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何搭建自己的Wiki</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112097.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Fri, 09 Apr 2010 10:30:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112097.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112097.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112097.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112097.html</trackback:ping><description><![CDATA[直接贴网址转载, 不赘述.<br>http://www.360doc.com/content/07/0906/08/41237_722416.shtml<br><img src ="http://www.cppblog.com/zmllegtui/aggbug/112097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-09 18:30 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/09/112097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写软件项目需求文档</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112087.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Fri, 09 Apr 2010 09:31:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112087.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112087.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112087.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112087.html</trackback:ping><description><![CDATA[<font><font size="3"><font face="Verdana">&#8226; 保持语句和段落的简短。<br>&#8226; 采用主动语态的表达方式。<br>&#8226; 编写具有正确的语法、拼写和标点的完整句子。<br>&#8226; 使用的术语与词汇表中所定义的应该一致。<br>&#8226; 需求陈述应该具有一致的样式，例如&#8220;系统必须⋯⋯&#8221;或者&#8220;用户必须⋯⋯&#8221;，并紧跟一个行为动作和可观察的结果。例如，&#8220;仓库管理子系统必须显示一张所请求的仓库中有存货的化学药品容器清单。&#8221;<br>&#8226; 为了减少不确定性，必须避免模糊的、主观的术语，例如，用户友好、容易、简单、迅速、有效、支持、许多、最新技术、优越的、可接受的和健壮的。当用客说&#8220;用户友好&#8221;或者&#8220;快&#8221;或者&#8220;健壮&#8221;时，你应该明确它们的真正含义并且在需求中阐明用户的意图。<br>&#8226;
避免使用比较性的词汇，例如：提高、最大化、最小化和最佳化。定量地说明所需要提高的程度或者说清一些参数可接受的最大值和最小值。当客户说明系统应该&#8220;
处理&#8221;、&#8220;支持&#8221;或&#8220;管理&#8221;某些事情时，你应该能理解客户的意图。含糊的语句表达将引起需求的不可验证。由于需求的编写是层次化的，因此，可以把顶层不明
确的需求向低层详细分解，直到消除不明确性为止。编写详细的需求文档，所带来的益处是如果需求得到满足，那么客户的目的也就达到了，但是不要让过于详细的
需求影响了设计。如果你能用不同的方法来满足需求且这种方法都是可接受的，那么需求的详细程度也就足够了。然而，如果评审软件需求规格说明的设计人员对客
户的意图还不甚了解，那么就需要增加额外的说明，以减少由于误解而产生返工的风险。<br></font></font></font><font><font size="3"><font face="Verdana">&#8226;
编写可测试需求文档</font></font></font><font><font size="3"><font face="Verdana">。</font></font></font><font><font size="3"><font face="Verdana">需求文档的编写人员总是力求寻找到恰如其分的需求详细
程度。一个有益的原则就是编写单个的可测试需求文档。如果你想出一些相关的测试用例可以验证这个需求能够正确地实现，那么就达到了合理的详细程度。如果你
预想的测试很多并且很分散，那么可能就要将一些集合在一起的需求分离开。已经建议将可测试的需求作为衡量软件产品规模大小的尺度（Wilson
1995）。<br></font></font></font><font><font size="3"><font face="Verdana">&#8226;
</font></font></font><font><font size="3"><font face="Verdana">文档的编写人员必须以相同的详细程度编写每个需求文档。我曾见过在同一份软件需求规格说明中，对需求的说明五花八门。例
如，&#8220;组合键C o n t r o l - S代表保存文件&#8221;和&#8220;组合键C o n t r o l -
P代表打印文件&#8221;被当成两个独立的需求。然而，&#8220;产品必须响应以语音方式输入的编辑指令&#8221;则被作为一个子系统，而并不作为一个简单的功能需求。文档的编写
人员不应该把多个需求集中在一个冗长的叙述段落中。在需求中诸如&#8220;和&#8221;，&#8220;或&#8221;之类的连词就表明了该部分集中了多个需求。务必记住，不要在需求说明中使用
&#8220;和/或&#8221;，&#8220;等等&#8221;之类的连词。文档的编写人员在编写软件需求规格说明时不应该出现需求冗余。虽然在不同的地方出现相同的需求可能会使文档更易读，但这
也造成了维护上的困难。需求的多个实例都需要同时更新，以免造成需求各实例之间的不一致。在软件需求规格说明中交叉引用相关的各项，</font><font face="Verdana">在进行更改时有助于保持它们之间的同步。让独立性强的需求在需求管理工具或数据库中只出现一次，这样可以缓和冗余问题。<br><br>================可有可无的分割线================<br><br></font></font></font>首先，应重视需求分析的目的（意义），编写目的明确，写的详细，能确保文档的质量有所提高。<br>下面是一段需求分析意义的范例，希望对大家有所帮助。<br><span class="Title">1.6进行需求分析的意义</span><br><font color="#ff6600">1.&nbsp;本说明书将对用户生产信息管理的业务、对系统要实现的主要功能、性能等需求进行全面地阐述，以便帮助用户判断所要开发的软件是否符合他们的要求。该说明书将在软件开发目标和需求方面为用户和开发者之间创建一个共同的基础和共识。<br>2.&nbsp;由
于需求说明书要有用户的审核、修改完善、认定的过程，在这个过程中可以使用户在软件设计之前广泛地征求各业务部门的意见、提出有关系统建设的建议、对自己
的需求和要求进行周密地思考，并要把这些意见和建议反映到用户需求说明书中。这样就能减少事后重新设计、重新编码和重新测试的返工行为。<br>3.&nbsp;用户需求的调查分析过程也是用户对自己的业务和管理进行总结和规范的过程，通过用户需求说明书把用户更加规范的管理反映到了软件开发中，从而使用户的管理更加完善和规范。<br>4.&nbsp;需求说明书是开发者进行软件设计的依据，软件设计要依据本说明书将进行系统分析、数据库设计、模块设计、接口设计、输入输出格式设计等。<br>5.&nbsp;需求说明书使开发者在软件进行设计和开发之前，能够充分了解和熟悉用户的要求，并判断这些要求是否有不能解决的技术问题，若有应提出一个用户认可的代替解决方案。以免出现设计出的一个目标不能在开发过程中实现的问题<br>6.&nbsp;在需求调查和分析期间可以搜集有关系统开发的有关原始数据和代码，以便在系统开发中建立开发环境时应用<br>7.&nbsp;在软件开发方面为用户和开发者提供一个标准，为系统开发结束进行确认和验收提供一个双方认可的依据。<br>8.&nbsp;便于软件的维护和提高，为软件维护和为今后对所开发的软件进行完善扩充提供进一步分析的基础。<br>总之，用户需求说明书的编写是软件工程中的非常关键的一个环节，用户说明书也是软件工程中的非常重要的一个文档。一个好的用户需求说明书不但能够提高软件开发的效率、保障软件开发的质量，而且有利于系统的验收和以后软件的维护及扩充。</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面正式谈一下我对需求文档的一些写作思路：&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
首先要对用户机构机构有清晰的了解，写出各机构所涉及的业务，画出相应业务的用例图；之后提取出相应的业务流程，画出相应的流程图。通过业务流程，即可抽
象出系统需实现的功能。再将各业务（功能）涉及到对象（如人员，物品等）信息描述出来，根据提取出的信息将功能以IPO表（即输入、处理、输出表）的形式
进行描述，逐项定量和定性地叙述对软件所提出的功能要求，详细的说明输入什么量、经怎样的处理、得到什么输出，并说明待开发软件应支持的终端数和应支持的
并行操作的用户数。需求文档的主要部分就这样完成了。</p>
<p>====================完全没有必要的分割线=====================</p>
<p>引用topic:<br></p>
http://www.javaeye.com/topic/178200<br> <img src ="http://www.cppblog.com/zmllegtui/aggbug/112087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-09 17:31 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/09/112087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件项目需求分析为什么困难</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112059.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Fri, 09 Apr 2010 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112059.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112059.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112059.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112059.html</trackback:ping><description><![CDATA[<p><font face="Verdana">有几种原因使需求分析变得困难：（1）客户说不清楚需求；（2）需求自身经常变动；（3）分析人员或客户理解有误。</font></p>
<p><font face="Verdana"><strong>1 客户说不清楚需求</strong><br><br>有些客户对需求只有朦胧的感觉，当然说不清楚具体的需求。例如全国各地的很多政府机构在搞网络建设，这些单位的领导和办公人员大多不清楚计算机网络有什么用，反而要软件系统分析人员替他们设想需求。这类工程的需求是如此的主观，以致产生很多贪污腐败现象。<br><br>有
些客户心里非常清楚想要什么，但却说不明白。读者可能很不以为然。就举日常生活的事例吧，比如说买鞋子。我们非常了解自已的脚，但没法说清楚脚的大小和形
状。只能拿鞋子去试，试穿时感觉到舒服才会买鞋（居然也有神通广大的售货员，看一眼客户的手，就知道应该穿什么样的鞋）。<br><br>如果客户本身就
懂软件开发，能把需求说得清清楚楚，这样的需求分析将会非常轻松、愉快。如果客户全不懂软件，但信任软件开发方，这事也好办。分析人员可以引导客户，先阐
述常规的需求，再由客户否定不需要的，最终确定客户真正的需求。最怕的就是&#8220;不懂装懂&#8221;或者&#8220;半懂充内行&#8221;的客户，他们会提出不切实际的需求。如果这些客
户甚至觉得自己是上帝的爸爸，那么沟通和协商都会很困难。</font></p>
<p><font face="Verdana"><strong>2 需求自身经常变动</strong><br><br>唐僧曾说：&#8220;妖要是有了仁慈之心，就不再是妖，是人妖。&#8221;（《大话西游之大圣娶亲》）<br>连妖都会变心，别说人了。所以喜新厌旧乃人之常情，世界也因此变得多姿多彩。<br>软件的需求会变化吗？<br><br>答：据历史记载，没有一个软件的需求改动少于三次。唯一只改动需求两次的客户是个死人。这个可怜的家伙还是在运送第三次需求的路上被车子撞死的。[Cline 1995]<br>让我们先接受&#8220;需求会变动&#8221;这个事实吧，免得在需求变动时惊慌失措。明白&#8220;需求会变动&#8221;这个道理后，在进行需求分析时就要留点神：<br>（1）尽可能地分析清楚哪些是稳定的需求，哪些是易变的需求。以便在进行系统设计时，将软件的核心建筑在稳定的需求上，否则将会吃尽苦头。<br>（2）在合同中一定要说清楚&#8220;做什么&#8221;和&#8220;不做什么&#8221;。如果合同含含糊糊，日后扯皮的事情就多。要防止象韩复渠那样，在别人请他喝酒吃饭时他什么都点头（人家就更加献殷勤），吃完了他就宣布刚才答应的事都不算数，便扬长而去。</font></p>
<p><font face="Verdana"><strong>3 分析人员或客户理解有误</strong><br><br>有个外星人间谍潜伏到地球刺探情报，它给上司写了一份报告：&#8220;主宰地球的是车。它们喝汽油，靠四个轮子滚动前进。嗓门极大，在夜里双眼能射出强光。&#8230;&#8230;有趣的是，车里住着一种叫作&#8216;人&#8217;的寄生虫，这些寄生虫完全控制了车。&#8221;<br><br>软
件系统分析人员不可能都是全才。客户表达的需求，不同的分析人员可能有不同的理解。如果分析人员理解错了，可能会导致开发人员白干活，吃力不讨好。我读中
学时候最怕写作文逃题，如果逃题了，不管作文写得多长，总是零分。所以分析人员写好需求说明书后，要请客户方的各个代表验证。如果问题很复杂，双方都不太
明白，就有必要请开发人员快速构造软件的原型，双方再次论证需求说明书是否正确。<br><br>由于客户大多不懂软件，他们可能觉得软件是万能的，会提出一些无法实现的需求。有时客户还会把软件系统分析人员的建议或答复给想歪了。<br><br>有一个软件人员滔滔不绝地向客户讲解在&#8220;信息高速公路上做广告&#8221;的种种好处，客户听得津津有味。最后，心动的客户对软件人员说：&#8220;好得很，就让我们马上行动起来吧。请您决定广告牌的尺寸和放在哪条高速公路上，我立即派人去做。&#8221;<br><br>为什么软件系统分析员的工资要比普通程序员高？就是因为需求分析困难嘛。</font></p><img src ="http://www.cppblog.com/zmllegtui/aggbug/112059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-09 13:32 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/09/112059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件项目可行性分析的要素</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112058.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Fri, 09 Apr 2010 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112058.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112058.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112058.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112058.html</trackback:ping><description><![CDATA[<font size="3">
<p><font face="Verdana">做可行性分析不能以偏盖全，也不可以什么鸡毛蒜皮的细节都加以权衡。可行性分析必须为决策提供有价值的证据。<br><br>联想集团领导人柳传志曾说：&#8220;没钱赚的事我们不干；有钱赚但投不起钱的事不干；有钱赚也投得起钱但没有可靠的人选，这样的事也不干。&#8221;柳传志为决策立了上述准则，同时也为可以行性分析指明了重点。<br><br>一般地，软件领域的可行性分析主要考虑四个要素：经济、技术、社会环境和人。本节只是泛泛地解释这四个要素，旨在建立全局分析的观念。4.2节将结合案例围绕上述要素进行重点分析与评注。</font></p>
<p><font face="Verdana"><strong>经济</strong><br><br>经济可行性分析主要包括：&#8220;成本——收益&#8221;分析和&#8220;短期——长远利益&#8221;分析。</font></p>
<p><font face="Verdana">一、成本——收益分析<br>成本——收益分析最容易理解，如果成本高于收益则表明亏损了，如果成本大大高于收益那就亏大了。商人都不喜欢做吃亏的事情。有些商店成天贴着&#8220;最后一天跳楼大拍卖&#8221;的标语，意思是：我准备吃大亏让你占便宜，同志，你快上钩吧。<br>如果是为客户做软件项目，那么收益就写在合同中。如果是做自己的软件产品，那么收益就是销售额。<br>人们在预估产品销售额时常常过分乐观而犯下大错。那些对你的产品说恭维话的人并不见得就是要买货的人，俗话说&#8220;嫌货才是买货人&#8221;。当你没碰到一个挑刺的人而感觉这产品好得会让你发大财时，就要做好会破产的心理准备。<br>如果做的是小本生意，那可得对成本进行细算。软件的成本不是指存放软件的那张光盘的成本，而是指开发成本。要考虑的成本有：<br>（1）办公室房租。<br>（2）办公用品，如桌、椅、书柜、照明电器、空调等。<br>（3）计算机、打印机、网络等硬件设备。<br>（4）电话、传真等通讯设备以及通讯费用。<br>（5）资料费。<br>（6）办公消耗，如水电费、打印复印费等。<br>（7）软件开发人员与行政人员的工资。<br>（8）购买系统软件的费用，如买操作系统、数据库、软件开发工具等。有些老板买盗版的系统软件，却按市场价算成本，可从美国佬那里赚一笔。<br>（9）做市场调查、可行性分析、需求分析的交际费用。<br>（10）公司人员培训费用。<br>（11）产品宣传费用。如果用Internet作宣传，则要考虑建设Web站点的费用。<br>（12）如果客户是政府部门，还要充分考虑用于吃喝玩乐、行贿的费用。<br>（13）如果公司的风水不好，会有很多莫名其妙的管理费。每戳一个红艳艳的公章都要化一把钞票。</font></p>
<p><font face="Verdana">二、短期——长远利益分析<br>人们喜欢吃着碗里的、看着锅里的，还想着别人家里的。短期利益和长远利益兼得是人们梦寐以求的事。在商业上，这等好事可不会轻易降临。<br>短期利益容易把握，风险较低。国内软件公司经常出现一窝蜂地去做信息管理系统、多媒体光盘、系统集成项目或Internet服务。每当我们沉迷于短期利益不思进取时，应该好好回忆童年时代那些伟大的抱负，给自己一些激励。<br>长
远利益难以把握，风险较大。能为了长远利益不惜短期亏损的人，要么是雄心勃勃的将帅之才，要么是&#8220;纸上谈兵&#8221;、&#8220;眼高手底&#8221;的那一类庸人。国内目前有不少
Internet企业，只投入不产出。为了成就将来的霸业，甘愿现在拼财力、比耐性。最后存活下来的几个公司将瓜分市场。<br>那些为长远利益奋斗的人们，你们可得把长征的路途走完啊，千万别让事业中途夭折。</font></p>
<p><font face="Verdana"><strong>技术</strong><br><br>技术可行性分析至少要考虑以下几方面因素：<br>（1）在给定的时间内能否实现需求说明中的功能。如果在项目开发过程中遇到难以克服的技术问题，麻烦就大了。轻则拖延进度，重则断送项目。<br>（2）软件的质量如何？有些应用对实时性要求很高，如果软件运行慢如蜗牛，即便功能具备也毫无实用价值。有些高风险的应用对软件的正确性与精确性要求极高，如果软件出了差错而造成客户利益损失，那么软件开发方可要赔惨了。<br>（3）
软件的生产率如何？如果生产率低下，能赚到的钱就少，并且会逐渐丧失竞争力。在统计软件总的开发时间时，不能漏掉用于维护的时间。软件维护是非常拖后腿的
事，它能把前期拿到的利润慢慢地消耗光。如果软件的质量不好，将会导致维护的代价很高，企图通过偷工减料而提高生产率，是得不偿失的事。<br>技术可行性分析可以简单地表述为：做得了吗？做得好吗？做得快吗？</font></p>
<p><font face="Verdana"><strong>社会环境</strong><br><br>社会环境的可行性至少包括两种因素：市场与政策。<br>市场又分为未成熟的市场、成熟的市场和将要消亡的市场。<br>涉足未成熟的市场要冒很大的风险，要尽可能准确地估计潜在的市场有多大？自己能占多少份额？多长时间能实现？<br><br>挤进成熟的市场，虽然风险不高，但油水也不多。如果供大于求，即软件开发公司多，项目少，那么在竞标时可能会出现恶性杀价的情形。国内第一批卖计算机的、做系统集成的公司发了财，别人眼红了也挤进来，这个行业的平均利润也就下降了。<br><br>将要消亡的市场就别进去了。尽管很多程序员怀念DOS时代编程的那种淋漓尽致，可现在没人要DOS应用软件了。学校教学尚可用用DOS软件，商业软件公司则不可再去开发DOS软件。<br>政策对软件公司的生存与发展影响非常大。整个90年代，中国电信的收费相当高，仅此一招就把国内互联网企业打得奄奄一息。某些软件行业的利润很高，但可能存在地方保护政策，使竞争不公平。政策不当将阻碍软件公司的健康发展，可最怕的还是政府干预企业的正当行为。例如：<br>现在家电行业竞争非常激烈，其中有一个著名企业的总裁十分了得，把对手打得节节败退。于是中央领导人就来视察该企业并作讲话：&#8220;你们的业绩辉煌，得到了中央的高度重视，&#8230;&#8230;但我们是社会主义国家，不是资本主义国家，你们总得给兄弟企业的同志们留口饭吃吧!&#8221;<br><br>有一次我拜访了北京大学一位研究经济学的朋友。这个年青人，还是个党员，竞然这么说：&#8220;我最近在研究国内明星企业的兴衰问题，我发现了一个规律，明星企业一旦被政府领导人视察过，它就忘了自己是谁，就会做些走向死亡的蠢事。&#8221;<br><br>我
实在不明白企业中为什么还要有&#8220;书记&#8221;职位。我以为&#8220;书记&#8221;乃是天下第一号可笑的官衔，&#8220;书记&#8221;本是&#8220;秘书&#8221;（secretary）的同义词，是个可有可
无的行政人员的称呼，在中国竟然成了最大的官衔。每次看到新闻联播把国家主席错叫成总书记我都十分气愤：因为总书记的称喟只对几千万的党员适用，国家的新
闻机构难道不面向十多亿普通老百姓？如果我将来的工作单位还靠&#8220;书记&#8221;来管事，我每天准忙着生气，那里还有精力去编程。</font></p>
<p><font face="Verdana"><strong>人</strong><br><br>有句名言：&#8220;人分四类——人物，人才，人手，人渣。&#8221;<br>如果一个软件公司里上述四类人齐全了，那么最好的分工是让&#8220;人物&#8221;当领导，&#8220;人才&#8221;做第一线的开发人员，&#8220;人手&#8221;做行政人员，&#8220;人渣&#8221;负责行贿。<br><br>这里只谈公司的领导与开发人员&#8220;行还是不行&#8221;。&#8220;人物&#8221;毕竟是少数，&#8220;人才&#8221;可是济济的。举重若轻的那类&#8220;人才&#8221;可以做领导，举轻若重的那类人才适合做软件开发人员。假如一群持有学士、硕士和博士文凭的毕业生到软件公司应聘，该如何录用呢？我的建议如下：<br>先选择本科毕业生，因为他们正当青春、干劲十足、不摆架子、不耻下问、要求不高、奉献甚多。<br>其次选择硕士毕业生，如果该生没象范进中举时那么老，并且在读硕士时没有天天去造文章而丢弃了编程工作，那么让有经验的学士程序员带他们煅练几个月就可以用了。<br><br>如
果学士、硕士被其它公司取光了，那只好捡几个博士充数。博士到了软件公司有什么用呢？我想不出有什么用，只知道他们挺值得可怜的：从硕士读到博士出头，这
六七年时间，真本事没学多少，倒学会&#8220;眼高手低&#8221;甚至&#8220;弄虚作假&#8221;；毕业时蓦然回首，发觉青春已被虚度，心灵已呈老态，唯有长叹短嘘，强把自负作自信。我
也将博士毕业，就要论为三手贷贱卖了。真羡慕那些比我年轻的学士、硕士们，他们可以远走高飞，唉！</font></p>
</font><img src ="http://www.cppblog.com/zmllegtui/aggbug/112058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-09 13:32 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/09/112058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件项目的质量控制要素</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112057.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Fri, 09 Apr 2010 05:31:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112057.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/112057.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/09/112057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/112057.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/112057.html</trackback:ping><description><![CDATA[<p><font face="Verdana">&#8220;运行正确&#8221;的程序就是高质量的程序吗？不贪污的官就是好官吗？时下老
百姓对一些腐败的地方政府深痛恶绝，对&#8220;官&#8221;不再有质量期望。只要当官的不贪污，哪怕毫无政绩，也算是&#8220;好官&#8221;。也有一些精明的老百姓打出旗号：宁要贪污
犯，不要大笨蛋。相比之下，程序员是够幸福的了。因为我们能通过努力，由自己来把握软件的命运。那么就不要轻易放弃提高软件质量的权利了。<br><br>&#8220;运行正确&#8221;的程序不见得就是高质量的程序。这个程序也许运行速度很低并且浪费内存；也许代码写得一塌糊涂，除了开发者本人谁也看不懂也不会使用。正确性只是反映软件质量的一个因素而已。<br><br>软
件的质量因素很多，如正确性、精确性、可靠性、容错性、性能、效率、易用性、可理解性、简洁性、可复用性、可扩充性、兼容性等等（还可以列出十几个）。这
些质量因素之间&#8220;你中有我，我中有他&#8221;，非常缠绵。如果程序员每天要面对那么多质量因素咬文嚼字，不久就会迂腐得象孔乙已，并且有找不到女朋友的危险。</font></p>
<p><font face="Verdana"><strong>1 正确性与精确性</strong></font></p>
<p><font face="Verdana">正确性与精确性之所以排在质量因素的第一位，是因为如果软件运行不正确或者不精确，就会给用户造成不便
甚至造成损失。机器不会主动欺骗人，软件运行不正确或者不精确一般都是人造成的。即使一个软件能100%
地按需求规格执行，但是如果需求分析错了，那么对客户而言这个软件也存在错误。即使需求分析完全符合客户的要求，但是如果软件没有100%
地按需求规格执行，那么这个软件也存在错误。开发一个大的软件项目，程序员要为&#8220;正确&#8221;、&#8220;精确&#8221;四个字竭尽精力。<br>与正确性、精确性相关的质量因素是容错性和可靠性。<br><br>容错性首先承认软件系统存在不正确与不精确的因素，为了防止潜在的不正确与不精确因素引发灾难，系统为此设计了安全措施。在一些高风险的软件系统，如航空航天、武器、金融等系统中，容错性设计非常重要。<br><br>可
靠性是指在一定的环境下，在给定的时间内，系统不发生故障的概率。可靠性本来是硬件领域的术语。比如某个电子设备，一开始工作很正常，但由于工作中器件的
物理性质会发生变化（如发热），慢慢地系统就会失常。所以一个设计完全正确的硬件系统，在工作中未必就是可靠的。软件在运行时不会发生物理性质的变化，人
们常以为如果软件的某个功能是正确的，那么它一辈子都是正确的。可是我们无法对软件进行彻底地测试，无法根除软件中潜在的错误。平时软件运行得好好的，说
不准哪一天就不正常了，如&#8220;2000年&#8221;问题。因此把可靠性引入软件领域是有意义的。我曾买了一本关于软件可靠性的著作，此书充满了数学公式。我发现以我
目前的学历实在难以看懂书上讲了些什么。请宽恕我的愚昧，我把此书给&#8220;供&#8221;起来，没敢用笔画一处记号。</font></p>
<p><font face="Verdana"><strong>2 性能与效率</strong></font></p>
<p><font face="Verdana">用户都希望软件的运行速度高些（高性能），并且占用资源少些（高效率）。旧社会地主就是这么对待长工
的：干活要快点，吃得要少点。程序员可以通过优化算法、数据结构和代码组织来提高软件系统的性能与效率。优化的关键工作是找出限制性能与效率的&#8220;瓶颈&#8221;，
不要在无关痛痒的地方瞎忙乎。如果你想职称升得快，光靠增加课时能顶屁用；你就该一年写它几十篇文章，争取破格升教授。</font></p>
<p><font face="Verdana"><strong>3 易用性</strong></font></p>
<p><font face="Verdana">易用性是指用户感觉使用软件的难易程度。用户可能是操作软件的最终用户，也可能是那些要使用源代码的程序员。现代人的生活节奏快，干啥事都想图个方便。所以把易用性作为重要的质量因素无可非议。<br><br>导
致软件易用性差的根本原因是开发人员犯了&#8220;错位&#8221;的毛病：他以为只要自己用起来方便，用户也一定会满意。俗话说&#8220;王婆卖瓜，自卖自夸&#8221;。当程序员向用户展
示软件时，常会得意地讲：&#8220;这个软件非常好用，我操作给你看，&#8230;&#8230;是很好用吧！&#8221;软件的易用性要让用户来评价。当用户真的感到软件很好用时，一股温暖的感
觉油然而生，于是就用&#8220;友好&#8221;来评价易用性。</font></p>
<font face="Verdana">
</font>
<p><font face="Verdana"><br><strong>4 可理解性与简洁性</strong></font></p>
<p><font face="Verdana">可理解性表达了人们一种质朴的愿望：我化钱买了它，总得让我明白它是什么东西。我小时候的一个伙伴在读中学时，就因无法理解电荷之分正负，觉得很烦恼，便早早地缀学当工人。<br>可
理解性也是对用户而言的。开发人员只有在自己思路清晰时才可能写出让别人能理解的程序。编程时还要注意不可滥用技巧，应该用自然的方式编程。我们的确不知
道自己的得意之举究竟是锦上添花，还是画蛇添足。就象蒸出一笼馒头，在上面插一朵鲜花，本想弄点诗情画意，却让人误以为那是一堆热气腾腾的牛粪。</font></p>
<p><font face="Verdana">简洁是一种美，不管是自己还是用户都会有同感。在生活中，与简洁对立的是&#8220;罗里罗嗦&#8221;。中国小说中最&#8220;
婆婆妈妈&#8221;的男人是唐僧。有一项民意调查：如果世上只有唐僧、孙悟空、猪八戒和沙僧这四类男人，你要嫁给哪一类？请列出优先级。调查结果表明，现代女性毫
不例外地把唐僧摆在老末。一个原始的应用问题可能很复杂，但高水平的人就能够把软件系统设计得很简洁。如果软件系统臃肿不堪，它迟早会出问题。简洁是人们
对工作&#8220;精益求精&#8221;的结果。</font></p>
<p><font face="Verdana">废话大师有句名言：&#8220;如果我令你过于轻松地明白了，那你一定是误解了我说的话。&#8221;我最近有一种奇怪的体
会：如果把学术文章写得很简洁，让人很容易理解，它往往中不了；只有加上一些玄乎的东西，把本来简单的弄成复杂的，才会增加投稿的命中率。事实上，我可以
在5分钟之内说清楚三年来读博所做的工作，根本用不着写100多页的博士论文。我是在临近毕业时，才发觉自己完全不适合读博士学位。将来工作后，我一定要
好好编程，重新做人。</font></p>
<p><font face="Verdana"><br><strong>5 可复用性与可扩充性</strong></font></p>
<p><font face="Verdana">复用的一种方式是原封不动地使用现成的软构件，另一种方式是对现成的软构件进行必要的扩充后再使用。可复用性好的程序一般也具有良好的可扩充性。</font></p><img src ="http://www.cppblog.com/zmllegtui/aggbug/112057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-09 13:31 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/09/112057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的bat命令和用法</title><link>http://www.cppblog.com/zmllegtui/archive/2010/04/08/111934.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Thu, 08 Apr 2010 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2010/04/08/111934.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/111934.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2010/04/08/111934.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/111934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/111934.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #00ff00"><strong style="FONT-SIZE: 18pt">Part One:</strong></span><br><br>echo、@、call、pause、rem 是批处理文件最常用的几个命令，我们就从他们开始学起。 <br><br>echo 表示显示此命令后的字符 <br>echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br>@ 与echo off相象，但它是加在其它命令行的最前面，表示运行时不显示命令行本身。 <br>call 调用另一条批处理文件（如果直接调用别的批处理文件 ，执行完那条文件后将无法执行当前文件后续命令） <br>pause 运行此句会暂停，显示Press any key to continue... 等待用户按任意键后继续 <br>rem 表示此命令后的字符为解释行，不执行，只是给自己今后查找用的（::符号具有同样效果）<br><br>例：将根目录中所有文件写入a.txt中，启动UCDOS，进入WPS等功能。 <br>批处理文件的内容为: 文件表示： <br>echo off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不显示命令行 <br>dir c:\*.* &gt;a.txt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将c盘文件列表写入a.txt <br>call c:\ucdos\ucdos.bat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用ucdos <br>echo 你好&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显示"你好" <br>pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 暂停,等待按键继续 <br>rem 使用wps&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注释将使用wps <br>cd ucdos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进入ucdos目录 <br>wps&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用wps <br><br>批处理文件中还可以像C语言一样使用参数，这只需用到一个参数表示符%。 <br>%表示参数，参数是指在运行批处理文件时在文件名后加的字符串。变量可以从 %0到%9，%0表示文件名本身，字符串用%1到%9顺序表示。 <br>例如，c: 根目录下一批处理文件名为f.bat，内容为 format %1 <br>则如果执行c:\&gt;f a: 则实际执行的是format a: <br>又如c: 根目录下一批处理文件的名为t.bat，内容为 type %1 type %2 <br>那么运行c:\&gt;t a.txt b.txt 将顺序地显示a.txt和b.txt文件的内容 <br><br>if goto choice for 是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br><br>if 表示将判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br>1、if [not] "参数" == "字符串" 待执行的命令 <br>参数如果等于指定的字符串，则条件成立，运行命令，否则运行下一句。(注意是两个等号） <br>如if "%1"=="a" format a: <br>2、if exist 文件名 待执行的命令 <br>如果有指定的文件，则条件成立，运行命令，否则运行下一句。如if exist config.sys edit config.sys <br>3、if errorlevel 数字 待执行的命令 <br>如果返回码等于指定的数字，则条件成立，运行命令，否则运行下一句。如if errorlevel 2 goto x2 DOS程序运行时都会返回一个数字给DOS，称为错误码errorlevel或称返回码 <br><br>goto 批处理文件运行到这里将跳到goto 所指定的标号处， 一般与if配合使用。 <br>如: <br>goto end <br>:end <br>echo this is the end <br>标号用 :字符串 表示，标号所在行不被执行 <br><br>choice 使用此命令可以让用户输入一个字符，从而运行不同的命令。使用时应该加/c:参数，c:后应写提示可输入的字符，之间无空格。它的返回码为1234&#8230;&#8230; <br>如: choice /c:dme /m:"defrag,mem,end" <br>将显示 <br>defrag,mem,end[D,M,E]? <br>例如，test.bat的内容如下: <br>@echo off <br>choice /c:dme /m:"defrag,mem,end" <br>if errorlevel 3 goto&nbsp;end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;==应先判断数值最高的错误码 <br>if errorlevel 2 goto mem <br>if errotlevel 1 goto&nbsp;defrag <br>:defrag <br>c:\dos\defrag <br>goto end <br>:mem <br>mem <br>goto end <br>:end <br>echo good bye <br>此文件运行后，将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ，然后if语句将作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，文件结束。 <br><br>for 循环命令，只要条件符合，它将多次执行同一命令。 <br>格式FOR [%%f] in (集合) DO [命令] <br>只要参数f在指定的集合内，则条件成立，执行命令 <br>如果一条批处理文件中有一行: <br>for %%c in (*.bat *.txt) do type %%c <br>含义是如果是以bat或txt结尾的文件，则显示文件的内容。 <br><br>autoexec.bat:<br>DOS在启动会自动运行autoexec.bat这条文件，一般我们在里面装载每次必用的程序，如: path(设置路径)、smartdrv(磁盘加速)、 mouse(鼠标启动)、mscdex(光驱连接)、 doskey(键盘管理)、set(设置环境变量)等。 <br>如果启动盘根目录中没有这个文件，电脑会让用户输入日期和时间。 <br>例如，一个典型的autoexec.bat内容如下: <br>@echo off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不显示命令行 <br>prompt $p$g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置提示符前有目录提示 <br>path c:\dos;c:\;c:\windows;c:\ucdos;c:\tools&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置路径 <br>lh c:\dos\doskey.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载键盘管理 <br>lh c:\mouse\mouse.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载鼠标管理 <br>lh c:\dos\smartdrv.exe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载磁盘加速管理 <br>lh c:\dos\mscdex /S /D:MSCD000 /M:12 /V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载CD-ROM驱动 <br>set temp=c:\temp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置临时目录&nbsp;<br><br><span style="FONT-SIZE: 18pt; COLOR: #00ff00"><strong>Part Two:</strong></span>&nbsp;<br><br>if 命令详解：</p>
<p>详细出处参考：<a href="http://www.jb51.net/article/14986.htm"><u><font style="COLOR: #ffffff" color=#800080>http://www.jb51.net/article/14986.htm</font></u></a></p>
<p>主要用来判断：<br>1、两个&#8220;字符串&#8221;是否相等；<br>2、两个数值是大于、小于、等于,然后执行相应的命令。 <br>当然还有特殊用法，如结合errorlevel：if errorlevel 1 echo error <br>或者结合defined（定义的意思）:if defined test (echo It is defined) else echo It isn't defined <br>用法示例： <br><br>1、检测字符串(注意，用if检测字符串是否相等的时候，后面用的不是&#8220;=&#8221;，而是&#8220;==&#8221;)： </p>
<p>@echo off <br>set "str=this is a test" <br>REM 检测变量%str%是否等于test，如果相等，显示OK，否则显示NO <br>if "%str%"=="test" (echo OK) else echo NO <br>pause&gt;nul </p>
<p>2、检测数值：（注意，批处理中大于符号不能用：&#8220;&gt;&#8221;,而用"gtr"，其它的也类似） <br>比较运算符一览：&nbsp;<br>equ - 等于&nbsp;<br>neq - 不等于&nbsp;<br>lss - 小于&nbsp;<br>leq - 小于或等于&nbsp;<br>gtr - 大于&nbsp;<br>geq - 大于或等于&nbsp;<br><br>@echo off <br>set /a num1=20 <br>set /a num2=15 <br>if %num1% gtr %num2% echo %num1%大于%num2% <br>if %num1% EQU %num2% echo %num1%等于%num2% <br>if %num1% LSS %num2% echo %num1%小于%num2% <br>pause&gt;nul </p>
<p>3、if结合errorlevel使用： <br>说明：环境变量errorlevel的初始值为0，当一些命令执行不成功，就会返回一个数值，如：1 ，2 等 <br>IF-ERRORLEVEL <br>测试代码： </p>
<p>@ECHO OFF <br>XCOPY F:\test.bat D:\ <br>IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br>IF ERRORLEVEL 0 ECHO 成功拷贝文件 </p>
<p>如果文件拷贝成功，屏幕就会显示&#8220;成功拷贝文件&#8221;，否则就会显示&#8220;文件拷贝失败&#8221;。 <br>IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。 <br>因此下面的批处理文件是错误的： <br>@ECHO OFF <br>XCOPY C:\AUTOEXEC.BAT D:\ <br>IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br>IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br>IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br>IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br>IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br>无论拷贝是否成功，后面的： <br>未找到拷贝文件 <br>用户通过ctrl-c中止拷贝操作 <br>预置错误阻止文件拷贝操作 <br>拷贝过程中写盘错误 <br>都将显示出来。 </p>
<p>附录： <br>以下就是几个常用命令的返回值及其代表的意义： <br>backup <br>0 备份成功 <br>1 未找到备份文件 <br>2 文件共享冲突阻止备份完成 <br>3 用户用ctrl-c中止备份 <br>4 由于致命的错误使备份操作中止 <br>diskcomp <br>0 盘比较相同 <br>1 盘比较不同 <br>2 用户通过ctrl-c中止比较操作 <br>3 由于致命的错误使比较操作中止 <br>4 预置错误中止比较 <br>diskcopy <br>0 盘拷贝操作成功 <br>1 非致命盘读/写错 <br>2 用户通过ctrl-c结束拷贝操作 <br>3 因致命的处理错误使盘拷贝中止 <br>4 预置错误阻止拷贝操作 <br>format <br>0 格式化成功 <br>3 用户通过ctrl-c中止格式化处理 <br>4 因致命的处理错误使格式化中止 <br>5 在提示&#8220;proceed with format（y/n）?&#8221;下用户键入n结束 <br>xcopy <br>0 成功拷贝文件 <br>1 未找到拷贝文件 <br>2 用户通过ctrl-c中止拷贝操作 <br>4 预置错误阻止文件拷贝操作 <br>5 拷贝过程中写盘错误 </p>
<p>4、if还有一个特殊的用法就是可以用来检测某个变量是否已经被定义 <br>用法示例： </p>
<p>@echo off <br>set "str1=ok" <br>set "str2=no" <br>if defined str1 echo str1已经被定义 <br>if defined str2 echo str2已经被定义 <br>if defined str3 (echo str3已经被定义) else echo str3 没有被定义 <br>pause&gt;nul</p>
<img src ="http://www.cppblog.com/zmllegtui/aggbug/111934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2010-04-08 11:10 <a href="http://www.cppblog.com/zmllegtui/archive/2010/04/08/111934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Void and void pointer</title><link>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101630.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 22 Nov 2009 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101630.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/101630.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101630.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/101630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/101630.html</trackback:ping><description><![CDATA[<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.概述<br><br></strong>　　许多初学者对C/C++语言中的void及void指针类型不甚理解，因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说，并详述void及void指针类型的使用方法与技巧。<br><br>　　<strong>2.void的含义</strong><br><br>　　void的字面意思是&#8220;无类型&#8221;，void *则为&#8220;无类型指针&#8221;，void *可以指向任何类型的数据。<br><br>　　void几乎只有&#8220;注释&#8221;和限制程序的作用，因为从来没有人会定义一个void变量，让我们试着来定义： <br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void a;</td>
        </tr>
    </tbody>
</table>
<br>　　这行语句编译时会出错，提示&#8220;illegal use of type 'void'&#8221;。不过，即使void a的编译不会出错，它也没有任何实际意义。<br><br>　　void真正发挥的作用在于：<br><br>　　（1）对函数返回的限定；<br><br>　　（2）对函数参数的限定。<br><br>　　我们将在第三节对以上二点进行具体说明。<br><br>　　众所周知，如果指针p1和p2的类型相同，那么我们可以直接在p1和p2间互相赋值；如果p1和p2指向不同的数据类型，则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。 <br><br>　　例如：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>float *p1;<br>int *p2;<br>p1 = p2;</td>
        </tr>
    </tbody>
</table>
<br>　　其中p1 = p2语句会编译出错，提示&#8220;'=' : cannot convert from 'int *' to 'float *'&#8221;，必须改为：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>p1 = (float *)p2;</td>
        </tr>
    </tbody>
</table>
<br>　　而void *则不同，任何类型的指针都可以直接赋值给它，无需进行强制类型转换： <br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void *p1;<br>int *p2;<br>p1 = p2;</td>
        </tr>
    </tbody>
</table>
<br>　　但这并不意味着，void *也可以无需强制类型转换地赋给其它类型的指针。因为&#8220;无类型&#8221;可以包容&#8220;有类型&#8221;，而&#8220;有类型&#8221;则不能包容&#8220;无类型&#8221;。道理很简单，我们可以说&#8220;男人和女人都是人&#8221;，但不能说&#8220;人是男人&#8221;或者&#8220;人是女人&#8221;。下面的语句编译出错：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void *p1;<br>int *p2;<br>p2 = p1;</td>
        </tr>
    </tbody>
</table>
<br>　　提示&#8220;'=' : cannot convert from 'void *' to 'int *'&#8221;。<br><br><strong>3.void的使用<br><br></strong>　　下面给出void关键字的使用规则：<br><br>　　<strong>规则一如果函数没有返回值，那么应声明为void类型</strong><br><br>　　在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>add ( int a, int b )<br>{<br>return a + b;<br>}<br>int main(int argc, char* argv[])<br>{<br>printf ( "2 + 3 = %d", add ( 2, 3) );<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　程序运行的结果为输出：<br><br>　　2 + 3 = 5<br><br>　　这说明不加返回值说明的函数的确为int函数。<br><br>　　林锐博士《高质量C/C++编程》中提到：&#8220;C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生&#8221;。可是编译器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确，所以不能寄希望于编译器会做严格的类型检查。<br><br>　　因此，为了避免混乱，我们在编写C/C++程序时，对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值，一定要声明为void类型。这既是程序良好可读性的需要，也是编程规范性的要求。另外，加上void类型声明后，也可以发挥代码的&#8220;自注释&#8221;作用。代码的&#8220;自注释&#8221;即代码能自己注释自己。<br><br>　　<strong>规则二如果函数无参数，那么应声明其参数为void</strong><br><br>　　在C++语言中声明一个这样的函数：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>int function(void)<br>{<br>return 1;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　则进行下面的调用是不合法的：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>function(2);</td>
        </tr>
    </tbody>
</table>
<br>　　因为在C++中，函数参数为void的意思是这个函数不接受任何参数。<br><br>　　我们在Turbo C 2.0中编译：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>#include "stdio.h"<br>fun()<br>{<br>return 1;<br>}<br>main()<br>{<br>printf("%d",fun(2));<br>getchar();<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　编译正确且输出1，这说明，在C语言中，可以给无参数的函数传送任意类型的参数，但是在C++编译器中编译同样的代码则会出错。在C++中，不能向无参数的函数传送任何参数，出错提示&#8220;'fun' : function does not take 1 parameters&#8221;。<br><br>　　所以，无论在C还是C++中，若函数不接受任何参数，一定要指明参数为void。<br><br>　　<strong>规则三小心使用void指针类型</strong><br><br>　　按照ANSI(American National Standards Institute)标准，不能对void指针进行算法操作，即下列操作都是不合法的：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void * pvoid;<br>pvoid++; //ANSI：错误<br>pvoid += 1; //ANSI：错误<br>//ANSI标准之所以这样认定，是因为它坚持：进行算法操作的指针必须是确定知道其指向数据类型大小的。<br>//例如：<br>int *pint;<br>pint++; //ANSI：正确</td>
        </tr>
    </tbody>
</table>
<br>　　pint++的结果是使其增大sizeof(int)。<br><br>　　但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定，它指定void *的算法操作与char *一致。<br><br>　　因此下列语句在GNU编译器中皆正确：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>pvoid++; //GNU：正确<br>pvoid += 1; //GNU：正确</td>
        </tr>
    </tbody>
</table>
<br>　　pvoid++的执行结果是其增大了1。<br><br>　　在实际的程序设计中，为迎合ANSI标准，并提高程序的可移植性，我们可以这样编写实现同样功能的代码：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void * pvoid;<br>(char *)pvoid++; //ANSI：正确；GNU：正确<br>(char *)pvoid += 1; //ANSI：错误；GNU：正确</td>
        </tr>
    </tbody>
</table>
<br>　　GNU和ANSI还有一些区别，总体而言，GNU较ANSI更&#8220;开放&#8221;，提供了对更多语法的支持。但是我们在真实设计时，还是应该尽可能地迎合ANSI标准。<br><br>　　<strong>规则四如果函数的参数可以是任意类型指针，那么应声明其参数为void *</strong><br><br>　　典型的如内存操作函数memcpy和memset的函数原型分别为：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void * memcpy(void *dest, const void *src, size_t len);<br>void * memset ( void * buffer, int c, size_t num );</td>
        </tr>
    </tbody>
</table>
<br>　　这样，任何类型的指针都可以传入memcpy和memset中，这也真实地体现了内存操作函数的意义，因为它操作的对象仅仅是一片内存，而不论这片内存是什么类型。如果memcpy和memset的参数类型不是void *，而是char *，那才叫真的奇怪了！这样的memcpy和memset明显不是一个&#8220;纯粹的，脱离低级趣味的&#8221;函数！<br><br>　　下面的代码执行正确：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>//示例：memset接受任意类型指针<br>int intarray[100];<br>memset ( intarray, 0, 100*sizeof(int) ); //将intarray清0 <br>//示例：memcpy接受任意类型指针<br>int intarray1[100], intarray2[100];<br>memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2拷贝给intarray1</td>
        </tr>
    </tbody>
</table>
<br>　　有趣的是，memcpy和memset函数返回的也是void *类型，标准库函数的编写者是多么地富有学问啊！<br><br>　　<strong>规则五 void不能代表一个真实的变量</strong><br><br>　　下面代码都企图让void代表一个真实的变量，因此都是错误的代码：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9 border=1>
    <tbody>
        <tr>
            <td>void a; //错误<br>function(void a); //错误</td>
        </tr>
    </tbody>
</table>
<br>　　void体现了一种抽象，这个世界上的变量都是&#8220;有类型&#8221;的，譬如一个人不是男人就是女人（还有人妖？）。<br><br>　　void的出现只是为了一种抽象的需要，如果你正确地理解了面向对象中&#8220;抽象基类&#8221;的概念，也很容易理解void数据类型。正如不能给抽象基类定义一个实例，我们也不能定义一个void（让我们类比的称void为&#8220;抽象数据类型&#8221;）变量。<br><br>　　<strong>4.总结</strong><br><br>　　小小的void蕴藏着很丰富的设计哲学，作为一名程序设计人员，对问题进行深一个层次的思考必然使我们受益匪浅<br>
<img src ="http://www.cppblog.com/zmllegtui/aggbug/101630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2009-11-22 16:14 <a href="http://www.cppblog.com/zmllegtui/archive/2009/11/22/101630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Type Attribute aligned</title><link>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101617.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 22 Nov 2009 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101617.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/101617.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2009/11/22/101617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/101617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/101617.html</trackback:ping><description><![CDATA[<h4>&nbsp;</h4>
<p>Type attribute <tt>aligned</tt> allows you to specify the alignment of a structure, class, union, or enumeration. The syntax and considerations for specifying alignment factor are the same as for variable attribute <tt>aligned</tt>. Like variable attribute <tt>aligned</tt>, type attribute <tt>aligned</tt> can only increase alignment. Type attribute <tt>packed</tt> is used to decrease alignment.
<p>If the attribute appears immediately after the class, struct, union, or enumeration token or immediately after the closing right curly brace, it applies to the type identifier. It can also be specified on a <strong>typedef</strong> declaration. In a variable declaration, such as
<pre>class A {} a;
</pre>
<p>the placement of the type attribute can be confusing.
<p>In the following definitions, the attribute applies to <tt>A</tt>:
<pre>struct __attribute__((__aligned__(8))) A {};
struct A {} __attribute__((__aligned__(8)))&nbsp;;
struct __attribute__((__aligned__(8))) A {} a;
struct A {} __attribute__((__aligned__(8))) a;
typedef struct __attribute__((__aligned__(8))) A {} a;
typedef struct A {} __attribute__((__aligned__(8))) a;
</pre>
<p>In the following definitions, the attribute applies to <tt>a</tt>:
<pre>__attribute__((__aligned__(8))) struct A {} a;
struct A {} const __attribute__((__aligned__(8))) a;
__attribute__((__aligned__(8))) typedef struct A {} a;
typedef __attribute__((__aligned__(8))) struct A {} a;
typedef struct A {} const __attribute__((__aligned__(8))) a;
typedef struct A {} a __attribute__((__aligned__(8)));
</pre>
<img src ="http://www.cppblog.com/zmllegtui/aggbug/101617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2009-11-22 14:28 <a href="http://www.cppblog.com/zmllegtui/archive/2009/11/22/101617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>