无论是批处理文件还是shell都是没有意义的,它们只是一种工具,并且是非常低级难懂的工具。

如果不会,那就保持不会就好了。不要花费太多时间在这些没意义的事情上。

批处理的没意义体现在:

  • 难以表达

    随便一门正经的语言就比批处理清晰简洁
  • 玄学

    许多命令设计的毫无道理,白白的占用大脑容量。参数太多了,命令太多了。就连看一遍也要花费很长时间。

批处理文件注释的四种形式

  1. :: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
  2. rem 注释内容(不能出现重定向符号和管道符号)
  3. %注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
  4. :标签 注释内容(可以用作标签下方段的执行内容)

变量

%CD% - 扩展到当前目录字符串。

%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

%CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。

%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

%HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。

set命令

控制台下输入help查看全部命令

set命令可以查看全部环境变量

help set可以查看set命令的详细信息

  • set \p

    /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入

    行之前,显示指定的 promptString。promptString 可以是空的。
  • set \a

    /A 命令行开关指定等号右边的字符串为被评估的数字表达式。

其它重要词汇

help if

help for

代码

只能打印奇数阶幻方

@echo off
:start
set /p n=Please input your odd integer:
set /a p=n%%2
if %p% equ 0 echo Input error! && goto start set /a i=%n%
set /a t=(%n%+1)/2
set /a a%t%_%n%=1,temp=1,m=n-1,p=n
:repeat
set /a p-=1
if %p% lss 0 goto array
for /l %%a in (1 1 %m%) do (
setlocal enabledelayedexpansion
if !t! gtr %n% set /a t=1
if !i! gtr %n% set /a i=1
set /a s=!t!+1,q=!i!+1
if !s! gtr %n% set /a s=1
if !q! gtr %n% set /a q=1
set /a a!s!_!q!=a!t!_!i!+1,t+=1,i+=1
set /a temp+=1
if !temp! equ %n% (
set /a temp=1,tmp=a!s!_!q!,q-=1,i-=1
if !q! equ 0 set /a q=n
set /a a!s!_!q!=tmp+1
goto repeat
)
)
pause
:array
echo Now behold the powerful Magic Sqaure^^!:
set /a a!t!_!n!=1
for /l %%c in (!n! -1 1) do (
for /l %%d in (1 1 !n!) do (
set /a result=a%%d_%%c
set /p=!result!<nul
)
echo.
)
pause>nul

代码详细解释如下

@echo off
关闭回显
:start
语句标号,用于语句跳转
set /p n=Please input your odd integer:
/p开关用于读入数据,读入之前显示提示信息
set /a p=n%%2
/a开关用于表达式求值,因为%用来表示变量,所以%%表示一个%,即取模
if %p% equ 0 echo Input error! && goto start
如果p==0,说明输入值n为偶数,程序只能处理奇数情况,所以跳转到start,要求用户重新输入 set /a i=%n%
set /a t=(%n%+1)/2
set /a a%t%_%n%=1,temp=1,m=n-1,p=n
在第一行,正中间,填1
:repeat
set /a p-=1
if %p% lss 0 goto array
p用来记录填过多少个数字,p从n减到0
for /l %%a in (1 1 %m%) do (
变量a从1按步长为1递增至m=n-1
setlocal enabledelayedexpansion
if !t! gtr %n% set /a t=1
若t>n,则t=1
if !i! gtr %n% set /a i=1
若i>n,则i=1
a(t,i)处的数值
set /a s=!t!+1,q=!i!+1
if !s! gtr %n% set /a s=1
if !q! gtr %n% set /a q=1
a(s,q)处的数值,为a(t,i)的右下角
set /a a!s!_!q!=a!t!_!i!+1,t+=1,i+=1
令a(s,q)=a(t,i),同时向右下角走一格
set /a temp+=1
temp表示当前的一个小圈,也就是斜着填n个数字
if !temp! equ %n% (
如果temp=n说明已经走完一个圈了,应该向左下角走一格,如果左下角走出了边界,那就要走回来
set /a temp=1,tmp=a!s!_!q!,q-=1,i-=1
if !q! equ 0 set /a q=n
set /a a!s!_!q!=tmp+1
goto repeat
走完一圈之后开始下一圈
)
)
pause
:array
运行结束,下面打印结果
echo Now behold the powerful Magic Sqaure^^!:
set /a a!t!_!n!=1
for /l %%c in (!n! -1 1) do (
第一重for循环从n递减到1
for /l %%d in (1 1 !n!) do (
第二重for循环从1递增到n
set /a result=a%%d_%%c
set /p=!result!<nul
nul为null文件,因为set /p命令可以输出prompt用于提示用户输入,这里使用nul文件输入空,所以跳过了用户输入过程,只进行提示,也就相当于输出语句
)
echo.
输出一个换行
)
pause>nul

