如何在管理员权限下向PowerShell脚本传递变量参数?
这个问题我太熟了!你碰到的核心问题是单引号字符串里的变量不会被PowerShell解析,再加上Start-Process处理参数的特性,导致$var只是作为字面文本传进了新的PowerShell进程,而不是它的实际值test。
为什么会出现这个问题?
PowerShell里,单引号包裹的是字面量字符串——里面的任何变量、表达式都不会被解析,只会原封不动输出。你第一个命令里的'-noprofile -file "\\network path with spaces\file.ps1" $var '是单引号字符串,所以$var根本没被替换成test,直接作为字符串传给了新的PowerShell进程。
而第二个命令里你直接写了test,是字面量,所以能正常输出。
靠谱的解决方案
方案1:用数组传递参数(推荐,最省心)
Start-Process的ArgumentList支持直接传数组,每个元素对应一个独立参数,PowerShell会自动处理路径空格和变量解析,完全不用纠结引号转义:
$var = "test" Start-Process powershell -ArgumentList @('-noprofile', '-file', '\\network path with spaces\file.ps1', $var) -verb RunAs
这种方式把每个参数拆分开,$var会被提前解析成test,路径里的空格也会被正确识别,不会出现意外。
方案2:用双引号包裹参数并正确转义
如果习惯用字符串传参数,要改成双引号(让变量被解析),同时用反引号"转义路径里的双引号,确保带空格的路径被正确识别:
$var = "test" Start-Process powershell -ArgumentList "-noprofile -file `"\\network path with spaces\file.ps1`" $var" -verb RunAs
这里的"是PowerShell里的转义符,用来告诉解析器:这个双引号是路径的一部分,不是字符串的结束标记。
方案3:提前拼接好参数字符串
先把所有参数拼接成一个解析后的字符串,再传给ArgumentList,可读性更好:
$var = "test" $scriptPath = "\\network path with spaces\file.ps1" # 提前插值变量和路径,确保所有值都被解析 $arguments = "-noprofile -file `"$scriptPath`" $var" Start-Process powershell -ArgumentList $arguments -verb RunAs
总结
核心原则是:让变量在传递给Start-Process之前就被解析成实际值,而不是作为未解析的变量名传递。数组传参的方式最不容易出错,尤其是处理带空格的路径或复杂参数时,优先选它。
内容的提问来源于stack exchange,提问作者JIOB

