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

从批处理文件中的powershell脚本获取变量,powershell,batch-file,Powershell,Batch File,我在stack overflow上看到了一些类似的问题,但我无法得到far to work的任何答案 我有一个.ps1文件,它挂载一个驱动器并回显驱动器号(预期为$driverLetter=“G”||“H”|“I”): 我正在从这个批处理文件运行它: FOR /F "usebackq delims=" %%i IN (`powershell -File ./mountDisk.ps1 "%1"`) DO SET "d=%%i" Ech

我在stack overflow上看到了一些类似的问题,但我无法得到far to work的任何答案

我有一个.ps1文件,它挂载一个驱动器并回显驱动器号(预期为$driverLetter=“G”||“H”|“I”):

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

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

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

假设传递到批处理文件的初始路径是双引号,我可能会这样做

@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映像驱动器盘符时出错。

尝试以下操作从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

我从这个批处理文件运行它为什么?难道你不能在PowerShell脚本中做你想做的一切并避免传递变量等问题吗?通常这都是在PowerShell中完成的,是的。但是,此要求使用了一些集成到其他系统中的长批处理文件。系统运行正常,将我们所有的批处理文件重新写入powershell将是一个相当大的浪费。您没有告诉我们您作为
%1
传递的内容。虽然你认为省略它可能是好的,但它绝对有可能显示出直接的原因<代码>获取卷仅在ImagePath为StorageType ISO,而不是VHD/VHDx等时有效。因此,您需要确认的第一件事是,您正在将现有ISO文件作为第一个参数传递给PowerShell脚本。另外,要使用
挂载DiskImage
挂载VHD文件,而不是ISO文件,则需要管理员权限。您好,Compo,请了解您的来历,但是我不认为要提供有关ps1文件的不必要信息,因为它正按预期工作。我没有装载ISO文件或回显ps1脚本中要求的字母的问题。我可以确认它是传入%1参数的ISO文件类型。如上所述,echo$driverLetter的预期结果是与装入的卷相对应的字母。更改
时会得到什么结果。请将“d=%%i”
设置为
。执行echo%%~i
不,这不起作用。Op需要从批处理文件中运行powershell,而不是从powershell中运行cmd。感谢您提供的优雅方法。@Ray,请阅读,以便更好地理解当前对您开放的选项,并根据这些选项采取深思熟虑的措施。(请注意,如果您的回答没有被接受的解决方案,则本网站不会将其视为已解决。)
# 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