powershell - 通过右键单击文件运行 GUI powershell 脚本

标签 powershell alternate-data-stream

我使用 GUI .net 框架构建了一个 powershell 脚本,该框架为用户提供了一个图形界面,以将备用数据流 (ADS) 添加到 NTFS 文件系统上的文件。

下面是我为 powershell 脚本编写的代码:

<# 
This script is a GUI featured way to add extended attributes to files 
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

#region begin GUI{ 

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '600,600'
$Form.text                       = "Add Extended Attributes"
$Form.TopMost                    = $false

# Add Extended Attributes Label
$mainLabel                       = New-Object system.Windows.Forms.Label
$mainLabel.text                  = "Add Extended Attributes"
$mainLabel.AutoSize              = $true
$mainLabel.width                 = 25
$mainLabel.height                = 10
$mainLabel.location              = New-Object System.Drawing.Point(180,10)
$mainLabel.Font                  = 'Microsoft Sans Serif,18'

# text box for entering file path 
$filePath                        = New-Object system.Windows.Forms.TextBox
$filePath.multiline              = $false
$filePath.width                  = 300
$filePath.height                 = 20
$filePath.location               = New-Object System.Drawing.Point(200,80)
$filePath.Font                   = 'Microsoft Sans Serif,10'

# label for the file path text box "File Path: "
$FilePathLabel                   = New-Object system.Windows.Forms.Label
$FilePathLabel.text              = "File Path: "
$FilePathLabel.AutoSize          = $true
$FilePathLabel.width             = 25
$FilePathLabel.height            = 10
$FilePathLabel.location          = New-Object System.Drawing.Point(80,85)
$FilePathLabel.Font              = 'Microsoft Sans Serif,10'

# Attributes Label
$idLabel                         = New-Object system.Windows.Forms.Label
$idLabel.text                    = "Attributes"
$idLabel.AutoSize                = $true
$idLabel.width                   = 25
$idLabel.height                  = 10
$idLabel.location                = New-Object System.Drawing.Point(80,150)
$idLabel.Font                    = 'Microsoft Sans Serif,12'

# Values Label
$valueLabel                      = New-Object system.Windows.Forms.Label
$valueLabel.text                 = "Value"
$valueLabel.AutoSize             = $true
$valueLabel.width                = 25
$valueLabel.height               = 10
$valueLabel.location             = New-Object System.Drawing.Point(300,150)
$valueLabel.Font                 = 'Microsoft Sans Serif,12'

# Checkbox for ID attribute
$fileId                          = New-Object System.Windows.Forms.CheckBox
$fileId.text                     = "Id"
$fileId.AutoSize                 = $true
$fileId.width                    = 104
$fileId.height                   = 20
$fileId.location                 = New-Object System.Drawing.Point(100,200)
$fileId.Font                     = 'Microsoft Sans Serif,10'

# Label for the ID checkbox
$idValue                         = New-Object system.Windows.Forms.TextBox
$idValue.multiline               = $false
$idValue.width                   = 300
$idValue.height                  = 20
$idValue.location                = New-Object System.Drawing.Point(202,200)
$idValue.Font                    = 'Microsoft Sans Serif,10'

# Checkbox for Description attribute
$description                      = New-Object System.Windows.Forms.CheckBox
$description.text                 = "Description"
$description.AutoSize             = $true
$description.width                = 104
$description.height               = 20
$description.location             = New-Object System.Drawing.Point(100,250)
$description.Font                 = 'Microsoft Sans Serif,10'

# Label for the Description checkbox
$descriptionValue                 = New-Object system.Windows.Forms.TextBox
$descriptionValue.multiline       = $false
$descriptionValue.width           = 300
$descriptionValue.height          = 20
$descriptionValue.location        = New-Object System.Drawing.Point(202,250)
$descriptionValue.Font            = 'Microsoft Sans Serif,10'

# Checkbox for Type attribute
$type                             = New-Object System.Windows.Forms.CheckBox
$type.text                        = "Type"
$type.AutoSize                    = $true
$type.width                       = 104
$type.height                      = 20
$type.location                    = New-Object System.Drawing.Point(100,300)
$type.Font                        = 'Microsoft Sans Serif,10'

# Label for the type checkbox
$typeValue                        = New-Object system.Windows.Forms.TextBox
$typeValue.multiline              = $false
$typeValue.width                  = 300
$typeValue.height                 = 20
$typeValue.location               = New-Object System.Drawing.Point(202,300)
$typeValue.Font                   = 'Microsoft Sans Serif,10'

# Checkbox for silo attribute
$silo                             = New-Object System.Windows.Forms.CheckBox
$silo.text                        = "Silo"
$silo.AutoSize                    = $true
$silo.width                       = 104
$silo.height                      = 20
$silo.location                    = New-Object System.Drawing.Point(100,350)
$silo.Font                        = 'Microsoft Sans Serif,10'

