내 프로젝트와 이것이 배포되는 방법에 대한 제한으로 인해 배치 파일에서 powershell 명령을 실행하고 powershell 스크립트의 변수를 에코해야합니다. 이 스크립트는 RS-232를 통해 TV에서 모델 번호를 검색하고 HEX로 모델을 반환합니다.
대본을 작성하고 실행되는 한 줄로 꼼꼼하게 압축했습니다. 명령 줄에서 'powershell -command "[myCondensedScript]"'도 할 수 있으며 훌륭하게 작동합니다.
for /F %%a in ('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 -or $x -eq 15 -or $x -eq 16 -or $x -eq 17 -or $x -eq 18 -or $x -eq 19 -or $x -eq 20 -or $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^).value') do set HexCode=%%a
echo %HexCode%
출력은 간단합니다.
echo +
예상되는 출력은 다음과 같습니다.
563332330
나는 변수와 배치 파일에 능숙하지 않기 때문에 변수에서 무엇을 놓치고 있는지 잘 모르겠습니다. 나는 광범위하게 검색했고이 페이지가 다소 도움이된다는 것을 발견했다. https://ss64.com/nt/for.html 나는 내가 원하는 정확한 변수에 %% a를 할당하는 방법을 이해하지 못한다. 어떤 도움이라도 대단히 감사하겠습니다!
명령에 포함 된 문자열 '
의 컨텍스트에서 이스케이프 처리되지 않은 포함 된 문자가 있으므로 '...'
작동하지 않습니다.
대신, 사용 usebackq
구문 분석 옵션을 와 의 명령 묶어야`...`
인용과 이스케이프 단순화.
다음 예제 명령합니다 (에서 시도하는 기술을 보여 cmd.exe
교체, 프롬프트 대신 배치 파일에서 %%a
함께 %a
) :
for /f "usebackq delims=" %%a in (`
powershell -c "$finalHex = '0x68 0x69' -replace '0x| '; $finalHex"
`) do set "HexNum=%%a"
echo %HexNum%
위의 인쇄 다음, 내장 증명 "..."
, '...'
및 ;
(사용의 맥락에서 그대로 일을 "..."
둘러싸에 전달 된 PowerShell 명령 주위에 따옴표를 위해 -c
( -Command
전체), 방지 cmd.exe
내용을 해석에서)를 :
6969
PowerShell의 CLI를 사용 하여 usebackq
규칙 을 요약하려면 다음을 수행하십시오 .
"..."
전체 로 포함 된 PowerShell 명령을 -c
/ -Command
매개 변수에 전달합니다 ( Windows PowerShell 에서 암시 되지만 PowerShell [Core] 6+ 에서는 필요함 ).
cmd.exe
는 "..."
문자열 의 내용을 해석하지 않기 때문에 ( %...%
환경 변수 참조 제외 ), cmd.exe
메타 문자 (예 : 특수 구문 의미를 가진 문자 &
)는 그대로 사용할 수 있습니다.작은 따옴표 ( '
)는 그대로 사용할 수 있습니다.
전체 명령 문자열에 큰 따옴표 ( ) 를 포함 해야하는 경우 :"
"..."
pwsh.exe
)에서는 ""
.powershell.exe
)에서를 사용 \""
하지만 문자열 내부 공백이 정규화됩니다 ( 단일 공백 으로 접힘 ). \"
이를 피하지만 ^
.NET cmd.exe
과 같은 메타 문자 를 이스케이프 해야합니다 &
.for /f "usebackq delims=" %%i in (`
REM In PowerShell [Core] 6+ (pwsh.exe), use "" instead of \""
powershell -noprofile -c "(\""hi & there\"").Replace('i', '@')"
`) do @echo [%%i]
위의 결과는 ""
다음 과 같습니다 (정규화 된 공백에 유의하십시오. PowerShell [Core] 6+에서는 이런 일이 발생하지 않습니다) :
[hi & there]
에 관해서는 특정 명령 :
인용에 ^
더 이상 필요하지 않으므로 (캐럿)을 제거하십시오 `...`
. 에 전달 된 명령 둘러싸 powershell -c
전체 의를 "..."
.
관심있는 값만 반환되도록 출력 스트림의 오염을 방지합니다. 이는 다음을 의미합니다.
Write-Host
명령을 제거하십시오 .
장소 $null = ...
전과 $port.Open()
, $port.Write(...)
, $port.Close()
호출은하지 않는 것이 있는지 확인하는 암시 적 (참조 출력을 생성 이 답변 에 대한 설명을).
간단하게 사용 $finalHex
자체 출력을 (불필요하기 위해 마지막 문으로 (Get-Variable ...)
).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다