在不首先运行VB脚本的情况下运行Powershell脚本时出现问题

在不首先运行VB脚本的情况下运行Powershell脚本时出现问题,powershell,vbscript,Powershell,Vbscript,我正在寻找一个解决方案,用PS将快捷方式或程序固定到win 10中的任务上。我发现。VB脚本可以工作 If WScript.Arguments.Count < 1 Then WScript.Quit '---------------------------------------------------------------------- Set objFSO = CreateObject("Scripting.FileSystemObject") objFile = WScrip

我正在寻找一个解决方案,用PS将快捷方式或程序固定到win 10中的任务上。我发现。VB脚本可以工作

If WScript.Arguments.Count < 1 Then WScript.Quit
'----------------------------------------------------------------------
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFile    = WScript.Arguments.Item(0)
sKey1      = "HKCU\Software\Classes\*\shell\{:}\\"
sKey2      = Replace(sKey1, "\\", "\ExplorerCommandHandler")
'----------------------------------------------------------------------
With WScript.CreateObject("WScript.Shell")
    KeyValue = .RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" & _
    "\CommandStore\shell\Windows.taskbarpin\ExplorerCommandHandler")

   .RegWrite sKey2, KeyValue, "REG_SZ"

    With WScript.CreateObject("Shell.Application")
        With .Namespace(objFSO.GetParentFolderName(objFile))
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
            End With
        End With
    End With

    .Run("Reg.exe delete """ & Replace(sKey1, "\\", "") & """ /F"), 0, True
End With
'----------------------------------------------------------------------
但是,除非VB脚本至少运行过一次,否则此PS脚本将不会运行。有没有一种方法可以让PS脚本在不运行VB脚本的情况下工作

在尝试运行PS脚本时,在尝试之前至少运行一次VB脚本时出现的错误:

You cannot call a method on a null-valued expression.
At \\server\Utilities\TaskbarPin.ps1:41 char:5
+     $Key3 = $Key2.CreateSubKey($KeyPath3, $true)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At \\server\Utilities\TaskbarPin.ps1:42 char:5
+     $Key4 = $Key3.CreateSubKey($KeyPath4, $true)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At \\server\Utilities\TaskbarPin.ps1:43 char:5
+     $Key4.SetValue($KeyValue, $ValueData)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At \\server\Utilities\TaskbarPin.ps1:50 char:5
+     $Key3.DeleteSubKey($KeyPath4)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

在使用VB脚本执行任务一次后,我没有收到任何错误。

您不应该受到这种方式的影响。 代码按设计工作,但必须完全调用exe的路径

我只是将它转换为一个函数,它是成功的,没有其他依赖项

Function Add-AppToTaskbar
{
    [cmdletbinding()]

    Param
    (
        [string]$Target
    )

    $KeyPath1  = "HKCU:\SOFTWARE\Classes"
    $KeyPath2  = "*"
    $KeyPath3  = "shell"
    $KeyPath4  = "{:}"
    $ValueName = "ExplorerCommandHandler"
    $ValueData =
        (Get-ItemProperty `
            ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\" + `
                "CommandStore\shell\Windows.taskbarpin")
        ).ExplorerCommandHandler

    $Key2 = (Get-Item $KeyPath1).OpenSubKey($KeyPath2, $true)
    $Key3 = $Key2.CreateSubKey($KeyPath3, $true)
    $Key4 = $Key3.CreateSubKey($KeyPath4, $true)
    $Key4.SetValue($ValueName, $ValueData)

    $Shell = New-Object -ComObject "Shell.Application"
    $Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
    $Item = $Folder.ParseName((Get-Item $Target).Name)
    $Item.InvokeVerb("{:}")

    $Key3.DeleteSubKey($KeyPath4)
    if ($Key3.SubKeyCount -eq 0 -and $Key3.ValueCount -eq 0) 
    {$Key2.DeleteSubKey($KeyPath3)}
}

Add-AppToTaskbar -Target 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
顺便说一句,这些固定的东西在您的系统中的两个位置:

在这里:

$env:USERPROFILE\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
注册处:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband
两者都是必需的

根据OP的评论进行更新

我刚刚在本地和远程运行了这个,两个都成功了。见下面的结果。 我正在使用的本地主机-WS2012R2设置为工作站角色 我的实验室里没有任何W10系统。之前的测试是在本地W10主机上进行的

在控制台主机、ISE和VSCode中执行

PS C:\Windows\system32> $env:COMPUTERNAME
LabWS01

# PS Version
PS C:\Windows\system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.18968
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2


# the current user profile pinned location filtered for notepad*

PS C:\Windows\system32> Get-ChildItem -Path "$env:USERPROFILE\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Notepad*"

# Tested path to remote share

PS C:\Windows\system32> Test-path -Path '\\Server\ShareName\Add-AppToTaskbar.ps1'
True

# Ran the script from that remote share

PS C:\Windows\system32> \\Server\ShareName\Add-AppToTaskbar.ps1 'c:\windows\notepad.exe'
或者这样

Start-process -FilePath Powershell -ArgumentList '\\Server\ShareName\Add-AppToTaskbar.ps1 -Target C:\Windows\notepad.exe'

# Review pinned item location, filtered for notepad*

PS C:\Windows\system32> Get-ChildItem -Path "$env:USERPROFILE\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Notepad*"


    Directory: C:\Users\Labuser001\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---          8/9/2018   8:48 PM        791 Notepad.lnk
快捷方式显示固定到任务栏的内容


所以,从你的角度来说,这听起来很环保。现在,如果此问题继续存在,您可以使用GPO锁定应用。

我已修改了您的功能,以便有选择地将项目锁定或取消锁定到任务栏。以前,问题是pin命令不是独占的,如果它已经被锁定,它将取消锁定应用程序。通过进一步检测二进制注册表值中固定的内容,可以确定该项已被固定,并且不会尝试两次固定该项

Set-AppPinStaskBarCSV是一个为我们的环境定制的功能,我只把它作为一个示例,如果有人想在登录脚本中推出它,以确保用户拥有他们需要的所有应用,它需要大量的修改和简化。它有一些未包含的函数,用于检查组成员资格并重新格式化字符串以扩展变量,这是不需要的。锁定应用程序后,如果资源管理器重新启动,它将更可靠地显示,如果任何项目被锁定,Csv函数将重新启动资源管理器

Function Set-PinTaskbar {
Param (
    [parameter(Mandatory=$True, HelpMessage="Target item to pin")]
    [ValidateNotNullOrEmpty()]
    [string] $Target
    ,
    [Parameter(Mandatory=$False, HelpMessage="Target item to unpin")]
    [switch]$Unpin
)
If (!(Test-Path $Target)) {
    Write-Warning "$Target does not exist"
    Break
}

$Reg = @{}
$Reg.Key1 = "*"
$Reg.Key2 = "shell"
$Reg.Key3 = "{:}"
$Reg.Value = "ExplorerCommandHandler"
$Reg.Data = (Get-ItemProperty ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin")).ExplorerCommandHandler
$Reg.Path1 = "HKCU:\SOFTWARE\Classes"
$Reg.Path2 = Join-Path $Reg.Path1 $Reg.Key1
$Reg.Path3 = Join-Path $Reg.Path2 $Reg.Key2
$Reg.Path4 = Join-Path $Reg.Path3 $Reg.Key3

If (!(Test-Path -LiteralPath $Reg.Path2)) {
    New-Item -ItemType Directory -Path $Reg.Path1 -Name [System.Management.Automation.WildcardPattern]::Escape($Reg.Key1)
}
If (!(Test-Path -LiteralPath $Reg.Path3)) {
    New-Item -ItemType Directory -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path2)) -Name $Reg.Key2
}
If (!(Test-Path -LiteralPath $Reg.Path4)) {
    New-Item -ItemType Directory -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path3)) -Name $Reg.Key3
}
Set-ItemProperty -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path4)) -Name $Reg.Value -Value $Reg.Data

$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)

# Registry key where the pinned items are located
$RegistryKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband"
# Binary registry value where the pinned items are located
$RegistryValue = "FavoritesResolve"
# Gets the contents into an ASCII format
$CurrentPinsProperty = ([system.text.encoding]::ASCII.GetString((Get-ItemProperty -Path $RegistryKey -Name $RegistryValue | Select-Object -ExpandProperty $RegistryValue)))
# Filters the results for only the characters that we are looking for, so that the search will function
[string]$CurrentPinsResults = $CurrentPinsProperty -Replace '[^\x20-\x2f^\x30-\x3a\x41-\x5c\x61-\x7F]+', ''

# Globally Unique Identifiers for common system folders, to replace in the pin results
$Guid = @{}
$Guid.FOLDERID_ProgramFilesX86 = @{
    "ID" = "{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}"
    "Path" = ${env:ProgramFiles(x86)}
}
$Guid.FOLDERID_ProgramFilesX64 = @{
    "ID" = "{6D809377-6AF0-444b-8957-A3773F02200E}"
    "Path" = $env:ProgramFiles
}
$Guid.FOLDERID_ProgramFiles = @{
    "ID" = "{905e63b6-c1bf-494e-b29c-65b732d3d21a}"
    "Path" = $env:ProgramFiles
}
$Guid.FOLDERID_System = @{
    "ID" = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}"
    "Path" = Join-Path $env:WINDIR "System32"
}
$Guid.FOLDERID_Windows = @{
    "ID" = "{F38BF404-1D43-42F2-9305-67DE0B28FC23}"
    "Path" = $env:WINDIR
}

ForEach ($GuidEntry in $Guid.Keys) {
    $CurrentPinsResults = $CurrentPinsResults -replace $Guid.$GuidEntry.ID,$Guid.$GuidEntry.Path
}

$Split = $CurrentPinsResults -split ('C:')

$SplitOutput = @()
# Process each path entry, remove invalid characters, test to determine if the path is valid
ForEach ($Entry in $Split) {
    If ($Entry.Substring(0,1) -eq '\') {
        # Get a list of invalid path characters
        $InvalidPathCharsRegEx = [IO.Path]::GetInvalidPathChars() -join ''
        $InvalidPathChars = "[{0}]" -f [RegEx]::Escape($InvalidPathCharsRegEx)
        $EntryProcessedPhase1 = "C:" + ($Entry -replace $InvalidPathChars)
        $EntryProcessedPhase2 = $null
        # Remove characters from the path until it is resolvable
        ForEach ($Position in $EntryProcessedPhase1.Length .. 1) {
            If (Test-Path $EntryProcessedPhase1.Substring(0,$Position)) {
                $EntryProcessedPhase2 = $EntryProcessedPhase1.Substring(0,$Position)
                Break
            }
        }
        # If the path resolves, add it to the array of paths
        If ($EntryProcessedPhase2) {
            $SplitOutput += $EntryProcessedPhase2
        }
    }
}

$PinnedItems = @()
$Shell = New-Object -ComObject WScript.Shell
ForEach ($Path in $SplitOutput) {
    # Determines if the entry in the registry is a link in the standard folder, if it is, resolve the path of the shortcut and add it to the array of pinnned items
    If ((Split-Path $Path) -eq (Join-Path $env:USERPROFILE "AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar")) {
        $Shell.CreateShortcut($Path).TargetPath
        $PinnedItems += $Shell.CreateShortcut($Path).TargetPath
    }
    Else {
        # If the link or executable is not in the taskbar folder, add it directly
        $PinnedItems += $Path
    }
}

# Unpin if the application is pinned
If ($Unpin.IsPresent) {
    If ($PinnedItems -contains $Target) {
        $Item.InvokeVerb("{:}")
        Write-Host "Unpinning application $Target"
    }
}
Else {
    # Only pin the application if it hasn't been pinned
    If ($PinnedItems -notcontains $Target) {
        $Item.InvokeVerb("{:}")
        Write-Host "Pinning application $Target"
    }
}

# Remove the registry key and subkeys required to pin the application
If (Test-Path $Reg.Path3) {
    Remove-Item -LiteralPath $Reg.Path3 -Recurse
}
}


}

所以我使用了“PS c:\>\\Server\Utilities\TaskbarPin.ps1'c:\windows\notepad.exe'”并得到了错误,无论我尝试了多少次(在多台W10机器上验证)。然后我会使用“PS c:\>wscript.exe\\server\utilities\TaskbarPin.vbs'c:\windows\notepad.exe'”这将起作用。最后,我再次使用了“PS c:\>\\Server\Utilities\TaskbarPin.ps1'c:\windows\notepad.exe'”,它可以正常工作。很奇怪,我的家用电脑上没有这个问题。我将尝试cmdlet方法,看看是否有效。在运行VBS后,尝试从“修复”自身的UNC路径运行它可能会出现问题。我只是在实验室本地和远程服务器上的共享中这样做的。请看我的更新。谢谢你的帮助。不幸的是,如果不先运行VBS,我就无法使脚本正常工作。我尝试手动固定,然后运行脚本,但没有成功。我能想到的唯一可能的原因是VBS正在注册表中创建PS无法创建的东西。我不能使用GPO,因为我没有设置GPO的权限。我将只从PS调用VBS。我还从powershell执行其他操作,否则我将只使用wscript。
Function Set-PinTaskbar {
Param (
    [parameter(Mandatory=$True, HelpMessage="Target item to pin")]
    [ValidateNotNullOrEmpty()]
    [string] $Target
    ,
    [Parameter(Mandatory=$False, HelpMessage="Target item to unpin")]
    [switch]$Unpin
)
If (!(Test-Path $Target)) {
    Write-Warning "$Target does not exist"
    Break
}

$Reg = @{}
$Reg.Key1 = "*"
$Reg.Key2 = "shell"
$Reg.Key3 = "{:}"
$Reg.Value = "ExplorerCommandHandler"
$Reg.Data = (Get-ItemProperty ("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin")).ExplorerCommandHandler
$Reg.Path1 = "HKCU:\SOFTWARE\Classes"
$Reg.Path2 = Join-Path $Reg.Path1 $Reg.Key1
$Reg.Path3 = Join-Path $Reg.Path2 $Reg.Key2
$Reg.Path4 = Join-Path $Reg.Path3 $Reg.Key3

If (!(Test-Path -LiteralPath $Reg.Path2)) {
    New-Item -ItemType Directory -Path $Reg.Path1 -Name [System.Management.Automation.WildcardPattern]::Escape($Reg.Key1)
}
If (!(Test-Path -LiteralPath $Reg.Path3)) {
    New-Item -ItemType Directory -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path2)) -Name $Reg.Key2
}
If (!(Test-Path -LiteralPath $Reg.Path4)) {
    New-Item -ItemType Directory -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path3)) -Name $Reg.Key3
}
Set-ItemProperty -Path ([System.Management.Automation.WildcardPattern]::Escape($Reg.Path4)) -Name $Reg.Value -Value $Reg.Data

$Shell = New-Object -ComObject "Shell.Application"
$Folder = $Shell.Namespace((Get-Item $Target).DirectoryName)
$Item = $Folder.ParseName((Get-Item $Target).Name)

# Registry key where the pinned items are located
$RegistryKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband"
# Binary registry value where the pinned items are located
$RegistryValue = "FavoritesResolve"
# Gets the contents into an ASCII format
$CurrentPinsProperty = ([system.text.encoding]::ASCII.GetString((Get-ItemProperty -Path $RegistryKey -Name $RegistryValue | Select-Object -ExpandProperty $RegistryValue)))
# Filters the results for only the characters that we are looking for, so that the search will function
[string]$CurrentPinsResults = $CurrentPinsProperty -Replace '[^\x20-\x2f^\x30-\x3a\x41-\x5c\x61-\x7F]+', ''

# Globally Unique Identifiers for common system folders, to replace in the pin results
$Guid = @{}
$Guid.FOLDERID_ProgramFilesX86 = @{
    "ID" = "{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}"
    "Path" = ${env:ProgramFiles(x86)}
}
$Guid.FOLDERID_ProgramFilesX64 = @{
    "ID" = "{6D809377-6AF0-444b-8957-A3773F02200E}"
    "Path" = $env:ProgramFiles
}
$Guid.FOLDERID_ProgramFiles = @{
    "ID" = "{905e63b6-c1bf-494e-b29c-65b732d3d21a}"
    "Path" = $env:ProgramFiles
}
$Guid.FOLDERID_System = @{
    "ID" = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}"
    "Path" = Join-Path $env:WINDIR "System32"
}
$Guid.FOLDERID_Windows = @{
    "ID" = "{F38BF404-1D43-42F2-9305-67DE0B28FC23}"
    "Path" = $env:WINDIR
}

ForEach ($GuidEntry in $Guid.Keys) {
    $CurrentPinsResults = $CurrentPinsResults -replace $Guid.$GuidEntry.ID,$Guid.$GuidEntry.Path
}

$Split = $CurrentPinsResults -split ('C:')

$SplitOutput = @()
# Process each path entry, remove invalid characters, test to determine if the path is valid
ForEach ($Entry in $Split) {
    If ($Entry.Substring(0,1) -eq '\') {
        # Get a list of invalid path characters
        $InvalidPathCharsRegEx = [IO.Path]::GetInvalidPathChars() -join ''
        $InvalidPathChars = "[{0}]" -f [RegEx]::Escape($InvalidPathCharsRegEx)
        $EntryProcessedPhase1 = "C:" + ($Entry -replace $InvalidPathChars)
        $EntryProcessedPhase2 = $null
        # Remove characters from the path until it is resolvable
        ForEach ($Position in $EntryProcessedPhase1.Length .. 1) {
            If (Test-Path $EntryProcessedPhase1.Substring(0,$Position)) {
                $EntryProcessedPhase2 = $EntryProcessedPhase1.Substring(0,$Position)
                Break
            }
        }
        # If the path resolves, add it to the array of paths
        If ($EntryProcessedPhase2) {
            $SplitOutput += $EntryProcessedPhase2
        }
    }
}

$PinnedItems = @()
$Shell = New-Object -ComObject WScript.Shell
ForEach ($Path in $SplitOutput) {
    # Determines if the entry in the registry is a link in the standard folder, if it is, resolve the path of the shortcut and add it to the array of pinnned items
    If ((Split-Path $Path) -eq (Join-Path $env:USERPROFILE "AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar")) {
        $Shell.CreateShortcut($Path).TargetPath
        $PinnedItems += $Shell.CreateShortcut($Path).TargetPath
    }
    Else {
        # If the link or executable is not in the taskbar folder, add it directly
        $PinnedItems += $Path
    }
}

# Unpin if the application is pinned
If ($Unpin.IsPresent) {
    If ($PinnedItems -contains $Target) {
        $Item.InvokeVerb("{:}")
        Write-Host "Unpinning application $Target"
    }
}
Else {
    # Only pin the application if it hasn't been pinned
    If ($PinnedItems -notcontains $Target) {
        $Item.InvokeVerb("{:}")
        Write-Host "Pinning application $Target"
    }
}

# Remove the registry key and subkeys required to pin the application
If (Test-Path $Reg.Path3) {
    Remove-Item -LiteralPath $Reg.Path3 -Recurse
}
Function Set-PinTaskbarCsv {
Param (
    [Parameter(Mandatory=$true)]
    $PinHashTable
    ,
    [Parameter(Mandatory=$true)]
    $UnpinHashTable
)
$Organization = "LIHC"
$RootRegistry = "HKCU:\Software\" + $Organization
$RootRegistryPinned = Join-Path $RootRegistry "Pinned"
# Unpin applications from taskbar
ForEach ($Entry in $UnpinHashTable.Keys) {
    $Location = Format-VariablesString -String $UnpinHashTable.$Entry.Location
    Add-Log "Taskbar app unpinned" $Location
    Set-PinTaskbar -Target $Location -Unpin
}

# Pin applications to taskbar
$Groups = @("Group1","Group2","Group3","Group4","Group5")
ForEach ($Entry in $PinHashTable.Keys) {
    $Entry
    $Location = Format-VariablesString -String $PinHashTable.$Entry.Location
    $ToTaskbar = [string]::IsNullOrWhiteSpace($PinHashTable.$Entry.Group1)
    ForEach ($Group in $Groups) {
        If (!([string]::IsNullOrWhiteSpace($PinHashTable.$Entry.$Group))) {
            $ToTaskbar = (Get-UserGroups -Username $env:USERNAME -Group $PinHashTable.$Entry.$Group) -or $ToTaskbar
        }
    }        
    If (!([string]::IsNullOrWhiteSpace($PinHashTable.$Entry.TestPath))) {
        $ToTaskbar = ((Test-Path $PinHashTable.$Entry.TestPath) -or (Test-Path $PinHashTable.$Entry.TestPath2)) -and $true
    }
    If ($ToTaskbar -and (Test-Path $Location) -and (!(Get-ItemProperty $RootRegistryPinned $Location -ErrorAction SilentlyContinue))) {
        #Set-AppPinTaskbar -Application $Location
        Set-PinTaskbar -Target $Location
        Add-Log "Taskbar app Pinned" $Location
        New-ItemProperty -Path $RootRegistryPinned -Name $Location 2>&1 > $null
        $Status = $true
    }
}
If ($Status) {
    Get-Process -Name explorer | Stop-Process
    Start-Process -FilePath explorer.exe
}