# Label for the silo checkbox
$siloValue                        = New-Object system.Windows.Forms.TextBox
$siloValue.multiline              = $false
$siloValue.width                  = 300
$siloValue.height                 = 20
$siloValue.location               = New-Object System.Drawing.Point(202,350)
$siloValue.Font                   = 'Microsoft Sans Serif,10'

# submitt button 
$button                           = New-Object System.Windows.Forms.Button
$button.text                      = "Submit"
$button.AutoSize                  = $true
$button.location                  = New-Object System.Drawing.Point(250,500)
$button.Font                      = 'Microsoft Sans Serif,10'



$Form.controls.AddRange(@($mainLabel, $fileId,$filePath,$idLabel,$valueLabel,$FilePathLabel,$idValue,$descriptionValue,$description, $type, $typeValue, $silo, $siloValue, $button))

#region gui events {

function SubmitForm(){


    if($fileId.checked -eq $true){
        sc -path $filePath.Text -stream $fileId.text -value $idValue.Text
    }

    if($description.checked -eq $true){
        sc -path $filePath.Text -stream $description.text -value $descriptionValue.text
    }

    if($type.checked -eq $true){
        sc -path $filePath.Text -stream $type.text -value $typeValue.text
    }

    if($silo.checked -eq $true){
        sc -path $filePath.Text -stream $silo.text -value $siloValue.text
    }


    [System.Windows.Forms.MessageBox]::Show("Successfully Added Attributes")
}
#Add Button event 
    $Button.Add_Click({SubmitForm})

#endregion events }

#endregion GUI }



# logic here


[void]$Form.ShowDialog()

目前,用户必须从根文件夹实际运行 powershell 脚本,然后将文件路径添加到 GUI 的文本输入中,以及其余的扩展属性。我目前拥有的一个例子如下:

enter image description here

我希望用户能够右键单击任何文件,并让表单提供在 Windows 资源管理器中右键单击的文件的路径,而不是由个人手动输入对备用文件进行更新的路径数据流。类似于如何使用 zip7 提取文件(下面的示例)。

enter image description here

有人能告诉我这是否可能吗?我应该尝试用另一种语言而不是使用 powershell 来解决这个问题吗?

最佳答案

您可以使用 Powershell 完成所有这些工作。

首先,您要从您的代码创建一个脚本,并为所选文件夹设置输入参数。像这样:

param($FileName)
<# 
This script is a GUI featured way to add extended attributes to files 
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

#region begin GUI{ 

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '600,600'
$Form.text                       = "Add Extended Attributes"
$Form.TopMost                    = $false

# Add Extended Attributes Label
$mainLabel                       = New-Object system.Windows.Forms.Label
$mainLabel.text                  = "Add Extended Attributes"
$mainLabel.AutoSize              = $true
$mainLabel.width                 = 25
$mainLabel.height                = 10
$mainLabel.location              = New-Object System.Drawing.Point(180,10)
$mainLabel.Font                  = 'Microsoft Sans Serif,18'

# text box for entering file path 
$filePath                        = New-Object system.Windows.Forms.TextBox
$filePath.multiline              = $false
$filePath.width                  = 300
$filePath.height                 = 20
$filePath.location               = New-Object System.Drawing.Point(200,80)
$filePath.Font                   = 'Microsoft Sans Serif,10'
$filePath.Text                   = $FileName

# label for the file path text box "File Path: "
$FilePathLabel                   = New-Object system.Windows.Forms.Label
$FilePathLabel.text              = "File Path: "
$FilePathLabel.AutoSize          = $true
$FilePathLabel.width             = 25
$FilePathLabel.height            = 10
$FilePathLabel.location          = New-Object System.Drawing.Point(80,85)
$FilePathLabel.Font              = 'Microsoft Sans Serif,10'

# Attributes Label
$idLabel                         = New-Object system.Windows.Forms.Label
$idLabel.text                    = "Attributes"
$idLabel.AutoSize                = $true
$idLabel.width                   = 25
$idLabel.height                  = 10
$idLabel.location                = New-Object System.Drawing.Point(80,150)
$idLabel.Font                    = 'Microsoft Sans Serif,12'

# Values Label
$valueLabel                      = New-Object system.Windows.Forms.Label
$valueLabel.text                 = "Value"
$valueLabel.AutoSize             = $true
$valueLabel.width                = 25
$valueLabel.height               = 10
$valueLabel.location             = New-Object System.Drawing.Point(300,150)
$valueLabel.Font                 = 'Microsoft Sans Serif,12'

# Checkbox for ID attribute
$fileId                          = New-Object System.Windows.Forms.CheckBox
$fileId.text                     = "Id"
$fileId.AutoSize                 = $true
$fileId.width                    = 104
$fileId.height                   = 20
$fileId.location                 = New-Object System.Drawing.Point(100,200)
$fileId.Font                     = 'Microsoft Sans Serif,10'

