精华内容
下载资源
问答
  • genesis2000脚本编写详细教材,最详细的GENESIS脚本制作教程。 genesis2000脚本编写详细教材,最详细的GENESIS脚本制作教程。
  • LR 脚本编写教程

    2019-04-06 11:48:50
    Loadrunner 脚本编写教程, 提供大家学习.
  • SecureCRT脚本编写方法

    2018-03-05 11:16:25
    SecureCRT脚本编写方法,如何通过SecureCRT脚本编写脚本应用,简化手动操作流程
  • Linux shell脚本编写基础
  • kubernetes的脚本编写方式:kubernetes的脚本编写方式
  • This manual starts with an introduction to the CANape scripting language where all associated concepts are explained in detail and distinguished from one another.
  • 文档涵盖了secureCRT脚本编写说明和例程,新手必备,包含:常用函数,自动化脚本编写,多会话操作等,均包含实例。
  • Shell脚本编写实战

    2021-06-09 11:57:26
    根据实际的案例讲解怎么编写Shell脚本,在什么场景下编写为讲解导向。课程内容如下:1.编写Shell脚本注意事项与编写打印字体颜色函数2.批量创建用户3.监控主机存活状态4.监控CPU、内存、硬盘和网卡流量利用率5.监控...
  • 主要介绍了linux shell(.sh)脚本编写和运行入门,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • genesis2000脚本编写3(LineCommand)
  • 很全面详细的讲解了systemtap脚本编写基础语法,很好的入门文档
  • SPSS Modeler的脚本指南
  • 简易AVS脚本编写工具

    2015-08-30 18:07:14
    AVS脚本简易编写工具!可以快速编写出可视化的AVS脚本。具有简单的用途。
  • windows 下 上传,下载 工具,psftp工具bat脚本编写使用
  • python脚本编写

    万次阅读 多人点赞 2019-03-29 22:37:20
    什么是脚本 Python 是一种“脚本语言”。脚本,对应的英文是:script。一般人看到script这个英文单词,或许想到的更多的是:电影的剧本,就是一段段的脚本,所组成的。电影剧本的脚本,决定了电影中的人和物,都做...

     

    什么是脚本

    Python 是一种“脚本语言”。脚本,对应的英文是:script。一般人看到script这个英文单词,或许想到的更多的是:电影的剧本,就是一段段的脚本,所组成的。电影剧本的脚本,决定了电影中的人和物,都做哪些事情,怎么做。而计算机中的脚本,决定了:计算机中的操作系统和各种软件工具,要做哪些事情,以及具体怎么做。

    脚本 vs 程序

    你可能想要了解脚本与一般程序的区别是什么。

    脚本与一般程序的主要区别在于是否编译。相对于程序而言,脚本更加随性。写完了脚本,直接就可以在某种具有解释功能的环境中运行。(我们将会在本课学习如何写和运行 Python 脚本。)

    而非脚本语言(编译语言),比如 C、Java 语言。我们需要通过编译(Compile)和链接(link)等步骤,生成可执行文件。然后通过可执行文件在计算机上运行。

    脚本编写

    欢迎学习这节关于脚本编写的课程!你将学习:

    • Python 安装和环境设置
    • 运行和修改 Python 脚本
    • 与用户输入交互
    • 处理异常
    • 读写文件
    • 导入本地、标准和第三方模块
    • 在解释器中进行实验

    安装 Python 3

    我们将使用最新版 Python - Python 3。虽然 Python 2 在很多场合依然会用到,但是已经不再接受更新。为了与后续 Python 改进保持兼容,建议使用 Python 3。

    为了完成这一步骤,你需要使用命令行。我们将详细介绍所有细节部分,因此如果你从未使用过命令行,也没关系!如果你想深入了解命令行,请参阅我们的 Shell 讲习班,详细了解 Unix Shell。

    你的计算机上已经有 Python 吗?

    Mac OS X 和 Linux 通常已经自带了一个版本号比较老的 Python 2,请不要对该 Python 做出任何修改或者删除,因为操作系统的部分组件依赖它,修改或者删除它可能会影响到操作系统的某些功能。但是单独安装 Python 3,也不会对系统有任何影响。

    Windows 通常没有自带 Python,但是你可以在安装之前,先检查下系统是否安装了 Python。首先检查是否已经安装了 Python 3。

    打开终端或命令行。在 Windows 上,进入命令提示符窗口的方式是转到运行…(同时按下带有windows图标的win键+字母r),然后输入 cmd 并按下 Enter 键。

    在新的终端或命令提示符窗口中,输入 python --version 或者 python3 --version

    $ python --version
    

    然后按下 Enter 键。

    注意:这里的$符号在这里只是一个提示,表示命令行的开始,它会自动显示在屏幕上。这不是命令的一部分。

    系统可能会显示已安装的 Python 版本是 Python 2.7.9。在这种情况下,表明你已经安装了 Python 2,你需要按照下面几个部分中的步骤操作,更新到 Python 3。

    如果版本号以 3 开头,则表明你已经安装了 Python 3!请勿再次安装 Python!

    此外,你可能会看到错误消息。暂时不用管该错误,直接尝试下面几个部分中的步骤。

    方法 1:安装 Anaconda

    对于数据分析学员,强烈建议采用这种 Python 安装方式。

    如果你对数据科学方面的 Python 感兴趣,强烈建议安装 Anaconda,即使你已经在计算机上安装了 Python。如果你尚未设置计算机,请参阅我们的 Anaconda 和 Jupyter notebook 简短课程设置计算机。你将学习如何为这门课程设置环境,需要安装 Python 3.6、Jupyter Notebook、NumPy、pandas、Matplotlib 和 Seaborn。

    Anaconda 包含大量专门针对数据科学的库和软件分发版本,某些库和软件比较难安装。同时,你可以很轻松地在计算机上设置不同的环境,以便在不同版本的 Python 和软件包之间快速切换!例如,如果你正在处理的某个项目需要 Python 3.6 以及不同的依赖项,那么 Anaconda 的环境管理功能可以提供帮助。上面给出链接的 Anaconda 和 Jupyter notebook 免费课程讲授了如何处理这类情形。

    如果你的英语不是很熟练,你也可以在中文网站上搜索安装Anaconda的教程,比如这个知乎帖子

    方法 2:安装 Python

    对使用 Python 进行数据分析不感兴趣的学员建议采用此方法。

    如果你对学习面向数据科学的 Python 不感兴趣,并且你的计算机尚未安装 Python 3,那么现在该安装 Python 3 了!请转到 Python 下载页面并找到适用于你的操作系统、以 3 开头的最新版本(例如 Python 3.5.2)。

    对于 Windows 和 Mac,我们发现最简单的方法是直接从 Python 下载网站下载安装程序并运行。如果你使用的是 Linux,Python 下载页面提供了进行下载和编译的源代码。此外,你可以使用 APT 等安装工具安装 Python 3。

    如果你使用的是 Windows 设备,确保在安装过程中选中 Add Python 3.5 to PATH 或 Add Python to environment variables 选项,这样可以确保从命令行提示符窗口中访问 Python。

    如果你使用的是 Windows 设备,并且已经安装了 Python,但是未选中上述选项,则需要将 Python 添加到 PATH。这样的话,当你输入 python 时,可以告诉命令行运行 Python 3。如果你未选中上述选项,或者转到下一阶段时似乎不可行,请按照 Python 文档中的这些说明将 Python 添加到 PATH。

    完成安装程序中的所有步骤操作或编译了源代码后,则安装完毕,你可以在自己的计算机上使用 Python 3 了!

    运行 Python 脚本

    运行 Python 脚本!!

    1. 下载在本页面底部给出链接的文件 first_script.py(你可能需要右击它,并存储为文件),然后将该文件移到计算机上的相应目录下。如果你还没有为这门课程创建一个目录的话,可以乘机创建一个目录。
    2. 打开终端并使用 cd 命令转到包含所下载文件的目录。
    3. 现在你已经位于该文件所在的目录,可以运行该文件了,方法是输入 python first_script.py,然后按下 Enter 键。

    提示:文件下载后,_ 会变成- ,你可能需要改成python first-script.py

    如果你看到终端输出了以下消息,则表明你成功地运行了脚本:

    Congratulations on running this script!!
    

    辅助材料

     first_script.py

    编程环境设置

    配置 Python 编程环境

    你已经看到我的设置,现在花时间在你自己的计算机上熟悉下界面。 下面是一些我们推荐的文本编辑器,你可以尝试一个看看。

    对于 Mac:

    对于 Windows:

    对于 Linux:

    设置好屏幕,打开文本编辑器、终端/命令行,并在网络浏览器中打开优达学城课堂,以便与你的 Python 脚本交互。调整显示器选项,找到你觉得最舒适的显示效果,并看看能否找到 tab-to-four-spaces 选项 - 该选项对于 Python 缩进来说非常有用。

    修改 Python 脚本

    自己编写脚本

    在文本编辑器中打开全新的空文件,命名该文件并将其保存到放置 Python 课程文件的文件夹中。将以下代码放入该文件里。

    how_many_snakes = 1
    snake_string = """
    Welcome to Python3!
    
                 ____
                / . .\\
                \  ---<
                 \  /
       __________/ /
    -=:___________/
    
    <3, Juno
    """
    
    
    print(snake_string * how_many_snakes)

    在脚本中接受原始输入

    我们可以使用内置函数 input 获取用户的原始输入,该函数接受一个可选字符串参数,用于指定在要求用户输入时向用户显示的消息。

    name = input("Enter your name: ")
    print("Hello there, {}!".format(name.title()))
    

    这段代码提示用户输入姓名,然后在问候语中使用该输入。input 函数获取用户输入的任何内容并将其存储为字符串。如果你想将输入解析为字符串之外的其他类型,例如整数(如以下示例所示),需要用新的类型封装结果并从字符串转换为该类型。

    num = int(input("Enter an integer"))
    print("hello" * num)
    

    我们还可以使用内置函数 eval 将用户输入解析为 Python 表达式。该函数会将字符串评估为一行 Python 代码。

    result = eval(input("Enter an expression: "))
    print(result)
    

    如果用户输入 2 * 3,输出为 6

    练习:在脚本中接受原始输入

    练习:生成消息

    假设你是一名老师,需要向每位学生发一条消息,提醒他们未交的作业和分数是多少。你知道每名学生的姓名,没交的作业份数和分数,这些数据保存在了电子表格中,你只需将这些输入插入你想到的以下消息中即可:

    Hi [insert student name],

    This is a reminder that you have [insert number of missing assignments] assignments left to submit before you can graduate. Your current grade is [insert current grade] and can increase to [insert potential grade] if you submit all assignments before the due date.

    你可以将此消息复制粘贴后发送给每位学生,并且每次手动插入相应的值。但是你要写一个程序来帮助你完成这一流程。

    写一个完成以下操作的脚本:

    1. 请求用户输入三次。一次是名字列表,一次是未交作业数量列表,一次是分数列表。使用该输入创建 namesassignments 和 grades 列表。
    2. 使用循环为每个学生输出一条信息并包含正确的值。潜在分数是 2 乘以未交作业数加上当前分数。

    下面是在终端内成功运行该脚本的示例。

    错误和异常

    • 当 Python 无法解析代码时,就会发生语法错误,因为我们没有遵守正确的 Python 语法。当你出现拼写错误或第一次开始学习 Python 时,可能会遇到这些错误。

    • 当在程序执行期间出现意外情况时,就会发生异常,即使代码在语法上正确无误。Python 有不同类型的内置异常,你可以在错误消息中查看系统抛出了什么异常。

    Try 语句

    我们可以使用 try 语句处理异常。你可以使用 4 个子句(除了视频中显示的子句之外还有一个子句)。

    • try:这是 try 语句中的唯一必需子句。该块中的代码是 Python 在 try 语句中首先运行的代码。
    • except:如果 Python 在运行 try 块时遇到异常,它将跳到处理该异常的 except 块。
    • else:如果 Python 在运行 try 块时没有遇到异常,它将在运行 try 块后运行该块中的代码。
    • finally:在 Python 离开此 try 语句之前,在任何情形下它都将运行此 finally 块中的代码,即使要结束程序,例如:如果 Python 在运行 except 或 else 块中的代码时遇到错误,在停止程序之前,依然会执行此finally 块。

    为何在 Python 中需要 finally 子句?

    指定异常

    我们实际上可以指定要在 except 块中处理哪个错误,如下所示:

    try:
        # some code
    except ValueError:
        # some code
    

    现在它会捕获 ValueError 异常,但是不会捕获其他异常。如果我们希望该处理程序处理多种异常,我们可以在 except 后面添加异常元组。

    try:
        # some code
    except (ValueError, KeyboardInterrupt):
        # some code
    

    或者,如果我们希望根据异常执行不同的代码块,可以添加多个 except 块。

    try:
        # some code
    except ValueError:
        # some code
    except KeyboardInterrupt:
        # some code

    练习解决方案:处理除以零的情形

    def create_groups(items, num_groups):
        try:
            size = len(items) // num_groups
        except ZeroDivisionError:
            print("WARNING: Returning empty list. Please use a nonzero number.")
            return []
        else:
            groups = []
            for i in range(0, len(items), size):
                groups.append(items[i:i + size])
            return groups
        finally:
            print("{} groups returned.".format(num_groups))
    
    print("Creating 6 groups...")
    for group in create_groups(range(32), 6):
        print(list(group))
    
    print("\nCreating 0 groups...")
    for group in create_groups(range(32), 0):
        print(list(group))

    修改上面的脚本以处理除以零错误。正确修改的话,应该会输出:

    Creating 6 groups...
    6 groups returned.
    [0, 1, 2, 3, 4]
    [5, 6, 7, 8, 9]
    [10, 11, 12, 13, 14]
    [15, 16, 17, 18, 19]
    [20, 21, 22, 23, 24]
    [25, 26, 27, 28, 29]
    [30, 31]
    
    Creating 0 groups...
    WARNING: Returning empty list. Please use a nonzero number.
    0 groups returned.

    访问错误消息

    在处理异常时,依然可以如下所示地访问其错误消息:

    try:
        # some code
    except ZeroDivisionError as e:
       # some code
       print("ZeroDivisionError occurred: {}".format(e))
    

    应该会输出如下所示的结果:

    ZeroDivisionError occurred: division by zero
    

    因此依然可以访问错误消息,即使已经处理异常以防止程序崩溃!

    如果没有要处理的具体错误,依然可以如下所示地访问消息:

    try:
        # some code
    except Exception as e:
       # some code
       print("Exception occurred: {}".format(e))
    

    Exception 是所有内置异常的基础类。你可以在此处详细了解 Python 的异常。

    读写文件

    以下是如何在 Python 中读写文件的方式。

    读取文件

    f = open('my_path/my_file.txt', 'r')
    file_data = f.read()
    f.close()
    
    1. 首先使用内置函数 open 打开文件。需要文件路径字符串。open 函数会返回文件对象,它是一个 Python 对象,Python 通过该对象与文件本身交互。在此示例中,我们将此对象赋值给变量 f
    2. 你可以在 open 函数中指定可选参数。参数之一是打开文件时采用的模式。在此示例中,我们使用 r,即只读模式。这实际上是模式参数的默认值。
    3. 使用 read 访问文件对象的内容。该 read 方法会接受文件中包含的文本并放入字符串中。在此示例中,我们将该方法返回的字符串赋值给变量 file_data
    4. 当我们处理完文件后,使用 close 方法释放该文件占用的系统资源。

    写入文件

    f = open('my_path/my_file.txt', 'w')
    f.write("Hello there!")
    f.close()
    1. 以写入 ('w') 模式打开文件。如果文件不存在,Python 将为你创建一个文件。如果以写入模式打开现有文件,该文件中之前包含的所有内容将被删除。如果你打算向现有文件添加内容,但是不删除其中的内容,可以使用附加 ('a') 模式,而不是写入模式。
    2. 使用 write 方法向文件中添加文本。
    3. 操作完毕后,关闭文件。

    With

    Python 提供了一个特殊的语法,该语法会在你使用完文件后自动关闭该文件。

    with open('my_path/my_file.txt', 'r') as f:
        file_data = f.read()
    

    该 with 关键字使你能够打开文件,对文件执行操作,并在缩进代码(在此示例中是读取文件)执行之后自动关闭文件。现在,我们不需要调用 f.close() 了!你只能在此缩进块中访问文件对象 f。

    导入本地脚本

    我们实际上可以导入其他脚本中的 Python,如果你处理的是大型项目,需要将代码整理成多个文件并重复利用这些文件中的代码,则导入脚本很有用。如果你要导入的 Python 脚本与当前脚本位于同一个目录下,只需输入 import,然后是文件名,无需扩展名 .py。

    import useful_functions
    

    Import 语句写在 Python 脚本的顶部,每个导入语句各占一行。该 import 语句会创建一个模块对象,叫做 useful_functions。模块是包含定义和语句的 Python 文件。要访问导入模块中的对象,需要使用点记法。

    import useful_functions
    useful_functions.add_five([1, 2, 3, 4])
    

    我们可以为导入模块添加别名,以使用不同的名称引用它。

    import useful_functions as uf
    uf.add_five([1, 2, 3, 4])
    

    使用 if main 块

    为了避免运行从其他脚本中作为模块导入的脚本中的可执行语句,将这些行包含在 if __name__ == "__main__" 块中。或者,将它们包含在函数 main() 中并在 if main 块中调用该函数。

    每当我们运行此类脚本时,Python 实际上会为所有模块设置一个特殊的内置变量 __name__。当我们运行脚本时,Python 会将此模块识别为主程序,并将此模块的 __name__ 变量设为字符串 "__main__"。对于该脚本中导入的任何模块,这个内置 __name__ 变量会设为该模块的名称。因此,条件 if __name__ == "__main__"会检查该模块是否为主程序。 

    尝试一下!

    下面是我在上述视频中使用的代码。请在同一目录下创建这些脚本,并在终端里运行这些脚本!实验 if main 块并访问导入模块中的对象!

    # demo.py
    
    import useful_functions as uf
    
    scores = [88, 92, 79, 93, 85]
    
    mean = uf.mean(scores)
    curved = uf.add_five(scores)
    
    mean_c = uf.mean(curved)
    
    print("Scores:", scores)
    print("Original Mean:", mean, " New Mean:", mean_c)
    
    print(__name__)
    print(uf.__name__)
    
    # useful_functions.py
    
    def mean(num_list):
        return sum(num_list) / len(num_list)
    
    def add_five(num_list):
        return [n + 5 for n in num_list]
    
    def main():
        print("Testing mean function")
        n_list = [34, 44, 23, 46, 12, 24]
        correct_mean = 30.5
        assert(mean(n_list) == correct_mean)
    
        print("Testing add_five function")
        correct_list = [39, 49, 28, 51, 17, 29]
        assert(add_five(n_list) == correct_list)
    
        print("All tests passed!")
    
    if __name__ == '__main__':
        main()

    标准库

    你可以在 Python 一周模块博客中发现新的模块。

    我们的推荐模块

    Python 标准库包含大量模块!为了帮助你熟悉那些实用的模块,我们在下面筛选了一些我们推荐的 Python 标准库模块并解释为何我们喜欢使用它们! 

    • csv:对于读取 csv 文件来说非常便利 
    • collections:常见数据类型的实用扩展,包括 OrderedDictdefaultdict 和 namedtuple
    • random:生成假随机数字,随机打乱序列并选择随机项 
    • string:关于字符串的更多函数。此模块还包括实用的字母集合,例如 string.digits(包含所有字符都是有效数字的字符串)。 
    • re:通过正则表达式在字符串中进行模式匹配 
    • math:一些标准数学函数 
    • os:与操作系统交互 
    • os.pathos 的子模块,用于操纵路径名称 
    • sys:直接使用 Python 解释器 
    • json:适用于读写 json 文件(面向网络开发)

    希望你能用上这些模块!

    导入模块技巧

    还有一些在不同情形下很有用的其他形式的 import 语句。

    1. 要从模块中导入单个函数或类:
      from module_name import object_name
      
    2. 要从模块中导入多个单个对象:
      from module_name import first_object, second_object
      
    3. 要重命名模块:
      import module_name as new_name
      
    4. 要从模块中导入对象并重命名:
      from module_name import object_name as new_name
      
    5. 要从模块中单个地导入所有对象(请勿这么做):
      from module_name import *
      
    6. 如果你真的想使用模块中的所有对象,请使用标准导入 module_name 语句并使用点记法访问每个对象。
      import module_name

    模块、软件包和名称

    为了更好地管理代码,Standard 标准库中的模块被拆分成了子模块并包含在软件包中。软件包是一个包含子模块的模块。子模块使用普通的点记法指定。

    子模块的指定方式是软件包名称、点,然后是子模块名称。你可以如下所示地导入子模块。

    import package_name.submodule_name

    第三方库

    独立开发者编写了成千上万的第三方库!你可以使用 pip 安装这些库。pip 是在 Python 3 中包含的软件包管理器,它是标准 Python 软件包管理器,但并不是唯一的管理器。另一个热门的管理器是 Anaconda,该管理器专门针对数据科学。

    要使用 pip 安装软件包,在命令行中输入“pip install”,然后是软件包名称,如下所示:pip install package_name。该命令会下载并安装该软件包,以便导入你的程序中。安装完毕后,你可以使用从标准库中导入模块时用到的相同语法导入第三方软件包。

    使用 requirements.txt 文件

    大型 Python 程序可能依赖于十几个第三方软件包。为了更轻松地分享这些程序,程序员经常会在叫做 requirements.txt 的文件中列出项目的依赖项。下面是一个 requirements.txt 文件示例。

    beautifulsoup4==4.5.1
    bs4==0.0.1
    pytz==2016.7
    requests==2.11.1
    

    该文件的每行包含软件包名称和版本号。版本号是可选项,但是通常都会包含。不同版本的库之间可能变化不大,可能截然不同,因此有必要使用程序作者在写程序时用到的库版本。

    你可以使用 pip 一次性安装项目的所有依赖项,方法是在命令行中输入 pip install -r requirements.txt

    实用的第三方软件包

    能够安装并导入第三方库很有用,但是要成为优秀的程序员,还需要知道有哪些库可以使用。大家通常通过在线推荐或同事介绍了解实用的新库。如果你是一名 Python 编程新手,可能没有很多同事,因此为了帮助你了解入门信息,下面是优达学城工程师很喜欢使用的软件包列表。(可能部分网站在国内网络中无法打开)

    • IPython - 更好的交互式 Python 解释器 
    • requests - 提供易于使用的方法来发出网络请求。适用于访问网络 API。 
    • Flask - 一个小型框架,用于构建网络应用和 API。
    • Django - 一个功能更丰富的网络应用构建框架。Django 尤其适合设计复杂、内容丰富的网络应用。 
    • Beautiful Soup - 用于解析 HTML 并从中提取信息。适合网页数据抽取。 
    • pytest - 扩展了 Python 的内置断言,并且是最具单元性的模块。 
    • PyYAML - 用于读写 YAML 文件。 
    • NumPy - 用于使用 Python 进行科学计算的最基本软件包。它包含一个强大的 N 维数组对象和实用的线性代数功能等。 
    • pandas - 包含高性能、数据结构和数据分析工具的库。尤其是,pandas 提供 dataframe! 
    • matplotlib - 二维绘制库,会生成达到发布标准的高品质图片,并且采用各种硬拷贝格式和交互式环境。 
    • ggplot - 另一种二维绘制库,基于 R's ggplot2 库。
    • Pillow - Python 图片库可以向你的 Python 解释器添加图片处理功能。 
    • pyglet - 专门面向游戏开发的跨平台应用框架。 
    • Pygame - 用于编写游戏的一系列 Python 模块。 
    • pytz - Python 的世界时区定义。

    在解释器中进行实验

    通过在终端里输入 python 启动 python 交互式解释器。你可以接着输入内容,直接与 Python 交互。这是每次实验和尝试一段 Python 代码的很棒工具。只需输入 Python 代码,输出将出现在下一行。

    >>> type(5.23)
    <class 'float'>
    

    在解释器中,提示符窗口中最后一行的值将自动输出。如果有多行代码需要输出值,依然需要使用 print。

    如果你开始定义函数,你将在提示符窗口中看到变化,表示这是可以继续的行。在定义函数时,你需要自己添加缩进。

    >>> def cylinder_volume(height, radius):
    ...         pi = 3.14159
    ...         return height * pi * radius ** 2
    

    解释器的不足之处是修改代码比较麻烦。如果你在输入该函数时出现了拼写错误,或者忘记缩进函数的主体部分,无法使用鼠标将光标点到要点击的位置。需要使用箭头键在代码行中来回移动。有必要了解一些实用的快捷方式,例如移到一行的开头或结尾。

    注意,我可以引用我在解释器中之前定义的任何对象!

    >>> cylinder_volume(10, 3)
    282.7431
    

    一个实用技巧是在交互式提示符窗口中使用上下箭头键循环浏览最近的命令。这样可以重新运行或修改已经尝试的代码。

    要退出 Python 交互式解释器,使用命令 exit() 或在 mac/linux 上按下 ctrl+D,在 windows 上按下 ctrl+Z,然后按下 Enter 键。

    IPython

    实际上有一个代替默认 python 交互式解释器的强大解释器 IPython,它具有很多其他功能。

    • Tab 键补充完整
    • ?:关于对象的详细信息
    • !:执行系统 shell 命令
    • 语法突出显示

    你可以在此处查看更多其他功能!

    获取所需的信息

    要想成为熟练的程序员,需要掌握大量知识。需要了解库、记住语法以及其他细节。此外,让这一切更具挑战的是,技术在不断革新,因为新的技巧和工具会不断出现。

    对于编程新手来说,学习所有这些细节并及时获悉新的发展动态似乎是一项不可能完成的任务。的确是这样!具有多年经验的编程专业人士实际上并不是在脑中记下百科全书一样的知识,而是掌握了快速查找信息的技巧。

    如何搜索

    下面是高效网络搜索的一些技巧:

    • 在查询时,尝试使用 Python 或要使用的库的名称作为第一个字词。这样会告诉搜索引擎优先显示与你要使用的工具明确相关的结果。
    • 创建良好的搜索查询需要多次尝试。如果第一次尝试时没有找到有用的结果,再试一遍。 
    • 尝试使用在一开始搜索时发现的网页上发现的关键字,使搜索引擎在后续搜索中转到更好的资源。
    • 复制粘贴错误消息作为搜索字词。这样会出现错误解释性信息和潜在原因。错误消息可能包括你所写的特定行号引用。只在搜索中包含这些信息之前的错误消息部分。
    • 如果找不到问题答案,自己提出问题!StackOverflow 等社区有一些行为规则,如果你要加入该社区,必须了解这些规则,但是别因为这些规则而不愿意使用这些资源。

    在线资源的优先级

    虽然有很多关于编程的在线资源,但是并非所有资源都是同等水平的。下面的资源列表按照大致的可靠性顺序排序。

    1. Python 教程 - 这部分官方文档给出了 Python 的语法和标准库。它会举例讲解,并且采用的语言比主要文档的要浅显易懂。确保阅读该文档的 Python 3 版本!
    2. Python 语言和库参考资料 - 语言参考资料和库参考资料比教程更具技术性,但肯定是可靠的信息来源。当你越来越熟悉 Python 时,应该更频繁地使用这些资源。
    3. 第三方库文档 - 第三方库会在自己的网站上发布文档,通常发布于 https://readthedocs.org/ 。你可以根据文档质量判断第三方库的质量。如果开发者没有时间编写好的文档,很可能也没时间完善库。
    4. 非常专业的网站和博客 - 前面的资源都是主要资源,他们是编写相应代码的同一作者编写的文档。主要资源是最可靠的资源。次要资源也是非常宝贵的资源。次要资源比较麻烦的是需要判断资源的可信度。Doug Hellmann 等作者和 Eli Bendersky 等开发者的网站很棒。不出名作者的博客可能很棒,也可能很糟糕。
    5. StackOverflow - 这个问答网站有很多用户访问,因此很有可能有人之前提过相关的问题,并且有人回答了!但是,答案是大家自愿提供的,质量参差不齐。在将解决方案应用到你的程序中之前,始终先理解解决方案。如果答案只有一行,没有解释,则值得怀疑。你可以在此网站上查找关于你的问题的更多信息,或发现替代性搜索字词。
    6. Bug 跟踪器 - 有时候,你可能会遇到非常罕见的问题或者非常新的问题,没有人在 StackOverflow 上提过。例如,你可能会在 GitHub 上的 bug 报告中找到关于你的错误的信息。这些 bug 报告很有用,但是你可能需要自己开展一些工程方面的研究,才能解决问题。
    7. 随机网络论坛 - 有时候,搜索结果可能会生成一些自 2004 年左右就不再活跃的论坛。如果这些资源是唯一解决你的问题的资源,那么你应该重新思考下寻找解决方案的方式。
    展开全文
  • windows bat 批处理脚本编写指南

    千次阅读 多人点赞 2020-02-01 20:20:45
    本文由浅入深,比较系统地讲解了windows bat 批处理脚本编写指南,包括:windows bat批处理脚本概述,变量使用, 程序返回码及errorlevel使用,stdin、stdout、stderr,if判断与&、&&、||, for循环使用,函数goto...

      windows bat批处理脚本由于低成本、高效益,从某种角度上说更像是一门艺术,人们用其可以以更简单的方式完成复杂的任务。遗憾的是,随着c、java、python、golang、javascript等高级语言的蓬勃发展,选择使用传统脚本方式解决问题的人员越来越少,甚至很多类脚本任务也通过perl或python等高级语言变通实现。
      纵然脚本编程已是“老古董”,但不可否认它仍是运维人员解决问题的首要工具。因此对于运维人员来说,脚本编程仍是“酒中茅台”,简单、高效。同理,对于监控来说,脚本也是不二选择,得益于脚本与操作系统的浑然天成,意味着脚本只要写完即可工作,无需依赖任何运行环境。
      之所以写本文的一个原因就是笔者最近在用zabbix进行应用监控时(监控指定进程的存活性、内存占用大小、CPU利用率等),发现zabbix自带功能不能实现,需要自行实现,考虑过用python、golang等实现,后来考虑到python、golang等需要zabbix agent机器安装相应运行环境,实施成本较高,最终选择使用脚本编程实现。由于linux shell脚本编程,教程相对较多、功能相对强大、实现也相对容易;而windows bat批处理编程不仅教程少、不好上手,实现起来相对麻烦。因此整理本文,希望能给广大windows bat脚本攻城狮一点点帮助。

    1、也来个“Hello World”

    我们学java、python等高级语言,恐怕第一个DEMO都是输出“Hello World”字符串,学习bat批处理脚本,不妨也来个“Hello World”。

    1) helloworld.bat

    可以用任何文本编辑器,当然使用editplus、notepad等编辑器效率会更高,输入下述代码并保存为D:\cmdtest\helloworld.bat。

    @echo off
    rem This is a "Hello World" program.
    echo Hello World!
    echo=
    

    打开cmd命令窗口,切换到D:\cmdtest目录,运行helloworld 或 helloworld.bat

    D:\cmdtest>helloworld
    Hello World!
    
    
    2) 代码简要说明
    • @echo off,关闭之后所有命令的回显,不然bat文件中每条指令会在cmd命令窗口显示
    • rem,注释,还有::也表示注释,两者区别,大家请小度
    • echo,输出
    • echo=,输出空白行
    3) 工具说明

    为了提高bat批处理脚本开发、测试效率,建议:

    • 安装powercmd替代原cmd
    • 使用vscode,有良好的语法、关键字提示,并且自带terminal即cmd窗口

    2、变量

    1)变量声明

    变量无需声明可直接引用,其值为空字符串,并且大小写不敏感。可使用defined关键字或是否为空字符串""判断变量是否为空,如下所示:

    rem 将代码保存为bat文件执行
    @echo off
    rem set var2="var2"
    if not defined var2 ( 
        echo var2 is not defined, the value is: %var2%
    ) else ( 
        echo var2 is defined, the value is: %var2%
    )
    
    if "%var2%"=="" (
        echo var2 is not defined, the value is: %var2%
    ) else (
        echo var2 is defined, the value is: %var2%
    )
    

    说明:

    • 第一次会输出两遍var2 is not defined, the value is:
    • 先给变量赋值 set var2=“var2”,则会输出两遍 var2 is defined, the value is: “var2”
    • 如果变量set var2="var2"赋值过,然后将赋值set var2="var2"语句注释掉并运行,依然会输出 var2 is defined, the value is: “var2”,这是因为bat脚本变量不特殊处理的话是全局变量,只要脚本是在同一个cmd命令框运行便会存在,可通过 set var2= 清除
    2)变量赋值
    @echo off
    set var1=2+2
    set /a var2=2+2
    set /p var3=Please input a number:
    set /p md5=<file_info.md5
    echo var1: %var1%
    echo var2: %var2%
    echo var3: %var3%
    echo md5: %md5%
    
    D:\cmdtest>var
    Please input a number:100
    var1: 2+2
    var2: 4
    var3: 100
    md5: 76adfafs76776...
    

    说明:

    • 变量赋值时等号前后不能有空格,类似set a = 1会报错
    • /a 是表达式运算,仅适合32位整型运算,可以是负数
    • /p 是提示输入,将输入值赋值给变量
    • set /p md5=<file_info.md5, 读取md5文件内容并赋值给md5变量
    • 可通过set a=清空变量
    3)变量读取
    • 可通过%var%, 读取变量值
    • set var,列出var开头的所有变量
    • set,列出所有变量,如系统环境变量TEMP、PATH等也会列举出来
    • !var!,两个感叹号,延迟读取变量值,本文后面 “变量延迟” 部分会详细讲解
    • 需要了解的一些系统内置变量
      • %date%,系统日期,类似:2020/02/29 周六
      • %time%,获取系统时间,类似:17:13:15.18
      • %cd%,获取当前目录
      • %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字
      • %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
      • %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium
      • %PROCESSOR_IDENTFIER% 系统 返回处理器说明。
      • %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
      • %PROCESSOR_REVISION% 系统 返回处理器的版本号。
      • %COMPUTERNAME% 系统 返回计算机的名称。
      • %USERNAME% 本地 返回当前登录的用户的名称。
      • %USERPROFILE% 本地 返回当前用户的配置文件的位置。
      • %~dp0,bat脚本文件所在目录
    4)变量作用域

    默认为全局变量(Global),可使用setlocal命令将变量作用域设置为local,直到endlocal或exit命令,或bat文件执行结束,变量local作用域也结束并恢复到global作用域,看下述DEMO。
    var_scope.bat

    @echo off
    setlocal
    set v=Local Variable
    echo v=%v%
    

    cmd命令框

    D:\cmdtest>set v=Global Variable
    D:\cmdtest>var_scope
    v=Local Variable
    D:\cmdtest>echo v=%v%
    v=Global Variable
    D:\cmdtest>
    

    读者朋友们可以尝试将var_scope.bat文件中的setlocal命令注释掉,然后执行上述cmd命令框中的代码,我们将发现变量v最终输出的是“Local Variable”,即外面设置的变量v被bat文件中的变量v玷污了。

    5)变量延迟

    var_normal.bat

    @echo off
    set a=1
    set /a a+=1 > nul & echo %a%
    

    var_normal.bat运行后将输出1,而不是2,原因如下:

    当我们准备执行一条命令的时候,命令解释器会先将命令读取,如果命令中有环境变量,那么就会将变量的值先读取来出,然后在运行这条命令,如:echo %a%,当我们执行这条命令的时候,命令解释器会先读出%a%的值,即1,然后执行echo,所以输出1。

    然而,上述脚本本意是输出a+=1运算后的a值,即2。bat脚本提供了变量延迟,即变量在使用时再读取,上述代码修改如下:
    var_delay.bat

    @echo off
    setlocal EnableDelayedExpansion
    set a=1
    set /a a+=1 > nul & echo !a!
    

    var_delay.bat 运行后会输出2,有2个注意事项:

    • setlocal EnableDelayedExpansion 开启变量延迟,无需关注变量延迟如何关闭,有时为了代码简洁也写成:@echo off & setlocal EnableDelayedExpansion
    • !a!,两个叹号,变量才会延迟读取
    6)特殊变量

    上文已经提及很多内置变量或命令,此处的特殊变量指命令行参数,比如运行var_arg.bat arg1 arg2,带了2个参数arg1,arg2,那么如何表示脚本文件本身,参数1、参数2如何获取呢?
    var_arg.bat

    @echo off & setlocal
    echo arg0=%0
    echo arg1=%1
    echo arg1 no quotes=%~1
    echo batfile fullpath=%~f0
    echo batfile=%~n0
    echo batfolder=%~dp0
    
    D:\cmdtest>var_arg "marcus"
    arg0=var_arg
    arg1="marcus"
    arg1 no quotes=marcus
    batfile fullpath=D:\cmdtest\var_arg.bat
    batfile=var_arg
    batfolder=D:\cmdtest\
    

    说明:

    • %*,表示参数列表,比如:var_arg.bat arg1 arg2 arg3,则 %* = arg1 arg2 arg3
    • %0,表示脚本文件名,调用时var_arg则%0=var_arg,若调用时var_arg.bat则%0=var_arg.bat
    • %1,表示第一个参数
    • %~1,第一个参数去引号,如:var_arg.bat “arg1”,%~1得到arg1
    • %~f0,脚本文件完整路径名
    • %~dp0,脚本文件所在目录

    3、返回码和errorlevel

    1)返回码

    通常来说一条命令的执行结果返回的值只有两个,0 表示"成功",1 表示"失败",实际上,errorlevel 返回值可以是一个任何整型值,一般只定义在0~255之间。

    @echo off
    rem return code demo
    exit /b %1
    
    D:\cmdtest>returncode 0
    D:\cmdtest>echo %errorlevel%
    0
    D:\cmdtest>returncode 1
    D:\cmdtest>echo %errorlevel%
    1
    D:\cmdtest>returncode -1
    D:\cmdtest>echo %errorlevel%
    -1
    

    bat脚本文件中exit指定的code即返回码,就是下一行获取到的errorlevel值,从demo可以看出errorlevel甚至可以是负值。
    如果bat脚本文件中没有exit code命令,bat文件执行结束后,会不会有返回码?没有,有点类似void函数,因此errorlevel仍然是上次的-1。

    2)errorlevel如何使用

    通常来说,可以根据errorlevel是否等于0来判断脚本是否成功执行(0表示成功,>0值表示失败),若明确脚本返回码的情况下,也可以根据具体返回码值做具体处理,DEMO如下:假设执行脚本后,errorlevel=0,则

    D:\cmdtest>if errorlevel 1 (echo fail) else (echo success)
    success
    D:\cmdtest>if %errorlevel% EQU 0 (echo success) else (echo fail)
    success
    

    说明:

    • errorlevel 1,errorlevel >= 1
    • %errorlevel% EQU 0,errorlevel == 0
    • EQU 数字比较关系会在本文后面 “if判断” 部分详细讲解

    4、stdin, stdout, stderr

    stdin:标准输入,重定向时也用数字0表示
    stdout:标准输出,重定向时也用数字1表示
    stderr:错误输出,重定向时也用数字2表示

    1)重定向

    标准输出重定向

    dir > dir.txt		//dir文件、目录列表输出到dir.txt, dir.txt文件重新生成
    dir >> dir.txt		//dir文件、目录列表添加到dir.txt, dir.txt存在则添加,否则新建
    echo line1 > line.txt	//覆盖line.txt,内容为line1
    type con > line.txt	//响应键盘输入,直到按ctrl+z结束,输出到line.txt文件
    

    错误输出重定向

    d:\cmdtest\stdout>dir aaa 2>error.txt
    d:\cmdtest\stdout>type error.txt
    找不到文件
    

    标准、错误输出合并
    通常我们会将标准输出和错误输出合并到一个文件,如下所示:

    d:\cmdtest\stdout>DIR SomeFile.txt > output.txt 2>&1
    d:\cmdtest\stdout>type output.txt
     驱动器 D 中的卷是 软件
     卷的序列号是 65F3-3762
    
     d:\cmdtest\stdout 的目录
    
    找不到文件
    

    说明:遍历SomeFile.txt,先将遍历结果输出到output.txt,如果出错则将错误信息添加到
    output.txt(此处的“找不到文件”)。

    标准输入
    将某个文件作为内容输入,用 < 表示,如下所示:

    D:\cmdtest\stdout>sort < countries.txt
    America
    Australia
    China
    England
    
    D:\cmdtest\stdout>type countries.txt
    China
    America
    England
    Australia
    D:\cmdtest\stdout>
    

    将countries.txt文件中的内容进行排序显示。

    2)输出挂起、丢弃

    用NUL表示丢弃任何程序输出,2个经典应用:

    • 字符串查找,findstrex.bat
    @echo off & setlocal
    set str1=The most severe place of New SARS is Wuhan.
    set str2=%~1
    echo %str1% | findstr /i "%str2%" > nul && (echo "found") || (echo "not found")
    
    D:\cmdtest>findstrex.bat wuhan
    "found"
    
    • 程序暂停若干秒
    @echo off
    echo "program sleep 5 seconds, start..."
    ping /n 5 127.1>nul
    echo "program sleep 5 seconds, end..."
    exit /b 0
    

    先输出"program sleep 5 seconds, start…",5秒后再输出"program sleep 5 seconds, end…"

    3)管道符 | 使用

    管道符 | 通常用于一个命令的输出作为另一个命令的输入,如:

    DIR /B | SORT
    

    DIR /B,/B 使用空格式(没有标题信息或摘要)。
    DIR /B | SORT,将dir /b结果进行字符串排序

    5、if判断与&、&&、||

    顺序、选择和循环是编程语言的常见3种语句,bat脚本也是如此,bat脚本if选择语句语法如下:

    if 条件 (do...)
    if 条件 (do...) else (do ...)
    

    注意:

    • 条件只能是单个条件,不能用and或or进行条件与或运算,但是可以使用not 进行条件非运算
    • 没有elseif

    条件判断比较常见应用场景如下:

    1)文件是否存在,isexist.bat
    @echo off
    IF EXIST "temp.txt" (
        ECHO found
    ) ELSE (
        ECHO not found
    )
    
    2)变量是否定义
    IF "%var%"=="" (TODO)
    IF NOT DEFINED var (TODO)
    
    3)比较字符串是否相等,str.bat
    @echo off & setlocal
    set /p arg1="please input a string:"
    set /p arg2="please input another string:"
    if %arg1%==%arg2% (echo %arg1% equals %arg2%) else (echo %arg1% not equals %arg2%)
    if not %arg1%==%arg2% (echo %arg1% not equals %arg2%) else (echo %arg1% equals %arg2%)
    if %arg1% equ %arg2% (echo %arg1% equals %arg2%) else (echo %arg1% not equals %arg2%)
    if %arg1% neq %arg2% (echo %arg1% not equals %arg2%) else (echo %arg1% equals %arg2%)
    
    set /p name="please input your name: "
    if /i "%name%"=="marcus" ( echo You are Marcus! ) else ( echo You are not Marcus! )
    
    D:\cmdtest\lianxi>str
    please input a string:aa
    please input another string:aa
    aa equals aa
    aa equals aa
    aa equals aa
    aa equals aa
    please input your name: aaa
    You are not Marcus!
    

    说明:

    • 两个字符串变量是否相等,可以使用==,equ;不等则可以使用 not ==,neq
    • 字符串变量与常量比较,请带双引号,如:"%name%"==“marcus”
    • 带 /i,表示忽略大小写,类似java的equalsIgnoreCase
    4)数字比较
    @echo off & setlocal
    set num1=1
    set num2=2
    if %num1% EQU %num2% (echo %num1% == %num2%) else (echo echo %num1% != %num2%)
    
    EQU,等于
    NEQ,不等于
    LSS,小于
    LEQ,小于等于
    GTR,大于
    GEQ,大于或等于
    
    5)程序返回码处理

    本文前面部分已经提及程序返回码处理,简单demo如下:

    if errorlevel 1 (TODO)
    if %errorlevel% equ 0 (TODO)
    
    6)&、&&、||
    • &,顺序执行多条命令,而不管命令是否执行成功
      如:本文demo中经常出现的 @echo off & setlocal
    • &&,顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
    • ||,顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令),findstr命令时经常会使用&&和||符号,分别表示:找到执行…,没找到执行…
    set str="Apple,Huawei,Xiaomi,Oppo,Vivo"
    echo  %str% | findstr /i "asus" > nul && (FOUND,TOTO) || (NOTFOUND, TODO)
    

    6、循环

    bat脚本实现循环有2种方式:使用goto或for循环,简单demo如下:
    goto实现方式,1-10的循环:

    @echo off
    set var=0
    rem ************loop start.
    :continue
    set /a var+=1
    echo loop time: %var%
    if %var% lss 10 goto continue
    rem ************loop end.
    echo loop execution finished.
    

    for /L in (start, step, end) do ():

    @echo off
    set var=0
    rem ************loop start.
    for /L %%i in (1,1,10) do (echo loop time: %%i)
    rem ************loop end.
    echo loop execution finished.
    

    说明:

    • bat脚本,循环中并没有continue、break等中断,只能通过goto跳转跳出循环
    • 推荐使用for循环实现
    • for循环,bat文件中变量使用%%i,在cmd命令框则使用%i
    • 可以在cmd命令框中使用 for /? 查看for命令使用说明,如下:

    对一组文件中的每一个文件执行某个特定命令。
    FOR %variable IN (set) DO command [command-parameters]
    %variable 指定一个单一字母可替换的参数。
    (set) 指定一个或一组文件。可以使用通配符。
    command 指定对每个文件执行的命令。
    command-parameters
    为特定命令指定参数或命令行开关。
    在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable
    而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
    如果启用命令扩展,则会支持下列 FOR 命令的其他格式:
    FOR /D %variable IN (set) DO command [command-parameters]
    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。
    如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
    则枚举该目录树。
    FOR /L %variable IN (start,step,end) DO command [command-parameters]
    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
    1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
    FOR /F [“options”] %variable IN (file-set) DO command [command-parameters]
    FOR /F [“options”] %variable IN (“string”) DO command [command-parameters]
    FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]
    或者,如果有 usebackq 选项:
    FOR /F [“options”] %variable IN (file-set) DO command [command-parameters]
    FOR /F [“options”] %variable IN (“string”) DO command [command-parameters]
    FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]

    另外,FOR 变量参照的替换已被增强。您现在可以使用下列
    选项语法:
    %~I - 删除任何引号("),扩展 %I
    %~fI - 将 %I 扩展到一个完全合格的路径名
    %~dI - 仅将 %I 扩展到一个驱动器号
    %~pI - 仅将 %I 扩展到一个路径
    %~nI - 仅将 %I 扩展到一个文件名
    %~xI - 仅将 %I 扩展到一个文件扩展名
    %~sI - 扩展的路径只含有短名
    %~aI - 将 %I 扩展到文件的文件属性
    %~tI - 将 %I 扩展到文件的日期/时间
    %~zI - 将 %I 扩展到文件的大小
    %~ P A T H : I − 查 找 列 在 路 径 环 境 变 量 的 目 录 , 并 将 到 找 到 的 第 一 个 完 全 合 格 的 名 称 。 如 果 环 境 变 量 名 未 被 定 义 , 或 者 没 有 找 到 文 件 , 此 组 合 键 会 扩 展 到 空 字 符 串 可 以 组 合 修 饰 符 来 得 到 多 重 结 果 : PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串 可以组合修饰符来得到多重结果: %~dpI - 仅将 %I 扩展到一个驱动器号和路径 %~nxI - 仅将 %I 扩展到一个文件名和扩展名 %~fsI - 仅将 %I 扩展到一个带有短名的完整路径名 %~dp PATH:I:PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
    到找到的第一个驱动器号和路径。
    %~ftzaI - 将 %I 扩展到类似输出线路的 DIR
    在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
    用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
    比较易读,而且避免与不分大小写的组合键混淆。

    1)FOR %variable IN (set) DO command [command-parameters]

    下述代码请复制到bat文件执行

    @echo off
    rem 遍历字符串
    for %%i in (Hangzhou Ningbo Wenzhou Shaoxin) do echo %%i
    
    rem 遍历USERPROFILE下的文件
    FOR %%i IN (%USERPROFILE%\*) DO ECHO %%i
    
    2)/D /R参数

    代码请在cmd命令框中运行

    遍历目录
    语法:FOR /D %variable IN (set) DO command [command-parameters]
    rem 遍历文件目录
    FOR /D %I IN (%USERPROFILE%\*) DO @ECHO %I
    
    递归遍历
    语法:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    rem 递归遍历文件
    FOR /R "%TEMP%" %I IN (*) DO @ECHO %I
    rem 递归遍历文件目录
    FOR /R "%TEMP%" /D %I IN (*) DO @ECHO %I
    
    3)/L 参数

    下述代码请在cmd命令框中运行,@echo 表示关闭echo回显

    FOR /L %variable IN (start,step,end) DO command [command-parameters]
    该集表示以增量形式从开始到结束的一个数字序列。
    rem (1,1,5)将产生序列 1 2 3 4 5
    FOR /L %i in (1,1,5) do @echo %i
    
    rem (5,-1,1)将产生序列(5 4 3 2 1)
    FOR /L %i in (5,-1,1) do @echo %i
    
    4)/F 参数

    语法说明:

    FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
    FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
    FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
    
        fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前,
        每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,
        然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
        以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。
        您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个
        或多个指定不同解析选项的关键字。这些关键字为:
    
            eol=c           - 指一个行注释字符的结尾(就一个)
            skip=n          - 指在文件开始时忽略的行数。
            delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                              默认分隔符集。
            tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                              的 for 本身。这会导致额外变量名称的分配。m-n
                              格式为一个范围。通过 nth 符号指定 mth。如果
                              符号字符串中的最后一个字符星号,
                              那么额外的变量将在最后一个符号解析之后
                              分配并接受行的保留文本。
    

    下述代码请保存为bat文件执行

    @echo off
    rem 分割字符串
    for /f "delims=, tokens=1,2,*" %%j in ("Hangzhou,Ningbo,Wenzhou") do echo %%j,%%k,%%l
    
    rem 逐行读取文件
    for /f %%j in (d:\cmdtest\stdout\line.txt) do echo %%j
    
    rem 执行命令,并将执行结果逐行读取
    for /f %%j in ('wmic process get caption') do echo %%j
    

    delims,tokens,skip 选项说明

    • delims,分隔符,默认是空格,逐行读取文件时;若行内容中有空格,请指定delims,否则只读取空格前的单词
    • tokens,从第几列开始读取;tokens=2,* 表示第二列开始读取%%i,第三列开始赋值给%%j;tokens=2,3,* 表示第二列开始读取%%i,第三列赋值给%%j,第四列开始赋值给%%k
    • skip,跳过前几行

    7、函数或子程序实现

    bat脚本没有显性的function、sub等关键字,我们可以通过goto变相实现函数,局部代码重用。
    calc.bat

    @echo off & setlocal
    rem This is a simple calculator.
    rem usage: calc + 3 5, result is 3+5=8.
    
    set m=%~1
    set a=%~2
    set b=%~3
    set result=0
    if "%m%"=="+" goto add
    if "%m%"=="-" goto sub
    if "%m%"=="*" goto mul
    if "%m%"=="/" goto div
    echo "invalid arguments, usage: calc + 3 5, result is 3+5=8."
    goto :eof
    
    :add
    set /a result=a+b
    goto result
    
    :sub
    set /a result=a-b
    goto result
    
    :mul
    set /a result=a*b
    goto result
    
    :div
    set /a result=a/b
    goto result
    
    :result
    echo %a% %m% %b% = %result%
    
    D:\cmdtest\lianxi>calc s 1 2
    "invalid arguments, usage: calc + 3 5, result is 3+5=8."
    D:\cmdtest\lianxi>calc + 1 2
    1 + 2 = 3
    D:\cmdtest\lianxi>calc - 1 2
    1 - 2 = -1
    

    说明:

    8、后记

    至此,windows bat 批处理脚本编写指南告一段落,知识点包括:

    • 变量使用
    • 程序返回码及errorlevel使用
    • stdin, stdout, stderr
    • if判断与&、&&、||
    • 循环使用:goto实现、for循环
    • 函数使用

    基于上述知识点,基本上可以完成绝大多数bat批处理脚本。如要深究BAT脚本不妨参考下述博文:

    BAT脚本知识点深究:

    BAT脚本案例:

    展开全文
  • 行业分类-设备装置-脚本编写方法及相应的脚本编写系统.zip
  • Shell脚本编写 - 学习/实践

    千次阅读 2019-11-04 10:44:03
    编写shell脚本 2.学习/操作 shell有两种执行命令的方式://[按照交互性] 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。 批处理(Batch):用户事先写一个...

    1.应用场景

    即用于如何开始写以及高效地编写shell脚本,从而实现简化流程操作等~

    提高工作生活效率,解放出更多时间去做喜欢做的事情~

    2.学习/操作

    1. 文档

    Shell 教程 | 菜鸟教程 // 菜鸟教程 - Shell 教程 -- 建议过一遍,花不了很久 - 看完基本上shell入门,日常使用基本够用

    Note

    1. shell脚本的编写,有时候普通用户是权限不够的,需要加上sudo vim xxx.sh

    2. shell脚本必须要具有可执行权限

    2. 执行命令的方式

    shell按照交互性有两种执行命令的方式
    交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
    批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

    我们要知道bash和sh不是一个东西,我们需要了解,bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。

    3. 开始编写一个demo

    来吧,开始写shell

    终端输入 vi test.sh 或者 vim test.sh // 如果没有vim,安装参见:Linux Vim - 学习/实践_william_n的博客-CSDN博客 
    开始编辑输入一下内容:(在vi编辑器里面输入内容对新手比较麻烦,建议使用个人认为称手的文本编辑器,如sublime,nodepad,vscode等进行编辑,然后放到相应目录下【好像更加麻烦了,如果你是在mac下开发,应该就很好弄了】)

    echo "Hi, man~"

    read PERSON

    echo "$PERSON, nice to meet you and welcome!"

    输入完毕后,按Esc,输入 wq,enter回车, 进行保存退出。(以上步骤如果还不够熟练,建议你换个姿势~ 再来一次, 并且明白每个步骤的作用)

    接着运行,运行的话有好四种方式【至于区别后续补充】

    这里先用两种

    第一种,输入 ./test.sh(注意!前面有个点,表示当前目录下)
    第二种,输入 sh test.sh (当然bash test.sh也可以,前面说了bash对sh兼容是很好的,sh更短, 相对来说,更方便)

    回车开始执行shell脚本, 查看输出结果~

    可以看到执行报错,提示权限拒绝

    然后去查下相关资料,获取如下信息:

    Linux有个权限系统,我们这样创建的文件是没有执行权限的,因为默认创建的文件权限是 -rw-r--r--.

    在执行之前需要给他加权限,命令行输入 chmod +x ./test.sh,即可,这样就增加了可执行权限.(偶尔我会简单粗暴的chmod 777 ./test.sh,不推荐这样做)

    另外,可以通过 ls -l | grep test.sh 查看俩个赋予权限的区别

    添加执行权限之前

    添加执行权限之后 即执行 chmod +x ./test.sh

    接下来可以继续运行我们的程序了,敲入 ./test.sh 或 sh test.sh 回车运行

    终端输出:Hi, man~

    然后紧接着我也输入了Hi 回车,然后输出一段话

    Hi, nice to meet you and welcome!

    如下所示:

    over,世界是如此平静~~

    4. 基础知识

    4.1 变量概念

    好了,第一个小程序运行成功了,接下来看看变量定义:

    例子:varibleName="value"
    首先有一点,变量名和等号之间不能有空格,这点千万注意,因为我们平时写其他程序的时候可能已经养成了这种习惯,在shell这里需要注意这个习惯,

    然后要知道的一些变量命名规则:
    1,首个字符必须为字母(a-z,A-Z)。
    2,中间不能有空格,可以使用下划线(_)。
    3,不能使用标点符号。
    4,不能使用bash里的关键字(可用help命令查看保留关键字)。
    定义好变量我们就要开始使用变量了,如何使用变量,需要在自己定义的变量名上加上大括号,然后最前面写上$字符,例如

    who="dog"
    echo who is ${who}?

    其实变量可以直接用$who取,但是为了养成好习惯,还是加上括号吧。


    接着我们对shell的变量类型做个了解,有三种变量:

    1 局部变量
    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

    2 环境变量
    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

    3 shell变量

    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    shell中一些比较特殊的变量:

    特殊变量    

    含义$0    当前脚本的文件名传递给脚本或函数的参数。是一个数字,表示第几个参数。例如,第一个参数是​1,第二个参数是$2。$#    传递给脚本或函数的参数个数。

    $*    传递给脚本或函数的所有参数。传递给脚本或函数的所有参数。被双引号包含时,与​* 稍有不同,下面将会讲到。$?    上个命令的退出状态,或函数的返回值。

    $$    当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。这些变量我们留在这里备份,有用到就可以查。

    4.2 算数运算

    Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    接着写一小段shell:

    #!/bin/bash
    value=expr 2 + 2

    echo "Total value :${value}"

    图中有几个点要注意,第一行是linux的注释,以#号开头。

    在第二行中注意赋值地方是没有空格的,而在计算表达式的时候之间是有空格的。

    expr 2 + 2表达式被 ` 号括起来。

    注意  `号并不是单引号,而是键盘上Esc下面的符号。(半角英文模式)

    补充练习

    如果是执行命令后赋值, 同样需要使用`包裹起来   // 2020114 86号

    个人编写的定时任务执行的shell脚本

    request_urls.sh

    #!/bin/sh
    cd ~/ningxiaofa/request_urls
    php -q ./request_urls.php  >> ./request_urls.txt
    fileSize=`ls -l  ./request_urls.txt | awk '{print $5}'`
    if [ ${fileSize} -gt 51200 ]
    then
         rm -rf  ./request_urls.txt
         touch ./request_urls.txts
    fi

    运行结果

    Lee@Lee-PC /Desktop$ sh test.sh

    Total value :4

    好了接着跟我一起输入如下内容:

    /bin/bash
    a=10
    b=20
    value=expr 2 + 2
    echo "Total value :${value}"
    value=expr $a \* $b
    echo "a * b : ${value}"
    value=expr $b % $a
    echo "a % b : ${value}"
    if [ a == b ]
    then
        echo "a equals b"
    fi
    if [ a != b ]
    then
        echo "a not equals b"
    fi


    一起看看运行结果是不是相同

    $ sh test.sh
    Total value :4

    a * b : 200
    a % b : 0
    a not equals b

    对上面稍做说明:
    在计算a * b的时候,我们的表示有用到转义字符 \ (反斜杠) 
    条件表达式要放在方括号之间,并且要有空格,例如 [​b] 是错误的,必须写成 [ ​b ]
    if...then...fi 是条件语句,后面我们会对其再进行了解

    关系运算
    接着上面的脚本,我们继续编辑输入:

    if [ a -eq b ]
    then
        echo "a -eq b"
    else
        echo "a not equals b "
    fi
    if [ a -gt b ]
    then
        echo "a gt b"
    else
        echo "a not greater than b"
    fi
    if [ a -le b ]
    then
        echo "a le b"
    else
        echo "a not less or equal to b"
    fi

    运行结果:(有前面编辑输入过的内容哈)

    $ sh test.sh
    Total value :4

    a * b : 200
    a % b : 0
    a not equals b
    a not equals b
    a not greater than b
    10 le 20

    好了,写脚本的时候就能猜出来-gt 和-le的作用吧,我们系统地来看看

    关系运算符列表

    运算符

    说明

    说明

    -eq

    检测两个数是否相等,相等返回 true。

    [ ​b ] 返回 true。

    -ne

    检测两个数是否相等,不相等返回 true。

    [ ​b ] 返回 true。

    -gt

    检测左边的数是否大于右边的,如果是,则返回 true。

    [ ​b ] 返回 false。

    -lt

    检测左边的数是否大于右边的,如果是,则返回 true。

    [ ​b ] 返回 true。

    -ge

    检测左边的数是否大等于右边的,如果是,则返回 true。

    [ ​b ] 返回 false。

    -le

    检测左边的数是否小于等于右边的,如果是,则返回 true

    [ ​b ] 返回 true。

     

    3.问题/补充

    1.创建sh脚本文件,一直提示 E212: Can't open file for writing

    即没有写的权限,无法保存,按下ESC 输入:q! 先退出

    执行 sudo vim upgradeGcc.sh

    然后添加sudo 权限,过程参见:linux下错误代码E212: Can't open file for writing_王江宇的技术博客-CSDN博客_e212

    结果如下:创建成功

    2. linux 下执行.sh文件总是提示permission denied


    如果root登陆[不是则切换到root用户或者使用sudo,对*.sh赋可执行的权限]
    chmod 777 *.sh

     or

    chmod +x  *.sh

    3. 使用grep同时匹配多个文本 // 20210604 周五 家里

    【Linux】grep 匹配多个关键字_媛测-CSDN博客

    4.参考

    shell脚本编写思路 - 云+社区 - 腾讯云  //shell脚本编写思路

    https://blog.csdn.net/william_n/article/details/103959494  //Linux Crontab 定时任务

    后续补充

    ...

    展开全文
  • 性能脚本编写

    2014-10-16 17:26:29
    loadrunner webservice协议脚本如何使用http协议编写
  • window BAT脚本编写教程

    热门讨论 2009-07-21 16:23:28
    BAT脚本编写教程 简单的bat脚本命令及使用
  • eas扩展脚本编写指南.doc
  • sqlmap之tamper脚本编写

    千次阅读 2021-07-26 16:01:21
    sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。 为了说明tamper的结构,让我们从一个最简单的例子开始 # sqlmap/tamper/...

    目录

    前言

    tamper脚本实战


    前言

    sqlmap是一个自动化的SQL注入工具,而tamper则是对其进行扩展的一系列脚本,主要功能是对本来的payload进行特定的更改以绕过waf。

    为了说明tamper的结构,让我们从一个最简单的例子开始

    # sqlmap/tamper/escapequotes.py
     
    from lib.core.enums import PRIORITY
     
    __priority__ = PRIORITY.LOWEST
     
    def dependencies():
        pass
     
    def tamper(payload, **kwargs):
        return payload.replace("'", "\\'").replace('"', '\\"')

    不难看出,一个最小的tamper脚本结构为priority变量定义和dependenciestamper函数定义。

    • priority定义脚本的优先级,用于有多个tamper脚本的情况。如果你加载多个tamper,谁的优先级高,谁被优先使用。(优先级共有七个,分别为;LOWEST、LOWER、LOW、NORMAL、HIGH、HIGHER、HIGHEST)
    • dependencies函数声明该脚本适用/不适用的范围,可以为空。
    • tamper是主要的函数,接受的参数为payload和**kwargs。返回值为替换后的payload。比如这个例子中就把引号替换为了\\'。payload参数是sqlmap进行自动注入时的sql语句,要替换的就是payload,来完成想要的绕过。kwargs是修改http头里的内容函数,如下图

    tamper脚本实战

    1. 环境设计

    这里对sqli-labs第一关环境进行修改,增加过滤函数如下

    function sqlwaf( $str ) {
    	$str = str_ireplace( "and", "", $str );
    	$str = str_ireplace( "or", "", $str );
    	$str = str_ireplace( "union", "", $str );
    	$str = str_ireplace( "select", "", $str );
    	$str = str_ireplace( "sleep", "", $str );
    	$str = str_ireplace( "group", "", $str );
    	$str = str_ireplace( "extractvalue", "", $str );
    	$str = str_ireplace( "updatexml", "", $str );
    	$str = str_ireplace( "PROCEDURE", "", $str );
    	
    	return $str;
    }

    对传入的函数先经过这个函数的过滤

    经过这个过滤后,我们直接使用sqlmap进行注入是注入不成功的

    所以我们需要对sqlmap的payload进行修改,根据过滤函数规则,我们可以进行双写绕过单次过滤

    2. tamper编写

    因为关键词被过滤为空,导致payload不能正常执行,那么就可以编写这样tamper

    waf.py内容:

    # sqlmap/tamper/escapequotes.py
    from lib.core.enums import PRIORITY
     
    __priority__ = PRIORITY.NORMAL
     
    def dependencies():
        pass
     
    def tamper(payload, **kwargs):
        if payload:
            result = payload.replace("OR", "oorr").replace("AND", "aandnd").replace("UNION", "ununionion").replace("SELECT", "seleselectct").replace("PROCEDURE", "PROCEPROCEDUREURE").replace("SLEEP", "slesleepep").replace("GROUP", "grogroupup").replace("EXTRACTVALUE", "extractvextractvaluealue").replace("UPDATEXML", "updatupdatexmlexml")
            return result

    将waf.py放到sqlmap\tamper目录下,然后执行

    sqlmap.py -u url -v3 --tamper=waf.py --batch

    sqlmap关键词都被替换,如下and

     成功注入出来了

    展开全文
  • 编写shell脚本的一些规范 解释器 shell脚本一般选择bash作为解释器,脚本开头应为 #!/bin/bash 或 #!/bin/sh 添加脚本版本和注释功能 在脚本的开头加注释,说明脚本作者、编写时间、脚本功能,最好可以加上脚本的...
  • 油猴脚本编写教程

    万次阅读 多人点赞 2020-01-28 19:21:06
    油猴脚本(Tampermonkey)是一个非常流行的浏览器扩展,它可以运行由广大社区编写的扩展脚本,来实现各式各样的功能,常见的去广告、修改样式文件、甚至是下载视频。今天我们就来看看如何编写自己的油猴脚本。当然...
  • Python 脚本编写

    万次阅读 多人点赞 2018-07-14 19:50:05
    运行和修改 Python 脚本 与用户输入交互 处理异常 读写文件 导入本地、标准和第三方模块 在解释器中进行实验 安装 Python 检查计算机是否安装了 Python ? 在终端窗口输入如下指令,并按回车 python --...
  • python脚本编写教程

    千次阅读 2020-12-10 17:08:23
    python脚本编写教程 这里先做个记录,后续会逐一添加进来。
  • 按键精灵评分:大小:23.96MB语言:简体中文授权:免费版下载地址在安卓上使用按键精灵,可以模拟我们抢红包、抢火车票,而且连自动签到也是可以的,只要我们编写脚本就可以了。那么安卓按键精灵怎么编写脚本呢?...
  • pylaunch:集中式python脚本脚本编写工具
  • windows脚本编写及使用方法

    万次阅读 多人点赞 2019-02-13 21:26:12
    windows脚本 在 Windows 平台下,有时候会通过脚本来做一些快速的批量的操作,不仅节省时间,使用起来还很方便,很方便就可以进行批量处理文件,杀死进程等。脚本使用方法总结的比较好的一篇文章见:传送门。 脚本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 643,431
精华内容 257,372
关键字:

脚本编写