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

Powershell脚本在控制台窗口中从文件资源管理器报告执行策略错误,powershell,executionpolicy,Powershell,Executionpolicy,我的脚本在ISE中运行良好,但不在PowerShell控制台窗口中运行 我试图用“替换任何”(以防万一是编码错误,但我不确定) 编辑:脚本在复制并粘贴到控制台时工作,但在使用控制台打开时不工作 这是脚本,ZAOCC.ps1: $path = '\\auisasvc2k801\safe\Information Technology\Support\Powershell\ZAOCC\Excel' $path2 = '\\auisasvc2k801\safe\Information Technolog

我的脚本在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

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

请注意,这样做将在脚本退出时自动关闭控制台窗口,该窗口打开以运行脚本

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

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


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

尝试在进程级别设置执行-
设置执行策略-作用域进程旁路
-是快捷菜单命令定义所使用的命令行的一部分,触发错误的是命令行,而不是脚本

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

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

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

一般来说,特别是当控制台窗口在脚本终止时自动关闭(由于任何原因),请考虑不要使用这个直接调用特性。

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


如果仍要通过文件资源管理器调用脚本并避免出现错误消息,只需删除设置执行策略的尝试,即可修改注册表中的快捷菜单命令定义

定义位于
HKEY\U CLASSES\U 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] 一般来说,消息不应该是一个错误;它应该是一个警告,正如中所建议的。但是,为了向后兼容,决定保留当前行为。

已编辑的帖子已更新,并显示错误消息。@h0pper您当前的执行策略是什么?RemoteSigned@RoshanDoes此回答您的问题吗?