PowerShell脚本在ISE正常运行,双击执行报错的解决求助
问题:PowerShell脚本双击无法执行,ISE/终端运行正常
问题详情
脚本用于依次打开指定文件夹内的所有文件,最后最小化所有窗口,在PowerShell ISE和普通终端中运行正常,但资源管理器双击时直接闪退。已执行Set-ExecutionPolicy RemoteSigned,尝试添加Add-Type -AssemblyName System.Windows.Forms未解决问题。
原脚本代码
$folderPath = "C:\Users\Vlad\Dropbox\Demos" # 获取文件夹内所有文件列表 $files = Get-ChildItem $folderPath # 遍历文件并打开 foreach ($file in $files) { Invoke-Item $file.FullName Start-Sleep -Seconds 25 } # 最小化所有窗口 (New-Object -ComObject Shell.Application).MinimizeAll()
双击时的错误信息
C:\Users\Vlad\Dropbox\Demos : The term 'C:\Users\Vlad\Dropbox\Demos' is not recognized as the name of a cmdlet, function, script file, or operable program.
错误原因
核心问题是脚本编码不兼容PowerShell.exe的默认解析规则:
当脚本采用UTF-8无BOM编码时,双击运行(默认调用powershell.exe执行)会出现首行解析异常,导致$folderPath的赋值语句失效,PowerShell直接把路径字符串当成命令执行,从而抛出“未识别命令”的错误。
解决方案
方案1:修改脚本编码为UTF-8带BOM
- 用记事本打开脚本文件
- 点击「文件」→「另存为」
- 在「编码」下拉菜单中选择「UTF-8」(记事本的UTF-8默认带BOM)
- 覆盖原文件保存,之后双击即可正常执行
方案2:添加编码声明(兼容无BOM脚本)
在脚本最顶部添加PowerShell编码声明,强制指定编码:
#Requires -Version 5.1 # -*- coding: utf-8 -*- $folderPath = "C:\Users\Vlad\Dropbox\Demos" # 获取文件夹内所有文件列表 $files = Get-ChildItem $folderPath # 遍历文件并打开 foreach ($file in $files) { Invoke-Item $file.FullName Start-Sleep -Seconds 25 } # 最小化所有窗口 (New-Object -ComObject Shell.Application).MinimizeAll()
验证
修改后双击脚本,PowerShell窗口不会闪退,会按预期依次打开文件夹内的文件,每打开一个等待25秒,最后自动最小化所有窗口。
内容的提问来源于stack exchange,提问作者Vold
相关产品推荐
相关产品推荐

