在批处理文件中从 powershell 脚本获取变量

时间:2021-05-11 08:04:24

标签: powershell batch-file

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

我有这个 .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%

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

2 个答案:

答案 0 :(得分:1)

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

@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 表示输入没有以不区分大小写的字符串 .iso 结尾,2 表示输入确实以不区分大小写的字符串 .iso 结尾,但它是一个目录,而不是一个文件,3 表示返回安装的 ISO 映像驱动器号时出错。

答案 1 :(得分:0)

尝试以下操作以从 PowerShell 运行 cmd 并将它们的变量指向它

# The command to pass to cmd.exe /cript
$var = "echo hello world & ping $ip & pause"
$ip = "192.168.1.1"
$var2 = "ping $ip & pause"

# Start the process asynchronously, in a new window,
# as the current user with elevation (administrative rights).
# Note the need to pass the arguments to cmd.exe as an *array*.
Start-Process -Verb RunAs cmd.exe -Args '/c', $var2, $var