cmd调用powershell.exe执行.ps1脚本出现参数、盘符识别错误求助
故障表现
- 复现流程:
- 打开Windows命令提示符(cmd.exe)
- 执行命令调用PowerShell运行本地脚本:
C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -file C:\Users\Usha\Desktop\foldername\powershellfile.ps1
- 测试脚本原始代码:
$jsonStr = Get-Content -Raw -Path C:\Users\Usha\Desktop\foldername\filename.json | ConvertFrom-JSON New-Item -Path 'D:\ps' -Name 'testfile.txt' -ItemType 'file'
- 报错信息:
- 第一行代码执行报错:
Get-Content : A parameter cannot be found that matches parameter name 'Raw' - 删除第一行后,第二行代码执行报错:
Out-file : Cannot find drive. A drive with name ''c' doesnot exist
- 第一行代码执行报错:
- 异常特征:同一份脚本直接在PowerShell交互窗口中运行无任何问题,仅通过cmd调用powershell.exe的方式执行时触发错误。
故障根因
两个报错共同指向核心问题:cmd调用时实际启动的是PowerShell 2.0版本引擎,而非交互环境下使用的3.0及以上高版本PowerShell。
- 第一处参数不存在的报错:
Get-Content的-Raw参数是PowerShell 3.0版本才新增的特性,2.0版本未内置该参数,直接触发参数匹配失败错误。 - 第二处驱动器不存在的报错:PowerShell 2.0对脚本中包裹路径的半角单引号存在已知解析bug,会将路径开头的单引号识别为盘符名称的一部分,最终把
C:\xxx格式的路径误解析为'c\xxx,触发驱动器查找失败错误。
触发版本异常的常见原因:
- 系统启用了PowerShell 2.0兼容引擎,本地策略或PowerShell配置文件强制指定powershell.exe默认以2.0版本启动
- 64位Windows系统下打开了32位cmd进程,访问System32路径时被系统自动重定向到SysWOW64目录,该目录下的PowerShell运行配置异常指向2.0引擎
解决方案
按优先级依次尝试即可:
调用时显式指定PowerShell版本
修改cmd中执行的启动命令,强制要求使用3.0及以上版本运行脚本:C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe -Version 3.0 -file C:\Users\Usha\Desktop\foldername\powershellfile.ps1
如果是64位系统,可使用sysnative路径强制调用64位PowerShell,规避32位路径重定向问题:C:\Windows\SysNative\WindowsPowerShell\v1.0\PowerShell.exe -Version 3.0 -file C:\Users\Usha\Desktop\foldername\powershellfile.ps1调整脚本写法兼容旧版本
如果运行环境必须保留PowerShell 2.0,直接修改脚本适配2.0语法即可:
- 用
Get-Content | Out-String替代Get-Content -Raw,实现读取整个文件为单个字符串的相同效果 - 将路径参数外层的半角单引号替换为半角双引号,规避2.0版本单引号解析bug
修改后的兼容版脚本示例:
$jsonStr = Get-Content -Path C:\Users\Usha\Desktop\foldername\filename.json | Out-String | ConvertFrom-JSON New-Item -Path "D:\ps" -Name "testfile.txt" -ItemType "file"
- 关闭不必要的PowerShell 2.0组件
打开「控制面板-程序和功能-启用或关闭Windows功能」,找到Windows PowerShell 2.0选项取消勾选,重启系统后即可避免系统默认调用旧版本引擎。
内容的提问来源于stack exchange,提问作者Usha Ramani
相关产品推荐
相关产品推荐

