powershell基础使用笔记

powershell 基础使用笔记

  • powershell 基础使用笔记
    • 学习命令行的必要性
    • powershell 美化
    • 命令行速成课笔记
      • win 下 PowerShell 必知必会的命令
      • 目录操作
      • 文件操作
      • 搜索
      • 帮助
      • Sessions
      • 结语
学习命令行的必要性 要想真正学习编程,那么必须要懂得基本的命令行操作。命令行界面也即 command line interface(CLI)。我之前一直使用 matlab 这样的编程语言(有许多人把matlab当作软件),的确是不需要用到什么命令行操作。但是当我转而学习 python 这样的语言时,就会发现基本的命令行操作必不可少。
本文是我学习 Zed A. Shaw 的命令行速成课程(The Command Line Crash Course:Controlling Your Computer From The Terminal 点击可下载)。
powershell 美化 未经美化的 powershell 不忍直视,将其美化后能显著提高使用兴趣。至于美化的教程网上很多,我这里记录两个我参考的 将美化进行到底,把 PowerShell 做成 oh-my-zsh 的样子,Powershell 美化和 Win 包管理工具 | ?楠槡的博客,可能因为计算机环境不同,你按上面操作未必能正常运行。不过别慌都是小问题,多百度总有办法解决。
其实,这上面的美化用的都是该开源项目 JanDeDobbeleer/oh-my-posh,也可直接参考该项目文档。
这是我美化的最终效果:
powershell基础使用笔记
文章图片

谈不上多好,但比原生强多了。其实该项目不仅提供美化,在配置成功后,你可以使用 Tab 键对命令进行补全。
这里首先说明,我是在 win10 系统下,使用 powershell 即使用 5.1 版本(好像是 win10 自带),也使用 7.0.0-preview.3 版本(自己安装,该版本开源并能在多平台使用),这两本版本能同时存在。
另外,这里贴一下我的 PowerShell 配置文件,该文件一般位于 PC 文档目录,PowerShell(7.0版本),WindowsPowerShell(5.1版本)下。无论哪个版本都名为 Microsoft.PowerShell_profile.ps1
chcp 65001 Import-Module posh-git Import-Module oh-my-posh Set-Theme Honukai

命令行速成课笔记 那么开始步入正题,命令行速成课的笔记,这里按课程顺序做笔记。
win 下 PowerShell 必知必会的命令
pwd print working directory
hostname my computer’s network name
mkdir make directory
cd change directory
Is list directory
rmdir remove directory
pushd push directory
popd pop director
cp copy a file or directory
mv move a file or directory
more page through a file
type print the whole file
forfiles run a command on lots of files
dir -r find files
select-string find things inside files
help read a manual page
echo print some arguments
set export/set a new environment variable
exit exit the shell
runas DANGER! become super user root DANGER!
attrib change permission modifiers
iCACLS change ownership
这里将常用命令列出来,下文的笔记中只会记录我个人认为的重点,而不会重复记录简单命令。
目录操作
  1. mkdir:该命令用逗号分隔即可一次创建多个目录。在各系统通用斜杆表示目录,但是在 win 中也可以使用反斜杆。
    In this book I’m using the /(slash) character for all paths since they work the same on all computers now. However, Windows users will need to know that you can also use the(backslash) characters and other Windows users will typically expect those at times
  2. 如果要创建的目录中有空格,那么需要使用引号或者单引号包裹目录。
  3. PowerShell 中不区分大小写
  4. cd .. 返回上级目录,也可使用 cd ../.. 返回多层目录。
  5. 【powershell基础使用笔记】win 下 lsdir 命令效果一样?,至于为什么以后讲。
  6. dir 将当前目录的所有文件及目录列出。dir 具体目录 则将该具体目录下文件及目录列出,而 dir -r 命令则可以将子目录内的文件也一并列出。
  7. rmdir 命令移除非空目录是会询问如何操作:
    ? dir temp1Directory: D:\shellCode\temp1ModeLastWriteTimeLength Name ----------------------- ---- -a---2019/5/1121:5046547 p.css# 2 at SUPER-ALPHA in D:\shellCode [16:45:55] ? rmdir temp1Confirm The item at D:\shellCode\temp1 has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue? [Y] Yes[A] Yes to All[N] No[L] No to All[S] Suspend[?] Help (default is "Y"):

    如果,想跳过这一步直接操作,使用如下命令 dir temp1 -r
  8. pushd 临时进入目个目录,popd 返回之前的目录。这个命令可以连续搭配使用:
    # 3 at SUPER-ALPHA in D:\shellCode [17:57:07] ? pushd i/love/you # 4 at SUPER-ALPHA in D:\shellCode\i\love\you [17:57:19] ? pushd e:/ # 5 at SUPER-ALPHA in E: [17:57:32] ? popd # 6 at SUPER-ALPHA in D:\shellCode\i\love\you [17:57:40] ? popd # 7 at SUPER-ALPHA in D:\shellCode [17:57:43]

    The pushd command takes your current directory and"pushes"it into a list for later, then it changes to another directory. It’s like saying, "Save where I am, then go here.
    The popd command takes the last directory you pushed and"pops"it off, taking you back there Finally, on Unix pushd, if you run it by itself with no arguments, will switch between your current directory and the last one you pushed It’s an easy way to switch between two directories. This does not work in Power Shell
