PowerShell 相关
windowspowershell

PowerShell 相关

获取特殊目录路径Windows 操作系统中常用的特殊文件夹:| 文件夹 | 路径 |...

花野猫

花野猫

更新于 2023-12-12

6744

获取特殊目录路径

Windows 操作系统中常用的特殊文件夹:

文件夹路径
桌面[Environment]::GetFolderPath("Desktop")
文档[Environment]::GetFolderPath("MyDocuments")
下载[Environment]::GetFolderPath("Downloads")
图片[Environment]::GetFolderPath("MyPictures")
音乐[Environment]::GetFolderPath("MyMusic")
视频[Environment]::GetFolderPath("MyVideos")
收藏夹[Environment]::GetFolderPath("Favorites")
临时文件夹[Environment]::GetFolderPath("Temp")
应用数据[Environment]::GetFolderPath("ApplicationData")
本地应用数据[Environment]::GetFolderPath("LocalApplicationData")
公共文档[Environment]::GetFolderPath("CommonDocuments")

打开进程

如果使用 Start-Process 打开浏览器时,浏览器已经打开,但没有任何反应,可以尝试使用 -PassThru 参数来解决这个问题。-PassThru 参数会返回一个表示新进程的对象,您可以使用该对象来进行进一步的操作。

powershell
$browser = Start-Process -FilePath "C:\Program Files\Internet Explorer\iexplore.exe" -PassThru

示例中使用了 Internet Explorer 作为浏览器的示例。可以根据使用的浏览器的实际路径进行修改。

通过将进程对象存储在变量 $browser 中,您可以随后使用该对象来进行进一步的操作,例如检查进程是否仍在运行,或者关闭进程。

后台启动

后台运行Next.js服务并将输出重定向到文件:

powershell
Start-Process -FilePath "cmd.exe" -ArgumentList "/c yarn dev >> output.txt" -WindowStyle Hidden

这个命令会启动一个隐藏的命令行窗口,并在其中执行yarn dev命令,并将输出重定向到output.txt文件中。这样即使关闭命令行窗口,服务也会继续在后台运行。

变量换行丢失问题

在PowerShell中,执行wmic logicaldisk get命令时,输出结果会丢失换行符。这是因为wmic命令的输出格式与PowerShell的默认输出格式不兼容。可以使用Out-String命令将wmic命令的输出转换为字符串,并保留换行符:

powershell
$data = wmic logicaldisk get | Out-String

这将把wmic logicaldisk get命令的输出保存在$data变量中,并保留换行符。现在,您可以在PowerShell中使用$data变量,并正确处理换行符。

时间戳作为文件名

可以使用以下 PowerShell 脚本将内容输出到以当前日期时间为名称的文件中:

powershell
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$filename = "$timestamp.txt"
$content = "要输出的内容"
Set-Content -Path $filename -Value $content

winForm 乱码

在 PowerShell 中创建 Windows 窗体应用程序时,确保在设置文本时使用正确的编码。默认情况下,PowerShell 使用的是 ASCII 编码,这可能导致中文字符显示为乱码。可以使用 System.Text.Encoding 类来指定正确的编码。

powershell
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$form.Text = "示例窗体"
$label = New-Object System.Windows.Forms.Label
$label.Text = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::Default.GetBytes("中文文本"))
$label.AutoSize = $true
$label.Location = New-Object System.Drawing.Point(10, 10)
$form.Controls.Add($label)
$form.ShowDialog()

在上面的示例中,我们使用 [System.Text.Encoding]::Default.GetBytes 将默认编码的字符串转换为字节数组,然后使用 [System.Text.Encoding]::UTF8.GetString 将字节数组转换回中文字符串。这样可以确保文本以正确的编码显示在标签上。

请注意,如果系统默认编码不是 UTF-8,可能需要将上述代码中的 UTF8 替换为你的系统默认编码。

错误捕获

powershell
try {
# 调用函数或执行代码
MyFunction
}
catch {
# 处理错误的逻辑
Write-Host "发生错误:$($_.Exception.Message)"
}

消息框

System.Windows.Forms.MessageBox 类是用于创建消息框的类,它提供了以下常用的静态方法:

  1. Show(string message):显示一个带有指定消息文本的消息框,只包含一个“确定”按钮。
  2. Show(string message, string caption):显示一个带有指定消息文本和标题的消息框,只包含一个“确定”按钮。
  3. Show(string message, string caption, MessageBoxButtons buttons):显示一个带有指定消息文本、标题和按钮类型的消息框。MessageBoxButtons 枚举定义了常见的按钮类型,如“确定”、“取消”、“是/否”等。
  4. Show(string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon):显示一个带有指定消息文本、标题、按钮类型和图标的消息框。MessageBoxIcon 枚举定义了常见的图标类型,如信息、警告、错误等。
  5. Show(string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton):显示一个带有指定消息文本、标题、按钮类型、图标和默认按钮的消息框。MessageBoxDefaultButton 枚举定义了默认按钮的位置。

这些方法可以根据具体需求选择适当的参数组合来创建不同类型的消息框。

除了以上方法,System.Windows.Forms.MessageBox 类还提供了其他一些属性和事件,例如 DefaultCaptionButtonClicked 等。您可以根据需要查阅相关文档以获取更详细的信息。

MessageBoxIcon 是一个枚举类型,用于定义消息框中显示的图标类型。它定义了以下常见的图标类型:

  1. None:无图标。
  2. Information:信息图标。
  3. Warning:警告图标。
  4. Error:错误图标。
  5. Question:问号图标。

tableLayout 添加列样式

