Powershell: 변수 내의 변수입니다. 가변수용

Powershell: 변수 내의 변수입니다. 가변수용

따라서 내 문제를 설명하는 가장 쉬운 방법은 내가 하려는 작업의 단순화된 버전을 보여주는 것입니다.

PS C:\> $a = 'hello'
PS C:\> $a
hello
PS C:\> $b = '$a world!'
PS C:\> $b
$a world!

이제 내가 정말로 원하는 것은 $b 호출이 'hello world!'를 반환하는 것입니다. 하지만 분명히 변수를 호출할 수는 없습니다이내에이와 같은 또 다른 변수. 누구든지 제안이나 해결 방법이 있습니까? 나는 여기서 분명한 것을 놓치고 있는 것 같습니다.

편집: 내가 하려는 일의 더 정확한 버전:

PS C:\> $selHost = (get-content c:\scripts\hosts.txt)[0]
PS C:\> $selhost
spr-it-minion
PS C:\> $a = (get-content c:\scripts\config.txt)[1]
PS C:\> $a
$selhost Is Offline!
PS C:\> $b = "$a"
PS C:\> $b
$selhost Is Offline!

그래서 나는hosts.txt의 첫 번째 줄을 가져와서 'spr-it-minion'인 $selhost로 설정합니다. 그런 다음 config.txt에서 '$selhost is Offline!'이라는 문자열인 두 번째 줄을 가져옵니다. 내가 $a에 전화하면 'spr-it-minion이 오프라인 상태입니다!'라는 메시지가 나오길 바라면서요. 그리고 나는 무엇을 해야할지 모르겠습니다.

편집 II: 각각host.txt 및 config.txt의 내용.

호스트.txt:

spr-it-minion
spr-saflok
spr-crosby
spr-vmhost01
spr-vmhost02
spr-vmhost03

구성.txt:

172.31.1.124
$selhost Is Offline!
$selhost Is Offline!
[email protected]
[email protected]

편집 III:페이스트빈관심이 있으신 분은 제 실제 스크립트를 참조하세요.

15행: $alertSubject를 "$selhost is Offline!"이라는 문자열로 설정했습니다. 따옴표도 없고 아무것도 없습니다.

82행: $alertSubject를 이메일 경고의 제목 줄로 사용합니다. 해당 변수에 "spr-it-minion이 오프라인입니다!"와 같은 값이 표시되기를 바랍니다. 하지만 이메일을 받거나 스크립트의 아무 곳에나 $alertSubject를 작성하려고 시도하면 "$selhost가 오프라인입니다!"라고만 표시됩니다.

답변1

PowerShell에서 변수를 정의할 때 작은따옴표( ')는 문자열의 리터럴 버전을 원한다는 의미입니다. "변수 확장을 허용하려면 큰따옴표( )를 사용하십시오 .

PS C:\> $a = "hello"
PS C:\> $a
hello
PS C:\> $b = "$a world!"
PS C:\> $b
hello world!

더 많은 정보:

댓글 후 수정:

파일에서 줄을 가져오는 예의 경우 해당 줄을 리터럴 문자열로 가져오기 때문에 조금 더 까다롭습니다.

가장 쉬운 방법 (IMO)은바꾸다방법; 다음과 같은 것:

$selHost = (get-content c:\scripts\hosts.txt)[0]
$a = ((get-content c:\scripts\config.txt)[1]).replace('$selhost', $selHost)

답변2

변수 이름이 포함된 문자열을 파일에서 변수로 읽을 때 문자열 확장을 위해서는 큰따옴표 이외의 다른 것이 필요합니다. 여기에 관련된 도구가 있습니다. ExpandString이라고 합니다. 이 샘플 코드를 살펴보십시오.

$selhost = 'spr-it-minion'

$b = '$selhost is offline!'
$c = $ExecutionContext.InvokeCommand.ExpandString($b)

$c

여기서 일어나는 일은 먼저 $selhost 및 $b 리터럴 값을 제공했다는 것입니다. 이는 사용 중인 파일에서 읽을 것과 유사합니다. 물론, 허용된 답변에 설명된 대로 $selhost에 대한 참조가 해결되지 않았기 때문에 $b는 옳지 않습니다. 그러나 $c는 출력에 사용할 수 있는 $selhost를 확장하여 생성된 값을 얻습니다.

코딩 연습으로 이를 귀하의 사례에 적용해 보겠습니다.

답변3

여기서 수행하려는 작업은 동적 Powershell입니다. 즉, Powershell 명령을 보유하는 문자열을 만든 다음 Powershell에서 해당 명령을 실행하도록 합니다. Invoke-Expression을 사용하여 이 작업을 수행할 수 있습니다. 예:

$alertSubject = Invoke-Expression -Command "`"$((Get-Content '.\config.txt')[1])`""

하지만 유지 관리를 위해 다음과 같이 나눌 수도 있습니다.

$config1 = (Get-Content '.\config.txt')[1]
$alertSubject = Invoke-Expression -Command "`"$config1`""

실제로 실행하려는 명령은 다음과 같기 때문에 백틱이 있는 것입니다.

"$selhost is offline!"

외부 따옴표를 사용하면 $config1값이 에 전달되기 전에 확장될 수 있습니다 Invoke-Expression. 해당 값 $selhost에는 명령이 호출될 때 확장될 수 있도록 큰따옴표가 포함되어야 합니다 .

또는 구성 파일에 큰따옴표를 넣을 수도 있습니다.

172.31.1.124
"$selhost Is Offline!"
"$selhost Is Offline!"
[email protected]
[email protected]

그리고 나서 그냥

$alertSubject = Invoke-Expression -Command $config1

이 패턴에서는 바깥쪽 큰따옴표가 $config1중복되므로 삭제되었습니다.

답변4

교체 방법은 Autohotkey에서 powershell을 호출하는 경우에도 변수 대체 내의 변수에 대해 잘 작동합니다.

uri = file$k.doc

psScript2 =
(
param($param1)
for($k=1; $k -le 6; $k++){
$uri = $param1.replace('$k',"$k")
echo $uri
}
)

Run PowerShell.exe -noexit -Command &{%psScript2%} '%uri%',, show
return

외부 변수 내용으로 대체할 내부 변수를 검색하려면 작은따옴표를 사용하세요.

결과는 다음과 같습니다

file1.doc
file2.doc
etc.

관련 정보