powershell中处理带空格路径和字符串需用英文双引号包裹路径并配合&调用,变量展开优先选双引号,单引号禁用展开;多行文本用here-string;获取脚本路径推荐split-path -parent $myinvocation.mycommand.definition。
在 powershell 中处理带空格的路径和字符串,核心就两条:引号用对、变量展开看清。不是加了引号就万事大吉,也不是所有引号都一样管用。
带空格路径必须用双引号包裹
PowerShell 把空格当命令分隔符。输入 C:\Program Files\app.exe,它会拆成 C:\Program(当命令)和 Files\app.exe(当参数),直接报错“term not recognized”。解决方法很简单:
- 用英文双引号包住整个路径:
"C:\Program Files\app.exe" - 调用时加
&符号也得把路径括起来:& "C:\Program Files\app.exe" - 千万别用中文引号、智能引号(如 “”),只认 ASCII 的
"(0x22) - 单引号虽然也能包裹路径,但会禁用变量展开,比如
'C:\$env:USERNAME\app.exe'不会替换用户名,容易出错
字符串里要留心变量是否需要展开
双引号字符串支持变量替换,单引号是纯字面量。选哪种,取决于你是不是想让 PowerShell 把 $var 换成真实值:
- 要用变量?用双引号:
"Hello, $env:USERNAME"→ 输出Hello, Alice - 变量名后紧跟标点?加花括号:
"${env:ProgramFiles}\MyApp\run.bat",避免识别混乱 - 想原样输出
$符号?前面加反引号:`$HOME就显示为$HOME,不展开 - 写多行文本?用 here-string:
@" 第一行 第二行 "@
,所有换行和空格都保留
获取脚本自身路径别只靠 $PSScriptRoot
$PSScriptRoot 看似方便,但在符号链接、远程会话或嵌套调用中可能返回错误路径。更可靠的做法是:
- 改用:
Split-Path -Parent $MyInvocation.MyCommand.Definition - 它基于脚本文件实际加载位置,不受工作目录或链接影响
- 尤其适合打包分发的脚本,或通过
Invoke-Command远程执行的场景 - 如果只是本地简单调用且无符号链接,
$PSScriptRoot仍可快速使用
传参含空格时也要引号保护
不只是路径,任何带空格的参数值都得加引号,否则会被切开:
- 错误:
Copy-Item C:\a.txt C:\My Documents\→ PowerShell 认为目的地是C:\My - 正确:
Copy-Item C:\a.txt "C:\My Documents\" - cmdlet 参数值含空格,一律用引号:
Write-Host "Hello World",而不是Write-Host Hello World - 配合
-LiteralPath参数时,路径本身即使有特殊字符(如[ ])也不怕,但依然建议加引号以防解析歧义










