PowerShell-1.入门及其常用

PowerShell实战指南
本文介绍PowerShell的基础操作及高级应用技巧,包括常用命令、变量管理、流程控制、错误处理等内容,并通过实例展示如何进行高效开发。

    PowerShell可以理解成是加强版的批处理,但是和批处理完全不同,比如可以调用API等。应用场景平时使用的用户机基本都支持了(出了XP)。

常用情节:便捷快速开发,或者是**(因为不存在自己的PE,so...)

比如我是WIn764

 

运行起来大体是这个样子。

 

*********************************************************************

Powershell常用命令:(随便来几个)

1.Get-Command 得到Powshell所有命令

2.Get-Process 获取所有进程

3.Set-Alias  给指定命令重命名 如:Set-Alias aaa Get-Command

4.Set-ExecutionPolicy remotesigned 设置powershell可直接执行脚本文件 一般脚本文件以.ps1结尾 执行脚本文件直接输入文件地址即可执行  脚本文件中只写命令即可

5.Get-Help get-* 查询以get开头的命令   Get-Help *service*  Get-Help Get-Command 获取Get-Command命令的基本用法(get-help * | out-file C:\xxx.dat   获取所有帮助并且重定向输出)

6.Get-Member 获取对象属性  如: $var | Get-Memeber  访问$var属性 直接$var.ToString()

7.Stop-Process XX                    关闭某个进程

...

********************************************************************

PS中的变量定义

不需要定义或声明数据类型

在变量前加"$"

定义变量的规则

  -变量可以是数字 $123

  -变量可以是字符串 $abc

  -变量可以是特殊字符 ${@1b}

 内置的变量

   -$pshome

   -$home

   -$profile

 

变量赋值: $var=123  $var="aaaaaa"

取变量值: $var

 

变量赋值方法:Set-Variable var 100

取值方法:    Get-Variable var

清空值:      Clear-Variable var

删除变量     Remove-Variable var

取多个变量如var1 var2 var3地值:   Get-Variable var*

 

另一种赋值方法 $var1="bbb"    $var2="$var $var1"  结果$var2="aaaaaa bbb"

               $var2='$var $var1' 结果$var2="$var $var1"

 

*********************************************************************

排序用法

Get-Process | Sort-Object ws   根据WS值由小到大排序

Get-Process | Sort-Object | fl    Get-Process | Sort-Object | Format-List  以列表形式显示数据

*********************************************************************

导入导出文件

Get-Process > c:/aa.txt

Get-Process | Export-Clixml c:/ddd.xml  将命令执行结果导出到xml文件中

Import-Clixml c:/ddd.xml  xml文件导出到控件台

*********************************************************************

注释使用

Get-Proccess | #这里写注释信息

sort ws

*********************************************************************

比较运算符

$var="abc"

$var -like "&b&"  返回true  ../我测试是假

$var -clike "&b&"   返回true../我测试是假

*********************************************************************

函数使用

案例:在一个脚本文件中有如下代码:

$var1=10

function one{"The Variable is $var1"}

function two{$var1=20;one}

one

two

one

执行结果: The Variable is 10

     The Variable is 20

          The Variable is 10

此示例表明,在函数中改变变量值并不影响实际值

若需改变其值请看如下代码:

$var1=10

function one{"The Variable is $var1"}

function two{$Script:var1=20;one}

one

two

one

执行结果: The Variable is 10

     The Variable is 20

          The Variable is 20

 

 

 

freach使用

$var=1..6  #定义数组

foreach($i in $var)

{

   $n++

   Write-Host "$i"

}

Write-Host "there were $n record"

*********************************************************************

if使用

Get-Service | foreach{

  if($_.status -eq "running"){

     Write-Host $_.displayname  "("$_status")" -foregroundcolor "green"

  }

  else

  {

     Write-Host $_.displayname  "("$_status")" -foregroundcolor "red"

  }

}

if (条件) {代码}

elseif (条件) {代码}

else (条件) {代码}

else {代码} .

? -eq 判断是否等于(equal)

? -lt 判断时候小于(less than)

? -gt 判断是否大于(greater than)

