Powershell 脚本在文件资源管理器的控制台窗口中报告执行策略错误

标签 powershell executionpolicy

我的脚本在 ISE 中运行良好,但在 PowerShell 控制台窗口中运行不佳。

我尝试将任何 " 替换为 ' (以防万一它是编码错误,但我不确定)。

编辑:该脚本在复制并粘贴到控制台时有效,但在使用控制台打开时无效。

这是脚本,ZAOCC.ps1:

$path = '\\auisasvc2k801\safe\Information Technology\Support\Powershell\ZAOCC\Excel'
$path2 = '\\auisasvc2k801\safe\Information Technology\Support\Powershell\ZAOCC\PDF'
$xlFixedFormat = 'Microsoft.Office.Interop.Excel.xlFixedFormatType' -as [type]
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse
$objExcel = New-Object -ComObject excel.application
$objExcel.visible = $false
$date = Get-Date -Format 'dd.MM.yyyy'

foreach($workbook in $excelFiles)
{
    $filepath = Join-Path -Path $path2 -ChildPath ('Mine Control Record - ' + $date + '.pdf')
    $workbook = $objExcel.workbooks.open($workbook.fullname, 3)
    $workbook.Saved = $true
    'Saving $filepath'
    $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath)
    $objExcel.Workbooks.close()
}



$objExcel.Quit()

这是错误消息:

Set-ExecutionPolicy : Windows PowerShell updated your execution policy successfully, but the setting is overridden by
a policy defined at a more specific scope.  Due to the override, your shell will retain its current effective
execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings. For more
information please see "Get-Help Set-ExecutionPolicy".
At line:1 char:46
+ ...  -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & "\ ...
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
    + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

最佳答案

错误消息表明您正在使用快捷菜单的 Run with PowerShell 从文件资源管理器运行脚本。命令(使用Windows PowerShell;请注意,PowerShell [Core] (v6+) 不再提供此命令 - 请参阅中间部分)。

请注意,这样做会在脚本退出时自动关闭为运行脚本而打开的控制台窗口。

为避免这种情况,请先打开 Windows PowerShell 控制台窗口,然后从那里运行脚本 - 这也将使您的问题消失。

(另一个选项是修改快捷菜单命令定义,如下所示。)


错误的原因是您的执行策略是由计算机级或用户级组策略设置的,该策略优先于设置执行策略的尝试在流程级别
事实上,您不能从用户代码覆盖通过组策略设置的执行策略,也不能使用Set-ExecutionPolicy调用或通过 -ExecutionPolicy CLI 参数。

尝试在进程级别设置执行 - Set-ExecutionPolicy -Scope Process Bypass - 是快捷菜单命令定义使用的命令行的一部分,并且正是它(而不是您的脚本)触发了错误。

因此,每次从文件资源管理器直接调用脚本时,错误消息都会出现在通过组策略定义执行策略的任何系统上。

请注意,在这种情况下,错误消息令人困惑,声称该命令“成功更新了您的执行策略”,而实际上它没有效果。

另请注意,该错误是一个语句终止错误[1],这意味着整体执行仍然继续,并且您的脚本尽管出现错误,但仍被调用 - 假设组策略集执行策略允许。

一般来说,特别是考虑到脚本终止时控制台窗口会自动关闭(无论出于何种原因),请考虑使用此直接调用功能。

事实上,PowerShell [Core] (v6+) 甚至不再提供此快捷菜单命令,而是在目录/驱动器中提供命令级别以打开交互式 session 那里


如果您仍然想通过文件资源管理器调用脚本并希望避免错误消息,您可以通过简单地删除设置执行的尝试来修改注册表中的快捷菜单命令定义政策。

定义位于 HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command并且修改它需要提升(以管理员身份运行);但是,也可以创建用户级定义。

以下命令重新定义快捷菜单命令定义,以便 Set-ExecutionPolicy不再被称为:

# NOTE: Requires elevation:
Set-ItemProperty registry::HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command '(default)' @'
powershell.exe -NoLogo -File "%1"
'@

如果您还想保持窗口打开,请添加 -NoExit作为第一个参数。


[1] 一般来说,该消息根本不应该是一个错误;它应该是一个警告,如 this GitHub issue 中所建议的那样。但是,为了向后兼容,决定保留当前行为。

关于Powershell 脚本在文件资源管理器的控制台窗口中报告执行策略错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62747860/

相关文章:

git - 使用 posh-git 将远程名称添加到 PowerShell 提示符

c# - PowerShell - 从 .csproj 文件获取版本

windows - Jenkins 执行 PowerShell 脚本

powershell - 自提升脚本+执行策略

powershell - Powershell-NewItemUnauthorizedAccessError

powershell bitstransfer 对象引用未设置为对象的实例

正则表达式在引号内

entity-framework - Visual Studio 无法加载 Entity Framework PowerShell 脚本,因为其操作被软件限制策略阻止

c# - 从 c# 运行仅签名的 powershell 脚本