PowerShell脚本(.ps1) 实用代码

做为一个每天使用电脑的人,对于一些重复性工作,比如文件复制、删除、压缩等,用一些基于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

 

点赞