Запустите скрипт PowerShell GUI, щелкнув правой кнопкой мыши по файлу - PullRequest
0 голосов
/ 25 сентября 2018

Я создал скрипт powershell с использованием графического интерфейса .net, который предоставляет пользователю графический интерфейс для добавления альтернативных потоков данных (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 из корневой папки, а затем добавить путь к файлу к тексту.введите графический интерфейс вместе с остальными расширенными атрибутами.Ниже приведен пример того, что у меня есть:

enter image description here

Я бы хотел, чтобы пользователь мог щелкнуть правой кнопкой мыши по любому файлу и получить формупуть к файлу, по которому щелкнули правой кнопкой мыши в проводнике Windows, вместо того, чтобы вручную вводить путь человеку, который обновляет альтернативные потоки данных.Что-то похожее на то, как вы извлекаете файл, используя zip7 (пример ниже).

enter image description here

Может кто-нибудь сказать мне, возможно ли это?Должен ли я пытаться решить эту проблему на другом языке, кроме использования powershell?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете сделать все это с помощью 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

...