2

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

1 回答 1

2

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

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

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

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


错误的原因是您的执行策略是由机器级别或用户级别的组策略设置的,它优先于在进程级别设置执行策略的尝试。
事实上,您不能通过用户代码中的组策略覆盖执行策略集,无论是Set-ExecutionPolicy通过调用还是通过-ExecutionPolicyCLI 参数。

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

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

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

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

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

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


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

定义在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] 一般来说,消息根本不应该是错误;它应该是一个警告,正如这个 GitHub 问题中所建议的那样。但是,为了向后兼容,决定保留当前行为。

于 2020-07-06T06:51:41.900 回答