文件操作
  1. New-Item 能新建文件,也能新建目录。不过只能在当前目录下建立新文件或目录,无法在子目录下建目录或文件。
  2. cp 命令支持子目录下的操作,如:
    ? cp p.css i/ # 14747 at SUPER-ALPHA in D:\shellCode [18:43:24] ? dir iDirectory: D:\shellCode\iModeLastWriteTimeLength Name ----------------------- ---- d----2019/9/317:54love -a---2019/5/1121:5046547 p.css

    并且通过 cp -r 命令能实现整个目录的复制:
    # 14747 at SUPER-ALPHA in D:\shellCode [18:45:12] ? dir tempDirectory: D:\shellCode\tempModeLastWriteTimeLength Name ----------------------- ---- -a---2019/8/3019:0038 another.txt -a---2019/8/191:3412142 mytest.html -a---2019/8/3018:4910 test1.txt -a---2019/8/3018:5011 test2.txt -a---2019/8/3018:581831 test3.txt -a---2019/8/3019:0038 test4.txt# 14747 at SUPER-ALPHA in D:\shellCode [18:45:16] ? cp -r temp new # 14747 at SUPER-ALPHA in D:\shellCode [18:45:31] ? dir newDirectory: D:\shellCode\newModeLastWriteTimeLength Name ----------------------- ---- -a---2019/8/3019:0038 another.txt -a---2019/8/191:3412142 mytest.html -a---2019/8/3018:4910 test1.txt -a---2019/8/3018:5011 test2.txt -a---2019/8/3018:581831 test3.txt -a---2019/8/3019:0038 test4.txt# 14747 at SUPER-ALPHA in D:\shellCode [18:45:34]

  3. 作者建议当涉及目录操作时,在目录后加上 / 以确保是目录,建议自然没有问题。但是我目前没加也没有什么不妥。有待后续使用时验证。
  4. mv 当操作的文件在同一目录下时,就像重命名一样。只有当操作的文件在不同目录时,你才会觉得真的移动了文件。
  5. 在用 more 查看文件时,可以按 q 退出。
    On Unix you use the spacebar and w(the letter w)
    to go down and up Arrow keys also work
    On Windows just hit spacebar to page through
  6. more 是分页输出,而 cat 则是全部输出。cat 能一次性输出多个文件内容,此时文件之间应以逗号隔开。
  7. 感觉 rmrmdir 区别不大,都能删除文件或者目录。有待后续研究。
  8. win 下可以用 > 进行 redirection 操作,而 | 为管道符。使用 somecommand > somefile 命令即可将命令输出保存到指定文件。
  9. 通配符(wildcard),*(asterisk) 可以代表任何东西。当你输入一个星号时,就意味者将通过非星号部分,构建列表。这样,可以结合 rm 等命令删除特定文件。