powershell
$tableLayoutPanel.ColumnStyles.Add((New-Object -TypeName System.Windows.Forms.ColumnStyle(([System.Windows.Forms.SizeType]::Percent, 50))))
$tableLayoutPanel.ColumnStyles.Add((New-Object -TypeName System.Windows.Forms.ColumnStyle(([System.Windows.Forms.SizeType]::Percent, 50))))

启动 HTTP 服务器

使用 PowerShell 可以启动一个简单的 HTTP 服务器,而无需安装任何外部依赖。以下是一个示例:

powershell
$port = 8080
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://localhost:$port/")
$listener.Start()
Write-Host "HTTP server is running on port $port. Press Ctrl+C to stop."
while ($listener.IsListening) {
$context = $listener.GetContext()
$response = $context.Response
$content = [Text.Encoding]::UTF8.GetBytes("Hello, World!")
$response.ContentLength64 = $content.Length
$response.OutputStream.Write($content, 0, $content.Length)
$response.Close()
}
$listener.Stop()

上述代码会创建一个监听在本地 8080 端口的 HTTP 服务器,并在收到请求时返回 "Hello, World!" 的响应。

避免关闭窗口

要在 PowerShell 中执行命令后暂停而不关闭窗口,可以使用 Read-Host cmdlet。Read-Host cmdlet 会等待用户输入,直到用户按下 Enter 键。示例:

powershell
Write-Host "执行命令后的暂停"
# 执行您的命令
# 例如:Get-Process
Read-Host "按下 Enter 键以继续..."

JSON 处理

ConvertFrom-Json cmdlet 是在 PowerShell 3.0 版本中引入的,并且在之后的版本中都可用。

如果法升级 PowerShell 版本,你可以考虑使用第三方的 JSON 解析库,例如 Newtonsoft.Json,可以通过在 PowerShell 脚本中引入 Newtonsoft.Json 库来实现 JSON 解析功能。

在 PowerShell 中,你可以使用 Get-Content cmdlet 来读取 JSON 文件,并使用 ConvertFrom-Json cmdlet 将其转换为 PowerShell 对象,示例:

powershell
$jsonContent = Get-Content -Raw -Path "path/to/your/file.json" | ConvertFrom-Json

这将读取指定路径下的 JSON 文件,并将其转换为 PowerShell 对象存储在 $jsonContent 变量中。

使用 ConvertFrom-Json cmdlet 可以直接将JSON 字符串转换为对象。例如:

powershell
$jsonString = '{"name": "John", "age": 30}'
$jsonObject = $jsonString | ConvertFrom-Json

powershell 版本

显示当前正在使用的 PowerShell 版本:

powershell
$PSVersionTable.PSVersion

Windows 7 的默认 PowerShell 版本是 2.0

隐藏 powershell 窗口

一种方法是使用VBScript来运行PowerShell脚本,并在VBScript中设置窗口隐藏。以下是示例代码:

powershell
$scriptPath = Join-Path -Path $PSScriptRoot -ChildPath "upload.ps1"
$VBScript = @"
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File `""$scriptPath`""", 0
"@
$VBScriptPath = Join-Path -Path $PSScriptRoot -ChildPath "upload.vbs"
$VBScript | Out-File -FilePath $VBScriptPath -Encoding ASCII
$Action = New-ScheduledTaskAction -Execute 'wscript.exe' -Argument "`"$VBScriptPath`"

这段代码将创建一个VBScript文件(upload.vbs),其中的代码将隐藏PowerShell窗口并运行指定的PowerShell脚本。然后,将VBScript文件作为计划任务的动作执行。


要在运行.bat脚本时不显示控制台窗口,可以使用以下方法:

  1. 使用VBScript编写一个批处理脚本的启动器:
    Set WshShell = CreateObject("WScript.Shell") WshShell.Run "your_script.bat", 0 Set WshShell = Nothing

将上述代码保存为launch.vbs文件,然后双击运行launch.vbs文件来启动你的批处理脚本。这样就不会显示控制台窗口了。

获取绝对路径

可以使用PowerShell的内置变量$PSScriptRoot来获取当前脚本的所在路径,并将其与相对路径拼接以得到绝对路径。以下是修改后的代码示例:

powershell
$scriptPath = Join-Path -Path $PSScriptRoot -ChildPath "upload.ps1"
$Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -WindowStyle Hidden -File `"$scriptPath`""

这样,$scriptPath变量将包含upload.ps1的绝对路径,无论当前脚本在哪个路径下运行。

正常结束脚本

在PowerShell脚本中,可以使用Exit命令来表示脚本正常结束。当脚本执行到Exit命令时,脚本将立即停止并返回到调用它的环境。

以下是一个示例脚本,演示如何使用Exit命令来表示脚本的正常结束:

powershell
# 执行一些操作...
# 判断是否满足结束条件
if ($condition) {
# 正常结束脚本
Exit 0
}
# 继续执行其他操作...
# 正常结束脚本
Exit 0

在上面的示例中,当满足某个条件时,脚本会执行Exit 0命令来表示正常结束。如果不满足条件,脚本将继续执行其他操作,最后再执行Exit 0命令来表示正常结束。

请注意,Exit命令的参数表示脚本的退出代码。通常情况下,0表示脚本正常结束,非零值表示脚本发生了错误或异常结束。

管理员权限运行

要让 PowerShell 脚本需要以管理员权限运行,你可以在脚本中添加以下代码:

powershell
# 检查是否以管理员权限运行
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
# 重新启动脚本以请求管理员权限
Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
Exit
}
# 在这里写下你的脚本逻辑

这段代码首先检查当前脚本是否以管理员权限运行。如果没有管理员权限,它会使用 Start-Process 命令以管理员身份重新启动脚本。然后,脚本会以管理员权限重新运行,继续执行后续的脚本逻辑。使用这种方法重新启动脚本时,可能会弹出 UAC(用户账户控制)提示框,要求用户授权以管理员权限运行脚本。