将Powershell变量传递到Windows批处理文件 [英] Passing Powershell variable to Windows Batch file

查看:63
本文介绍了将Powershell变量传递到Windows批处理文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于我的项目以及部署方式的限制,我需要在批处理文件中运行powershell命令,并从powershell脚本中回显变量.该脚本通过RS-232从电视上检索型号,并以十六进制形式返回该型号.

我编写了脚本,并将其精巧地压缩为可以运行的一行.我什至可以在命令行中使用"powershell -command"[myCondensedScript]",效果很好

/f %% a的

 ,用于('powershell.exe -command"$ port = New-Object System.IO.Ports.SerialPort COM1,9600,none,8,one; [byte [] $reqSerial = 1,48,65,48,65,48,54,2,67,50,49,55,3,112,13; [byte []] $ reqModel = 0x01,0x30,0x41,0x30,0x41,0x30,0x36,0x02,0x43,0x32,0x31,0x37,0x03,0x70,0x0D; [byte []] $ response =''; [byte []] $ readData =''; $ port.DTREnable = $ True; $ port.Open(); $ port.Write($ reqModel,0,$ reqModel.Count); $ x = 0; do {$ x ++; $ readData = $ port.ReadChar(); If($ x -eq 13 -or$ x -eq 14-或$ x -eq 15-或$ x -eq 16-或$ x -eq 17-或$ x -eq 18-或$ x -eq 19-或$ x -eq 20-或$x -eq 21){$ response + = $ readData;};} while($ response.Length -ne 9); $ port.Close(); $ hexResponse = $ response.forEach([char]); $ hexResponseString =[string] $ hexResponse; $ hexResponseString = $ hexResponseString.replace('',''); $ finalHex = $ hexResponseString + 0; Write-Host $ finalHex;"^;(Get-Variable -ValueOnly -Name finalHex ^).值")将HexCode = %% a设置为回声%HexCode% 

输出就是

  echo + 

预期输出为

 <代码> 563332330 

我不确定变量缺少什么,因为我对变量和批处理文件不是很熟练.我在Google上进行了广泛的搜索,发现此页面对 https://ss64.com/nt/for有所帮助.html 我只是不明白如何将%% a分配给我想要的确切变量.任何帮助将不胜感激!

解决方案

您的命令已在封闭的'...'字符串的上下文中未转义嵌入的'字符,将无法正常工作.

相反,使用 usebackq 解析选项,然后将命令括在`...` 中,简化了引号和转义.

以下示例命令演示了该技术(要在 cmd.exe 提示符下尝试此方法,而不是从批处理文件中尝试,请将 %% a 替换为%a ):

对于/f"usebackq delims =" %% a in(`powershell -c"$ finalHex ='0x68 0x69'-替换'0x |'; $ finalHex"`)设置"HexNum = %% a"回声%HexNum%

上面打印了以下内容,证明嵌入的"..." '...'; 的工作原理如下:是(在使用"..." 的上下文中,将PowerShell命令传递给 -c ( -Command )整体,这会阻止 cmd.exe 解释内容):

  6969 


使用 中的PowerShell命令传递到 -c /-Command 参数(在 Windows PowerShell 中为隐含,但在PowerShell [Core] 6+中为必需).

  • 单引号(')可以原样使用.

  • 如果需要在整个"..." 命令字符串中嵌入双引号("):

    • 在PowerShell [Core] 6+( pwsh.exe )中,使用" .
    • 在Windows PowerShell( powershell.exe )中,使用 \" ,但请注意,然后将对字符串内部的空格进行标准化 (折叠成单个空间); \"避免了这种情况,但随后要求您 ^ 逸出任何 cmd.exe 元字符,例如& .
  •  用于/f"usebackq delims =" %% i in(`REM在PowerShell [Core] 6+(pwsh.exe)中,使用"代替\"powershell -noprofile -c(\""hi& there \").Replace('i','@')"`)做@echo [%% i] 

    上面的结果(注意归一化的空格;在PowerShell [Core] 6+中带有" 的情况不会发生)

      [hi&那里] 


    关于您的特定命令:

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