programing

.bat 파일에서 PowerShell 스크립트로 변수를 소싱하려면 어떻게 해야 합니까?

javajsp 2023. 9. 21. 20:05

.bat 파일에서 PowerShell 스크립트로 변수를 소싱하려면 어떻게 해야 합니까?

.bat 스크립트의 일부를 PowerShell로 교체합니다.배치 파일에 대한 구성은 다음과 같은 파일을 통해 수행됩니다.set적절한 환경 변수.저는 그 변수 값들을 그 안에 로드할 방법을 찾고 있습니다..ps1스크립트, 수정 없이.bat파일(다른 곳에서도 사용되는 파일).

예를들어.bat다음과 같이 표시됩니다.

set VAR_ONE=some_value
set VAR_TWO=/other-value

한 번에 한 번에 한 번에 한 번에 한 번에 한 번에CALL구성 파일과 변수를 사용할 수 있습니다.도트 소싱 둘 다 해봤어요 (. filename.bat) 및 전화(& filename.bat) PowerShell의 구성 파일 중 어느 것도 변수를 표시하지 않습니다.두 사람 모두와 함께 접속해 보았습니다.$VAR_ONE그리고.$env:VAR_ONE통사론

디스크의 형식을 수정하지 않고 이러한 구성 파일을 로드하는 좋은 방법은 무엇입니까?

PowerShell Community Extensions를 사용하는 경우에는Invoke-BatchFile이렇게 됩니다.Visual Studio vcvarsall.bat 파일을 사용하여 Visual Studio 도구를 사용하도록 PowerShell 세션을 구성합니다.

구문 분석을 수행합니다(시작하지 않는 줄은 모두 생략).set그들을 첫번째로 나누었습니다.=성격.작은 C# cmdlet에서 수행하거나 작은 PowerShell 스크립트를 사용하여 직접 수행할 수 있습니다.

CMD /c "batchFile.bat && set" | .{process{
    if ($_ -match '^([^=]+)=(.*)') {
        Set-Variable $matches[1] $matches[2]
    }
}}

나는 이 코드를 가지고 있고 어딘가에서 온 것이라고 확신하지만 크레딧이 손실되었습니다. 파워셸 커뮤니티 확장에서 온 것 같습니다.Invoke-Batch대본.

선호하는 옵션은 구성을 a로 변경하는 것입니다..ps1파일을 만들고 변수 정의를 PowerShell 구문으로 변경합니다.

$VAR_ONE = 'some_value'
$VAR_TWO = '/other-value'

그러면 파일을 점 소스로 전송할 수 있습니다.

. filename.ps1

현재 사용 중인 형식을 유지하려면 다음과 같이 값을 구문 분석해야 합니다.

Select-String '^set ([^=]*)=(.*)' .\filename.bat | ForEach-Object {
    Set-Variable $_.Matches.Groups[1].Value $_.Matches.Groups[2].Value
}

참고: 위의 내용은 v3 이전의 PowerShell 버전에서는 작동하지 않습니다.v2 호환 버전은 다음과 같습니다.

Select-String '^set ([^=]*)=(.*)' .\filename.bat | ForEach-Object {
    $_.Matches
} | ForEach-Object {
    Set-Variable $_.Groups[1].Value $_.Groups[2].Value
}

먼저 배치 파일을 통해 할 수 있습니다.call구성 파일을 실행한 다음 PowerShell 스크립트를 실행합니다.

.bat이 호출된다고 가정하면test.bat, 정의를 내리다testps.ps1:

$lines = cat "test.bat"
$output = @{};

foreach ($line in $lines) {
    $bits = $line.Split("=");
    $name = $bits[0].Split(" ")[1];
    $val = $bits[1];
    $output[$name] = $val
}

return $output

그 결과는 다음과 같습니다.

C:\temp> .\testps.ps1

Name                           Value
----                           -----
VAR_TWO                        /other-value
VAR_ONE                        some_value


C:\temp> $x = .\testps.ps1
C:\temp> $x

Name                           Value
----                           -----
VAR_TWO                        /other-value
VAR_ONE                        some_value


C:\temp> $x["VAR_ONE"]
some_value

더 좋은 방법으로 분할할 수 있습니다(찾으면 수정됩니다).

언급URL : https://stackoverflow.com/questions/20077820/how-can-i-source-variables-from-a-bat-file-into-a-powershell-script