windows批处理文件打印幻方的更多相关文章

  1. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  2. SQL Server数据库备份:通过Windows批处理命令执行

    通过Windows批处理命令执行SQL Server数据库备份 建立mybackup.bat ,输入以下内容直接运行该脚本,即可开始自动备份数据库也可把该脚本加入windows任务计划里执行. --- ...

  3. cmd下windows批处理,获取当前系统时间,生成日志文件名

    示例: rdGetRTData_log%date:~0,4%%date:~5,2%%date:~8,2%.txt 生成格式: rdGetRTData_log20151103.txt 编写Windows ...

  4. WINDOWS批处理命令使用大全

    来源:http://www.942dn.com就是爱电脑网 WINDOWS批处理命令使用大全 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母.它的构成没有固定格式, ...

  5. 常用的Windows批处理

      切换执行路径 如果不换盘的话:cd xxx换盘:cd /d xxx   获取当前日期 编写Windows批处理时经常会需要使用到日期和时间作为文件名,所以是非常重要的. 如何获取日期呢?格式:  ...

  6. windows批处理研究_不断更新

    windows批处理脚本(bat),很麻烦,主要原因有: 1.bat脚本编写的风格,太古老,调用方式太奇怪. 2.windows自身运行机制就对批处理脚本有兼容性问题.比如,鼠标双击打开一个bat,与 ...

  7. Windows批处理命令学习中遇到的坑--持续更新中

    再次拾起windows批处理命令,下边将一些遇到的小问题写出来,希望可以帮到大家 1.set命令:set主要的作用是为变量赋值,类似于编程语言中的var i = Value:但是在使用的过程中一定要注 ...

  8. [转帖]Windows批处理(cmd/bat)常用命令小结

    Windows批处理(cmd/bat)常用命令小结 非常值得学习的文档 先放这里 有时间做实验, 转载自:“趣IT”微信公共号 前言 批处理文件(batch file)包含一系列 DOS命令,通常用于 ...

  9. Windows 批处理大全(附各种实例)

    Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...

随机推荐

  1. 实现Hadoop的Writable接口Implementing Writable interface of Hadoop

    As we saw in the previous posts, Hadoop makes an heavy use of network transmissions for executing it ...

  2. graphic rendering pipeline

    整理下管线 此时一定要有这张图 注意表中的数据流向 强调几个细节 之前对次序理解有点乱 rasterizer之前 管线里是只有逐顶点信息的 IA里面会setup primitive  通过Primit ...

  3. js常用的事件对象

    事件源对象  event.srcElement.tagName  event.srcElement.type 捕获释放  event.srcElement.setCapture();   event. ...

  4. 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。

    SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...

  5. Android4.2.2 Gallery2源码分析(4)——GLCanvas.java

    首先申明,找到这个类是在GLRootView.java中发现的线索.这是一个接口,源码中对该接口作了详细的说明: // // GLCanvas gives a convenient interface ...

  6. 使用 Shell 脚本自动化 Linux 系统维护任务

    如果一个系统管理员花费大量的时间解决问题以及做重复的工作,你就应该怀疑他这么做是否正确.一个高效的系统管理员应该制定一个计划使得其尽量花费少的时间去做重复的工作.因此尽管看起来他没有做很多的工作,但那 ...

  7. kindle 电子书去除DRM

    DRM,Digital Rights Management,数字版权管理. amazon购买的图书会下发到你的kindle设备.电子书格式通常为.azw3.里面包括了DRM,仅仅能在你的设备上使用. ...

  8. [Javascipt] Immediately-Invoker 2

    Now the people at Poplar Puzzles would like you to treat an array of functions like a Queue, passing ...

  9. (笔试题)删除K位数字

    题目: 现有一个 n 位数,你需要删除其中的 k 位,请问如何删除才能使得剩下的数最大? 比如当数为 2319274, k=1 时,删去 2 变成 319274 后是可能的最大值. 思路: 1.贪心算 ...

  10. c语言 多重排序

    经过了两天,终于会了. #include<stdio.h> #include<string.h> struct A { char name[100]; int gread; } ...