PowerShell脚本报错:FilePath参数为空,求卸载程序路径指定方法
解决PowerShell脚本中指定卸载程序路径的问题
你的脚本出现$Install_Path为空的错误,核心是变量赋值和函数调用的顺序错误,以下是具体修正步骤:
原脚本的关键错误
- 变量赋值语法错误:你在变量赋值前加了未定义的
Writelog命令,导致$Install_File和$Install_Path根本没有被正确赋值,所以Start-Process的FilePath参数为空。 - 多余的路径引号:手动给
$Install_Path添加转义引号是不必要的,Start-Process会自动处理带空格的路径。 - 函数定义顺序错误:日志函数
Set-WriteToLog定义在变量赋值之后,导致前面的Writelog调用会报错(虽然你的错误日志里没体现,但实际运行会触发)。
修正后的完整脚本
$OutputFile = "$env:WINDIR\TEMP\Python3.7.8Install.log" ##########ERROR LOGGING##### Function Set-WriteToLog ($Write1) { Write-Host "$(Get-Date -format yyyy-MM-dd-hh-mm-ss)`t-`t$Write1" } #########START OF SCRIPT BODY############# # 正确定义要卸载的程序文件名 $Install_File = "python-3.7.8-amd64.exe" # 用Join-Path安全拼接路径,避免手动拼接的分隔符问题 $Install_Path = Join-Path -Path $PSScriptRoot -ChildPath $Install_File # 检查$PSScriptRoot是否为空(比如脚本直接在控制台/ISE中运行的情况) if (-not $PSScriptRoot) { Set-WriteToLog "错误:脚本未作为文件运行,无法获取$PSScriptRoot路径" Exit 1 } # 验证文件是否存在 if (-not (Test-Path -Path $Install_Path -PathType Leaf)) { Set-WriteToLog "错误:找不到卸载程序文件:$Install_Path" Exit 1 } $Install_Args = "/quiet /uninstall" Start-Transcript -Path $OutputFile Set-WriteToLog "开始卸载 $Install_File" $Process1 = Start-Process -FilePath $Install_Path -ArgumentList $Install_Args -Wait -NoNewWindow -PassThru $ErrorVal = $Process1.ExitCode If (@(0,1641,3010) -contains $ErrorVal) { Set-WriteToLog "成功 - 卸载 $Install_File,退出码:$ErrorVal" } else { Set-WriteToLog "错误 - 卸载失败,退出码:$ErrorVal" } Stop-Transcript Exit $LASTEXITCODE
关键要点说明
$PSScriptRoot的正确使用:- 只有当脚本以文件形式运行(比如通过
powershell.exe -File .\UpdatePython.ps1或双击脚本)时,$PSScriptRoot才会返回脚本所在的目录路径。如果直接在控制台或ISE中粘贴运行脚本,$PSScriptRoot会为空,所以必须添加判断。
- 只有当脚本以文件形式运行(比如通过
- 路径拼接用
Join-Path:- 相比手动字符串拼接,
Join-Path会自动处理路径分隔符(比如Windows的\),避免出现类似C:\Scripts\\python.exe的错误路径。
- 相比手动字符串拼接,
- 提前验证文件存在:
- 在调用
Start-Process前,用Test-Path检查文件是否存在,能提前捕获文件缺失的问题,避免后续报错。
- 在调用
内容的提问来源于stack exchange,提问作者GrayVi02
相关产品推荐
相关产品推荐