# Label for the ID checkbox
$idValue                         = New-Object system.Windows.Forms.TextBox
$idValue.multiline               = $false
$idValue.width                   = 300
$idValue.height                  = 20
$idValue.location                = New-Object System.Drawing.Point(202,200)
$idValue.Font                    = 'Microsoft Sans Serif,10'

# Checkbox for Description attribute
$description                      = New-Object System.Windows.Forms.CheckBox
$description.text                 = "Description"
$description.AutoSize             = $true
$description.width                = 104
$description.height               = 20
$description.location             = New-Object System.Drawing.Point(100,250)
$description.Font                 = 'Microsoft Sans Serif,10'

# Label for the Description checkbox
$descriptionValue                 = New-Object system.Windows.Forms.TextBox
$descriptionValue.multiline       = $false
$descriptionValue.width           = 300
$descriptionValue.height          = 20
$descriptionValue.location        = New-Object System.Drawing.Point(202,250)
$descriptionValue.Font            = 'Microsoft Sans Serif,10'

# Checkbox for Type attribute
$type                             = New-Object System.Windows.Forms.CheckBox
$type.text                        = "Type"
$type.AutoSize                    = $true
$type.width                       = 104
$type.height                      = 20
$type.location                    = New-Object System.Drawing.Point(100,300)
$type.Font                        = 'Microsoft Sans Serif,10'

# Label for the type checkbox
$typeValue                        = New-Object system.Windows.Forms.TextBox
$typeValue.multiline              = $false
$typeValue.width                  = 300
$typeValue.height                 = 20
$typeValue.location               = New-Object System.Drawing.Point(202,300)
$typeValue.Font                   = 'Microsoft Sans Serif,10'

# Checkbox for silo attribute
$silo                             = New-Object System.Windows.Forms.CheckBox
$silo.text                        = "Silo"
$silo.AutoSize                    = $true
$silo.width                       = 104
$silo.height                      = 20
$silo.location                    = New-Object System.Drawing.Point(100,350)
$silo.Font                        = 'Microsoft Sans Serif,10'

# Label for the silo checkbox
$siloValue                        = New-Object system.Windows.Forms.TextBox
$siloValue.multiline              = $false
$siloValue.width                  = 300
$siloValue.height                 = 20
$siloValue.location               = New-Object System.Drawing.Point(202,350)
$siloValue.Font                   = 'Microsoft Sans Serif,10'

# submitt button 
$button                           = New-Object System.Windows.Forms.Button
$button.text                      = "Submit"
$button.AutoSize                  = $true
$button.location                  = New-Object System.Drawing.Point(250,500)
$button.Font                      = 'Microsoft Sans Serif,10'



$Form.controls.AddRange(@($mainLabel, $fileId,$filePath,$idLabel,$valueLabel,$FilePathLabel,$idValue,$descriptionValue,$description, $type, $typeValue, $silo, $siloValue, $button))

#region gui events {

function SubmitForm(){


    if($fileId.checked -eq $true){
        sc -path $filePath.Text -stream $fileId.text -value $idValue.Text
    }

    if($description.checked -eq $true){
        sc -path $filePath.Text -stream $description.text -value $descriptionValue.text
    }

    if($type.checked -eq $true){
        sc -path $filePath.Text -stream $type.text -value $typeValue.text
    }

    if($silo.checked -eq $true){
        sc -path $filePath.Text -stream $silo.text -value $siloValue.text
    }


    [System.Windows.Forms.MessageBox]::Show("Successfully Added Attributes")
}
#Add Button event 
    $Button.Add_Click({SubmitForm})

#endregion events }

#endregion GUI }



# logic here


[void]$Form.ShowDialog()

接下来,您需要根据它为上下文菜单项和 powershell 脚本创建注册表引用。像这样:
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
New-Item HKCR:\directory\shell\PowerShellScript
New-Item HKCR:\directory\shell\PowerShellScript\command
Set-ItemProperty 'HKCR:\directory\shell\PowerShellScript\command' -Name '(default)' -Value 'Powershell -WindowStyle Hidden -ExecutionPolicy Bypass -NoExit -File "C:\Test.ps1" "%L"'

上下文菜单项:

enter image description here

选择的目录传递给脚本的输入参数:

enter image description here

关于powershell - 通过右键单击文件运行 GUI powershell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52487575/

相关文章:

regex - PowerShell -replace 获取两个不同字符之间的字符串

windows - 在 txt 文件后面运行 exe 文件

Powershell - 列出一个目录中的所有备用数据流信息

c# - 此 PInvoke 代码是否正确可靠?

powershell - 查找下一个可用的计算机名称

powershell - 如何检查在 Windows Server 2008 R2 上启用了哪个 SMB 版本

windows - 在文件夹名称中创建一个带有空格和正斜杠的新注册表文件夹

powershell - 检查帐户是否是本地组的成员并在 powershell 2.0 中执行 IF/ELSE

c# - 工作 C# 示例 : Writing & Reading NTFS Alternate Data Stream Under Win7 64 bit