首页 > 解决方案 > 在批处理文件中从 powershell 脚本获取变量

问题描述

我在堆栈溢出中看到了一些类似的问题,但我无法得到任何答案。

我有这个安装驱动器并回显驱动器号的 .ps1 文件(预期 $driverLetter = "G" || "H" || "I"):

$mountDisk = Mount-DiskImage -ImagePath $args[0] -Passthru
$driveLetter = ($mountDisk | Get-Volume).DriveLetter
echo $driveLetter

我从这个批处理文件运行它:

FOR /F "usebackq delims=" %%i IN (`powershell -File ./mountDisk.ps1 "%1"`) DO  SET "d=%%i"
Echo %d%

每次我得到一个空变量。我试过设置环境变量,但产生相同的结果。

标签: powershellbatch-file

解决方案


这就是我可能会这样做的方式,假设传递给批处理文件的初始路径在必要时被双引号引起来。

@Echo Off & SetLocal EnableExtensions & Set "ISODrv="
If /I Not "%~x1" == ".iso" (Exit /B 1) Else For %%G In ("%~1") Do If "%%~aG" GEq "d" Exit /B 2
For /F %%G In ('%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command "(Mount-DiskImage -ImagePath \"%~1\" -PassThru | Get-Volume).Driveletter" 2^>NUL') Do Set "ISODrv=%%G"
If Not Defined ISODrv (Exit /B 3) Else Echo %ISODrv%

这样做无需预先创建 PowerShell 脚本,然后再对执行策略进行任何后续修改。如果接收到的输入值也是现有的 ISO 文件,它只会继续进行映像挂载。如果您从检索其退出代码的进程中运行此批处理文件,1则意味着输入没有以不区分大小写的字符串结尾.iso2这意味着输入确实以不区分大小写的字符串结尾.iso,但它是一个目录,而不是一个文件,并3表明返回已安装的 ISO 映像驱动器号时出错。


推荐阅读