尝试从批处理文件运行 PowerShell 命令时出现错误

Posted

技术标签:

【中文标题】尝试从批处理文件运行 PowerShell 命令时出现错误【英文标题】:I'm getting an error when I try to run PowerShell commands from a batch file 【发布时间】:2021-07-11 19:59:03 【问题描述】:

我有一个现有的批处理文件。我需要在 C: 上显示可用空间。我发现最好的方法是使用 PowerShell。

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object FreeSpace
Write-Host ("0GB free" -f [math]::truncate($disk.FreeSpace / 1GB))

我可以通过以错误级别的结果退出来修改它。

Powershell:

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Freespace
Exit ("0" -f [math]::truncate($disk.freespace / 1GB))

退出PS后:

set FreeSpace=%errorlevel%
echo %FreeSpace%

当我从命令提示符运行它时,它可以完美运行。为了让它在批处理文件中工作,我需要转义几个字符。

Powershell $disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID=`'C:`'" ^| Select-Object Freespace ^
           Exit ("0" -f [math]::truncate($disk.freespace / 1GB))
set FreeSpace=%errorlevel%
echo %FreeSpace%

但我得到了错误:

Select-Object : A positional parameter cannot be found that accepts argument 'Exit'.

就好像 Select-Object 正在解析下一行。任何想法我做错了什么?

【问题讨论】:

我不熟悉批处理文件,我觉得使用它们很痛苦。您可以使用所有 PowerShell 命令创建一个字符串,然后使用 Invoke-Expression 执行该字符串。我宁愿这样做,也不愿处理逃逸的东西。 EXIT 是另一个命令。当您想在一行上运行多个命令时,您需要用分号分隔命令。就目前而言,SELECT-OBJECT 命令认为EXIT 是其自身的参数。 当您选择使用转义字符将所有 Powershell 代码放在多行时,它认为 EXIT 是前一行的一部分。如果不使用转义字符,您不能将所有的 powershell 代码放在多行上。所以你仍然需要遵循使用分号在一行上运行多个命令的语法。 【参考方案1】: 使用; 分号作为Powershell 命令分隔符; 使用另一种转义引号(双引号被阻塞); 您可以在 Exit 中使用整数。

代码:

@echo OFF
Powershell -nopro $disk = Get-WmiObject Win32_LogicalDisk -Filter """"DeviceID='D:'"""" ^| Select-Object Freespace; ^
           Write-Host (""""0GB free"""" -f [math]::round($disk.FreeSpace / 1GB)) -Fore Yellow; ^
           Exit ([math]::truncate($disk.freespace / 1GB))
set FreeSpace=%errorlevel%
echo %FreeSpace%

输出.\SO\67131203.bat

796GB free
796

【讨论】:

啊。您的解决方案将 DeviceID 设置为 D: 并将其更改为 C: 有效。谢谢!

以上是关于尝试从批处理文件运行 PowerShell 命令时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从PowerShell /批处理文件中的网络路径运行命令

我如何使用需要从命令提示符/批处理文件引用的参数调用PowerShell Start-Process命令?

如何从批处理文件运行 PowerShell 脚本

从批处理文件运行 Powershell 脚本中的参数

运行远程批处理文件时,Powershell 进程“挂起”

从 Web API 连接并运行 PowerShell 命令