我在尝试通过 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 不需要的额外功能?考虑到其他脚本的工作方式相同,我有点不知所措,虽然它比其他脚本长一点,但不是有什么不同吗。
如有任何帮助,我们将不胜感激!
检查问题是否出在
- InputFolder
之间的空格上
MyPipeline.Commands.AddScript("Update-PWFolderSecurity - InputFolder $folder -MemberType 'g' -MemberAccess 'fc' -MemberName 'Administrator' -DocumentSecurity -FolderSecurity")
我暂时搁置了这个项目,但最近又回来了。该解决方案来自 @Mathias R. Jessen 关于调用一次 AddScript 的引用。 我创建了一个由“Environment.NewLine”分隔的字符串来按照上面的方式构建它,然后在最后调用 AddScript 并且它起作用了。