做为一个每天使用电脑的人,对于一些重复性工作,比如文件复制、删除、压缩等,用一些基于windows的脚本会非常方便。以前都是用cmd,也就是bat脚本。现在win10已经普及了,powershell脚本更强大一些。不过国内资料貌似不太多,用的也不太多。我将把自己用到的一些快捷的脚本堆在这里,不深入研究,追求实用主义。
注意:powershell脚本扩展名为.ps1,用我这些实用代码,很快能写出有用的批处理脚本。
确认对话框
Add-Type -AssemblyName 'PresentationFramework' $continue = 'Yes' $title = "对话框标题" $message = "确定要干啥啥吗?" $continue = [System.Windows.MessageBox]::Show($message, $title, 'YesNo'); if ($continue -eq 'Yes') { }
强制建立文件夹
md -Force .\_backup
变量为当前日期
$FILENAME = (Get-Date).ToString('yyyyMMdd-hhmm')
运行7z进行压缩
运行D盘的7z,把所有当前目录下的所有文件(*),添加到当前目录下me.zip,排除aaa文件夹,排除*.jpg文件。
& "D:\Program Files\7-Zip\7z.exe" a .\me.zip * '-xr!aaa' '-x!*.jpg'
强制删除文件和文件夹
function ForceDelete { [CmdletBinding()] param( [string] $path ) rm -r -fo $path if (Test-Path -Path $path){ Write-Host "Force delete retrying..." -ForegroundColor white -BackgroundColor red Start-Sleep -Seconds 1 rm -r -fo $path } }
这是一个函数,因为powershell它递归删除文件夹有问题,有时候多级目录它删不掉,所以我根据stackoverflow的答案,再加上自己想是不是删的太快了,所以归纳了一个函数,实际就是做了两次删除,中间做了间隔,我自己用反正靠谱。https://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/71854661#71854661
所以用的时候就是:
# 强制删除当前aaa目录下的所有文件和内容,包括aaa目录 ForceDelete('.\aaa') # 强制删除当前aaa目录下的所有文件和内容,不包括aaa目录 ForceDelete('.\aaa\*') # 强制删除当前目录下aaa.html文件 ForceDelete('.\aaa.html')
还得注意,这种强制删除,它中途会报错的,所以脚本不要设置“遇到错误就中止后续代码运行”。
遇到错误就中止后续代码运行
#遇到错误就停止
$ErrorActionPreference = "Stop"
普通文字输出
# 输出文字,文字颜色是绿色,红色就是red Write-Host "Task completed." -ForegroundColor green # 输出文字,文字颜色是百色,背景颜色红色 Write-Host "Force delete retrying..." -ForegroundColor white -BackgroundColor red
等待3秒
Start-Sleep -Seconds 3
文件夹复制
文件或文件夹复制不要用powershell的命令,不靠谱,用windows复制神器robocopy
# 复制文件夹,把D盘下aaa文件夹所有内容拷贝到当前目录 robocopy /e D:\aaa\ .\ # 在上面的基础上加排除,排除目录/XD,排除了bbb下面的.git目录,看好这是排除目录。多个目录,空格以后再写到双引号里面。然后/XF排除文件,排除.gitignore文件。 robocopy /e D:\aaa\ .\ /XD "D:\aaa\bbb\.git" "D:\aaa\bbb\ccc" /XF "D:\aaa\.gitignore"
如果文件较多,robocopy会有详细的拷贝进程,但是往往没啥用,加强版,加一个不算太丑的进度提示:
robocopy /e D:\aaa\ .\ /NDL /NJH /NJS | %{$data = $_.Split([char]9); if("$($data[4])" -ne "") { $file = "$($data[4])"} ;Write-Progress "Percentage $($data[0])" -Activity "Copying..." -CurrentOperation "$($file)" -ErrorAction SilentlyContinue; }
说明一下,前面的robocopy命令该怎么写就怎么写,后面从 /NDL /NJH /NJS开始复制,一直到最后。
还没说完,这个进度条有一个名字,名字在-Activity 后面,这里叫 “Copying…”。然后当复制完成以后,目前命令并没有关掉它,还得加上关掉的语句,否则它会持续显示。
Write-Progress -Activity "Copying..." -Status "Ready" -Completed
文件复制
robocopy .\ .\aaa\ "bbb.zip"
把当前文件下的bbb.zip,复制到aaa文件夹下面,注意文件名一定要加双引号。
当前文件夹
# 当前脚本所在的文件夹路径 $PSScriptRoot # 只要当前文件夹的名字 $projectName = Split-Path -Path $PSScriptRoot -Leaf