搜索
  1. 获取当前目录下特定文件。
    # 14747 at SUPER-ALPHA in D:\shellCode [2:26:45] ? lsDirectory: D:\shellCodeModeLastWriteTimeLength Name ----------------------- ---- d----2019/8/2016:02.vscode d----2019/9/23:33temp1 -a---2019/9/223:091188 mytest.html -a---2019/9/23:45116 newfile.txt -a---2019/9/23:4642 oldfile.txt -a---2019/9/42:269919 powershell基础使用笔记.md -a---2019/9/42:0719733 process.txt -a---2019/8/2121:1812429 temp.html -a---2019/8/191:5012481 test2.html -a---2019/1/3110:4894326 wordfrequency.js -a---2019/9/314:581346 微软PowerShell官方教程笔记.md# 14747 at SUPER-ALPHA in D:\shellCode [2:26:46] ? dir -r -filter "*.txt"Directory: D:\shellCodeModeLastWriteTimeLength Name ----------------------- ---- -a---2019/9/23:45116 newfile.txt -a---2019/9/23:4642 oldfile.txt -a---2019/9/42:0719733 process.txtDirectory: D:\shellCode\temp1ModeLastWriteTimeLength Name ----------------------- ---- -a---2019/8/3019:0038 another.txt -a---2019/8/3018:4910 test1.txt -a---2019/8/3018:5011 test2.txt -a---2019/8/3018:581831 test3.txt -a---2019/8/3019:0038 test4.txt# 14747 at SUPER-ALPHA in D:\shellCode [2:27:02] ?

  2. ctrl+c 能中断运行。
  3. echo > file.txt 这个命令在 7.0 和 5.1 版本中的效果不一样,5.1 中可以记录任意个输入,需要通过输入一行空行中断。而 7.0 中只能记录一行输入然后自动中断。
  4. select-string 实现文本搜索功能:
    # 14747 at SUPER-ALPHA in D:\shellCode [2:45:46] ? Select-String fuck *.txtfunny.txt:1:fuck you funny.txt:2:fuck me funny.txt:3:fuck she new.txt:1:i really want to fuck you,idol

帮助
  1. help command 可以直接搜索相关命令的帮助。
  2. help command -online 可以在默认浏览器中打开相关命令帮助,但是注意这个页面的命令名字和你搜索的未必相同,但它们的含义作用是完全一样的。如,你搜 ls ,得到的却是 Get-ChildItem,那是因为 lsGet-ChildItem 的别名。
  3. 此外,也可以通过通配符,找寻相关的命令,这在自己记不请命令的情况下非常有用。
    # 14747 at SUPER-ALPHA in D:\shellCode [2:58:07] ? help *dir*NameCategoryModuleSynopsis -------------------------- dirAliasGet-ChildItem rmdirAliasRemove-Item chdirAliasSet-Location mkdirFunction Get-GitDirectoryFunctionposh-gitGets the path to the current repository's .git dir. Disable-NetAdapterPacketDirectFunctionNetAdapter… Enable-NetAdapterPacketDirectFunctionNetAdapter… Set-NetAdapterPacketDirectFunctionNetAdapter… Get-NetAdapterPacketDirectFunctionNetAdapter…

Sessions
这一节名不知道该翻译成什么,知道的朋友,还请不吝赐教。
  1. ls env: 可以输出系统环境变量。
  2. env:variableName 可以输出具体变量路径,但是好像也有的不能正常输出。
  3. env:os 输出你当前系统,具体是系统什么我不清楚意思,反正我输出如下:
    ? $env:os Windows_NT # 14747 at SUPER-ALPHA in D:\shellCode [3:07:56]

  4. 系统环境变量的新建与改变。
    # 14747 at SUPER-ALPHA in D:\shellCode [3:09:44] ? $env:fuckYou = "fuck you good" # 14747 at SUPER-ALPHA in D:\shellCode [3:10:27] ? $env:fuckyou fuck you good # 14747 at SUPER-ALPHA in D:\shellCode [3:10:35] ? rmdir env:/fuckyou # 14747 at SUPER-ALPHA in D:\shellCode [3:11:06] ? $env:fuckyou # 14747 at SUPER-ALPHA in D:\shellCode [3:11:15] ? ls env: | select-string fuckyou # 14747 at SUPER-ALPHA in D:\shellCode [3:12:44]

  5. 移除环境变量时也可以通过设置其值为空(“”),进行移除操作。
  6. exit 命令退出终端。
结语
留待进一步学习的几个命令:
forfiles runas attrib icacls set HA in D:\shellCode [3:11:06] ? $env:fuckyou # 14747 at SUPER-ALPHA in D:\shellCode [3:11:15] ? ls env: | select-string fuckyou # 14747 at SUPER-ALPHA in D:\shellCode [3:12:44]

  1. 移除环境变量时也可以通过设置其值为空(“”),进行移除操作。
  2. exit 命令退出终端。
结语
留待进一步学习的几个命令:
forfiles runas attrib icacls set

    推荐阅读