You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell如何使用Start-Process调用共享文件并传递ExecutionPolicy Bypass参数

问题排查与解决方案

错误原因

  • 路径拼接语法错误:你在硬编码路径"\\server\dir\foo".ps1中将.ps1后缀放在了引号外侧,同时额外拼接了$MyInvocation.MyCommand.Name和多余的空字符串,最终生成的-File参数值是无效的错误路径,自然找不到文件。
  • 提权后PowerShell默认工作目录为C:\Windows\System32,如果未使用脚本的完整绝对路径,也会触发路径不存在报错。

修正后的实现代码

直接用$MyInvocation.MyCommand.Definition获取当前脚本的完整绝对UNC路径,不需要硬编码路径,同时正确添加执行策略绕过参数即可解决确认提示问题:

$principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if($principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) 
{
    # 原有业务逻辑保留即可
    Get-ChildItem | ForEach-Object {
        # 你的安装执行逻辑
    }
}
else 
{
    # 用数组传递参数可避免引号转义错误,比字符串拼接更稳定
    Start-Process -FilePath "powershell.exe" -ArgumentList @(
        "-ExecutionPolicy Bypass",
        "-NoProfile",
        "-File `"$($MyInvocation.MyCommand.Definition)`""
    ) -Verb RunAs
    # 提权启动后直接退出当前未授权的进程
    exit
}

优化建议

  • 如果你的脚本需要接收外部传入参数,可以在ArgumentList最后追加$args的序列化内容,避免提权后参数丢失。
  • 可以添加-WindowStyle Hidden参数到ArgumentList中,隐藏中间弹出的PowerShell窗口,优化使用体验。
  • 域环境下可通过组策略配置对应共享路径的脚本执行信任策略,不需要每次都加Bypass参数,安全性更高。

内容的提问来源于stack exchange,提问作者Mungle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:06:03