PowerShell 脚本将在 Windows ISE 中运行,但不能在 Visual Studio 中运行

问题描述 投票:0回答:2

我在尝试通过 Visual Studio 运行 PowerShell 脚本和用 VB.NET 编写的程序时遇到一些问题。 该程序通过类似例程运行其他 PowerShell 脚本没有问题。

下面的脚本在 Windows PowerShell ISE 和 Visual Studio Code 中运行时都可以正常工作。

Set-ExecutionPolicy RemoteSigned -force
Import-Module pwps_dab -force
$AdminPwd = ConvertTo-SecureString '123456789' -AsPlainText -Force
New-pwlogin -UserName 'Admin' -Password $AdminPwd -DatasourceName 'perpw1.com.au:Per_Pwise_new'
            
$FolderPath = 'Archives\1800 - 1899\1899\'
$PWfolders = Get-PWFolders -FolderPath $FolderPath -Verbose
$ProjectAccessString  = '----r------'
$DocumentAccessString = '----r--R---'
foreach($folder in $PWfolders){
    $UAC = $Folder | Get-PWFolderSecurity | Where-Object -Property InheritingFrom -eq 'none (folder own permissions)'
    foreach($item in $UAC){
        $Splat_Update = @{
        InputFolder = $folder
        MemberType = $item.Type
        MemberName = $item.Name
    }
    If ($item.SecurityType -eq 'Document'){
        $Splat_Update.DocumentSecurity = $true
        $Splat_Update.MemberAccessString = $DocumentAccessString
    } else {
        $Splat_Update.FolderSecurity = $true
        $Splat_Update.MemberAccessString = $ProjectAccessString
    }
    Update-PWFolderSecurity @Splat_Update -Verbose
    Update-PWFolderSecurity -InputFolder $folder -MemberType 'g' -MemberAccess 'fc' -MemberName 'Administrator' -DocumentSecurity -FolderSecurity
    }
}

当我尝试在 Visual Studio 中运行相同的方法时(同时添加所需的代码以使 VS 处理命令),我收到错误

    Public Sub UpdateUACtoReadOnly(ByVal sFolderPath As String)
    Try
        Using MyRunSpace As Runspace = RunspaceFactory.CreateRunspace()
            MyRunSpace.Open()
            Using MyPipeline As Pipeline = MyRunSpace.CreatePipeline()
                MyPipeline.Commands.AddScript("Set-ExecutionPolicy RemoteSigned -force")
                MyPipeline.Commands.AddScript("Import-Module pwps_dab -force")
                MyPipeline.Commands.AddScript("$AdminPwd = ConvertTo-SecureString '123456789' -AsPlainText -Force")
                MyPipeline.Commands.AddScript("New-pwlogin -UserName 'Admin' -Password $AdminPwd -DatasourceName 'perpw1.com.au:Per_Pwise_new'")

                MyPipeline.Commands.AddScript("$FolderPath = 'Archives\1800 - 1899\1899\'")
                MyPipeline.Commands.AddScript("$PWfolders = Get-PWFolders -FolderPath $FolderPath -Verbose")
                MyPipeline.Commands.AddScript("$ProjectAccessString  = '----r------'")
                MyPipeline.Commands.AddScript("$DocumentAccessString = '----r--R---'")
                MyPipeline.Commands.AddScript("foreach($folder in $PWfolders){")
                MyPipeline.Commands.AddScript("$UAC = $Folder | Get-PWFolderSecurity | Where-Object -Property InheritingFrom -eq 'none (folder own permissions)'")
                MyPipeline.Commands.AddScript("foreach($item in $UAC){")
                MyPipeline.Commands.AddScript("$Splat_Update = @{")
                MyPipeline.Commands.AddScript("InputFolder = $folder")
                MyPipeline.Commands.AddScript("MemberType = $item.Type")
                MyPipeline.Commands.AddScript("MemberName = $item.Name")
                MyPipeline.Commands.AddScript("}")
                MyPipeline.Commands.AddScript("If ($item.SecurityType -eq 'Document'){")
                MyPipeline.Commands.AddScript("$Splat_Update.DocumentSecurity = $true")
                MyPipeline.Commands.AddScript("$Splat_Update.MemberAccessString = $DocumentAccessString")
                MyPipeline.Commands.AddScript("} else {")
                MyPipeline.Commands.AddScript("$Splat_Update.FolderSecurity = $true")
                MyPipeline.Commands.AddScript("$Splat_Update.MemberAccessString = $ProjectAccessString")
                MyPipeline.Commands.AddScript("}")
                MyPipeline.Commands.AddScript("Update-PWFolderSecurity @Splat_Update -Verbose")
                MyPipeline.Commands.AddScript("Update-PWFolderSecurity - InputFolder $folder -MemberType 'g' -MemberAccess 'fc' -MemberName 'Administrator' -DocumentSecurity -FolderSecurity")
                MyPipeline.Commands.AddScript("}")
                MyPipeline.Commands.AddScript("}")

                MyPipeline.Invoke()
                MyPipeline.Dispose()
            End Using
            MyRunSpace.Close()
        End Using
    Catch ex As Exception
        MsgBox("Error in Running Powershell Script:UpdateUACtoReadOnly" & Environment.NewLine & Environment.NewLine & ex.Message, MsgBoxStyle.Critical)
        End
    Finally

    End Try
End Sub

虽然我知道这个错误听起来很简单。我看不出在哪里添加额外的 },所有括号都已经关闭了。只是为了论证,我在脚本末尾添加了一个额外的 } 并得到了相同的结果。考虑到在 ISE 和 VScode 中运行的脚本,我很不知道问题是什么?是否存在 Visual Studio 需要而 PowerShell ISE 不需要的额外功能?考虑到其他脚本的工作方式相同,我有点不知所措,虽然它比其他脚本长一点,但不是有什么不同吗。

如有任何帮助,我们将不胜感激!

vb.net visual-studio powershell
2个回答
0
投票

检查问题是否出在

- InputFolder

之间的空格上
            MyPipeline.Commands.AddScript("Update-PWFolderSecurity - InputFolder $folder -MemberType 'g' -MemberAccess 'fc' -MemberName 'Administrator' -DocumentSecurity -FolderSecurity")

0
投票

我暂时搁置了这个项目,但最近又回来了。该解决方案来自 @Mathias R. Jessen 关于调用一次 AddScript 的引用。 我创建了一个由“Environment.NewLine”分隔的字符串来按照上面的方式构建它,然后在最后调用 AddScript 并且它起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.