如何将参数从 Windows Batch 传递到单个 Powershell 命令?

如何将参数从 Windows Batch 传递到单个 Powershell 命令?

我知道我可以像这样将变量传递给 powershell 脚本:powershell -file ".\filetorun.ps1" "arg1" "arg2"并放入param(var1=args[0],var2=args[1])Powershell 脚本中。

但是,如果它是一个内联批处理命令,我该怎么做呢?例如:

set "folder=d:\test"
powershell -command "(Get-ChildItem -Recurse "<pass %folder% variable???>" | Measure-Object -Property Length -Sum).sum"

然后最好将该 powershell 结果作为变量提供回批处理文件?

谢谢。

编辑:

因此,似乎无法通过管道批量传回变量,请参见此处:https://stackoverflow.com/questions/3446972/why-doesnt-set-p-work-after-a-pipe

基本上需要通过文本文档传递它。下面的命令似乎有效,虽然不是最理想的,但我猜这是批处理喜欢的工作方式:

set "folder=d:\test"
powershell -command "(Get-ChildItem -Recurse '%folder%' | Measure-Object -Property Length -Sum).sum">_tempfile.txt
set /p size=<_tempfile.txt
del /f /q _tempfile.txt
echo %size%

答案1

像这样的事情应该可以完成这项工作。

@echo off
set "folder=d:\test"
powershell -command "(Get-ChildItem -Recurse '%folder%' | Measure-Object -Property Length -Sum).sum" | set /p size=
echo %size%

答案2

为了创建功能齐全的演示,在 PowerShell 语句中添加了 Write-Output。这可确保在调用命令时将消息写入标准输出。for 循环用于运行 PowerShell 命令并检索标准输出。本质上,我正在寻找一种方法来捕获可执行文件的输出并将其存储在批处理变量中,因为在本例中,输出是由 powershell.exe 生成的。

@echo off
set "folder=C:\temp"

REM test output
powershell -command "Write-Output (Get-ChildItem -Recurse '%folder%' | Measure-Object -Property Length -Sum).sum"

REM using for to catch the output to a cmd variable
FOR /F "tokens=* USEBACKQ" %%F IN (`powershell -command "Write-Output (Get-ChildItem -Recurse '%folder%' | Measure-Object -Property Length -Sum).sum"`) DO (
SET var=%%F
)
ECHO %var%
pause

相关内容