? -ge 判断是否大于或等于(greater of equal)

? -le 判断是否小于或等于(less or equal)

? -ne 判断是否不等于(no equal)

 

? -and

? -or

? -not

? !

*********************************************************************

error使用

function one

{

   Get-Process -ea stop

   Get-ChildItem ada -ErrorAction stop  #此句有误

   Get-Process -ErrorAction stop

}

one

 

-ea 定义当错误发生以后该如何继续执行

$?可以测试命令执行成功还是失败,成功则结果为true 反之为false

 

 

单步调试

先设置Set-PSDebug -step

for($i=1;$i -le 10;$i++)

{

   Sleep(1)

  Write-Host "loop number $i"

}

 

<think>我们正在处理两个同的错误: 1. 'could not use requested auth plugin 'mysql_native_password': this user requires mysql native password authentication' 2. 'panic: runtime error: invalid memory address or nil pointer dereference' 第一个错误与MySQL身份验证插件有关,第二个错误是Go中的空指针解引用。 让我们分别解决这两个问题。 ## 错误1: MySQL身份验证问题 这个错误通常发生在较新的MySQL版本(如8.0+)中,因为默认的身份验证插件从`mysql_native_password`更改为`caching_sha2_password`。而一些旧的MySQL客户端驱动程序可能还支持新的身份验证插件。 在Go中,我们通常使用`github.com/go-sql-driver/mysql`驱动。该驱动从v1.5.0开始支持`caching_sha2_password`,但如果使用的是较低版本,则可能支持。 解决方案有两种: ### 方案1: 升级MySQL驱动 确保你使用的驱动版本至少是v1.5.0。 ```bash go get -u github.com/go-sql-driver/mysql@v1.5 ``` ### 方案2: 修改MySQL用户身份验证插件(推荐用于生产) 如果你无法升级驱动,可以修改MySQL用户使用旧的`mysql_native_password`插件。 在MySQL中执行: ```sql ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; ``` 或者,在创建用户时指定: ```sql CREATE USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; ``` 注意:这种方法降低了安全性,因此生产环境建议升级驱动。 ## 错误2: 运行panic(无效内存地址或空指针解引用) 这个错误通常发生在尝试访问一个`nil`指针所指向的内存时。在Go中,当你声明一个指针变量但未初始化时,它的值为`nil`。 例如: ```go var db *sql.DB // 如果没有调用sql.Open()进行初始化,db为nil err = db.Ping() // 这里会panic ``` 解决方法: 1. 确保在使用指针变量前,它已经被正确初始化。 2. 检查函数返回的错误,避免在错误发生时使用返回的nil指针。 在MySQL连接的上下文中,常见的错误处理模式如下: ```go import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { // 连接字符串格式: "username:password@tcp(host:port)/dbname?params" db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname?charset=utf8&parseTime=True") if err != nil { panic(err.Error()) // 或者更优雅的错误处理 } defer db.Close() // 检查连接 err = db.Ping() if err != nil { panic(err.Error()) } // 使用db进行数据库操作 } ``` 注意: - `sql.Open`并会立即建立连接,它只是初始化一个`sql.DB`对象。 - 通过`db.Ping()`来检查连接是有效。 如果`db`为nil,那么说明`sql.Open`可能返回了错误,而你没有检查。因此,一定要检查`sql.Open`的返回值。 ## 结合两个错误的解决方案 在连接MySQL时,如果同时遇到这两个错误,我们可以这样处理: 1. 升级MySQL驱动到最新版本(推荐v1.5.0+)。 2. 确保在代码正确处理了错误,并对`sql.DB`对象进行了正确的初始化。 示例代码: ```go package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" ) func main() { // 使用新版本驱动,支持caching_sha2_password的驱动 db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True") if err != nil { log.Fatal("sql.Open failed: ", err) } defer db.Close() // 验证连接 if err := db.Ping(); err != nil { log.Fatal("db.Ping failed: ", err) } fmt.Println("Connected to MySQL!") } ``` 如果升级驱动后仍然出现身份验证问题,可以尝试在连接字符串中添加参数: ```go // 使用旧的身份验证插件(如果必须) db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/dbname?allowNativePasswords=true") ``` 注意:`allowNativePasswords`参数在较新版本的驱动中已经再需要,因为驱动默认已经支持。 ## 总结步骤 1. 升级驱动:`go get github.com/go-sql-driver/mysql@latest` 2. 检查代码中是对错误和指针进行了正确处理。 3. 如果升级驱动后仍然有问题,检查MySQL用户身份验证方式,或者尝试在连接字符串中添加`allowNativePasswords=true`(但通常需要)。 4. 确保MySQL服务允许远程连接(如果非本地)以及防火墙设置。 注意:生产环境建议使用新的身份验证插件(`caching_sha2_password`)并确保驱动支持,而是降级身份验证方式。 引用: [^1]: 关于MySQL身份验证错误的描述 [^2]: 驱动版本要求 </think>以下是针对Go语言中两个典型错误的详细解决方案: ### 错误1:`could not use requested auth plugin 'mysql_native_password'` #### 根本原因 MySQL 8.0+默认使用`caching_sha2_password`认证插件[^1],但旧版Go MySQL驱动(<v1.5.0)仅支持`mysql_native_password`协议。 #### 解决方案 ##### 方法1:升级MySQL驱动(推荐) ```bash go get -u github.com/go-sql-driver/mysql@v1.7.0 # 最低要求v1.5.0+ ``` ```go import ( _ "github.com/go-sql-driver/mysql" "database/sql" ) func main() { db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?allowNativePasswords=true") // ↑ 注意添加allowNativePasswords参数[^2] } ``` ##### 方法2:修改MySQL用户认证方式 ```sql -- 登录MySQL后执行 ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; ``` ##### 方法3:配置my.cnf(需重启MySQL) ```ini [mysqld] default_authentication_plugin=mysql_native_password ``` #### 验证流程 ```mermaid graph TD A[连接失败] --> B{驱动版本≥1.5.0?} B ----> C[连接字符串添加参数] B -- --> D[升级驱动] C --> E[测试连接] E -- 成功 --> F[完成] E -- 失败 --> G[修改MySQL认证方式] ``` --- ### 错误2:`panic: runtime error: invalid memory address or nil pointer dereference` #### 常见触发场景 ```go var db *sql.DB db.Ping() // 未初始化即调用方法 var user *User fmt.Println(user.Name) // 访问nil指针成员 ``` #### 解决方案 ##### 1. 初始化指针 ```go // 错误示例 ❌ var db *sql.DB _ = db.Ping() // panic! // 正确示例 ✅ db, _ := sql.Open("mysql", "connection_string") if db != nil { // 防御性检查 _ = db.Ping() } ``` ##### 2. 空指针检查 ```go func (u *User) GetName() string { if u == nil { return "guest" // 返回安全默认值 } return u.Name } ``` ##### 3. 使用结构体代替指针 ```go // 优先使用值类型 user := User{} // 而非 var user *User fmt.Println(user.Name) // 输出空字符串而非panic ``` ##### 4. 调试工具 ```bash GOTRACEBACK=all go run main.go # 显示完整堆栈 ``` #### 预防措施 1. **启用Linter**:配置`staticcheck`检测可能的nil解引用 2. **防御性编程**: ```go if resp, err := http.Get(url); err == nil { defer resp.Body.Close() // 确保resp非nil } ``` 3. **错误处理**: ```go db, err := sql.Open(...) if err != nil || db == nil { log.Fatal("初始化失败") } ``` --- ### 典型关联场景解决方案 **MySQL连接初始化完整示例:** ```go package main import ( "database/sql" "log" _ "github.com/go-sql-driver/mysql" ) func main() { // 正确配置连接字符串 db, err := sql.Open("mysql", "user:pass@tcp(localhost:3306)/db?parseTime=true&allowNativePasswords=true") // 错误处理(避免nil panic) if err != nil { log.Fatal("Open failed:", err) } defer db.Close() // 显式检查连接对象 if db == nil { log.Fatal("DB object is nil") } // Ping验证连接 if err := db.Ping(); err != nil { log.Fatal("Ping failed:", err) } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值