PowerShell에서 문자열과 변수를 어떻게 연결합니까?


609

다음 스 니펫이 있다고 가정하십시오.

$assoc = New-Object psobject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Write-host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

이 스 니펫이 다음과 같이 표시 될 것으로 예상됩니다.

42 - Slim Shady - Eminem

그러나 대신 다음과 같이 표시됩니다.

42 + - + Slim Shady + - + Eminem

+연산자가 문자열과 변수를 연결하는 데 적합하지 않다고 생각합니다 .

PowerShell을 사용하여 어떻게 접근해야합니까?


28
모든 요소가 문자열이고 표현식을 괄호로 묶는 경우 코드가 작동 합니다 . Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner) 여기서 $ assoc.Id는 Int32문자열 표현을 사용해야합니다. 그렇지 않으면 PS는 연결 대신 산술 덧셈을 시도합니다.
bouvierr

5
보기의 수가 주어지면 편집 내용이 약간 변경되었지만이 질문의 텍스트를 수정하는 것이 적절하다고 생각했습니다. 나는 질문의 용어 / 단어와 정신을 그대로 유지하면서 다시 열 수 있도록 충분히 개선하려고 노력했습니다.
Jeroen

답변:


666
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

참고 항목 의 Windows PowerShell 언어 사양 버전 3.0 , P34, 하위 식 확장을.


1
이 기술은 작동 Write-Output 이 당신의 도구 상자에있는 가장 유용한 하나가 아마 그래서, 너무.
Fenton

4
왜 $ ($ name) 대 $ name입니까? 이것은 $ {name}을 사용하는 bash와 같은 방식으로 방어 적입니까?
Danny Staple

73
이것은 기술적으로 연결되지 않습니다.
TravisEz13

8
@ DannyStaple 질문이 너무 많이 편집 되어 더 이상 대답이 이해가되지 않습니다. 슬림 한 예에서 yes "... $name ..."는 모두 동일하게 작동하지만이 답변이 다루는 원래 질문에서 문제는 개체 속성에 액세스하는 방법입니다. 그렇다면 $name.id -eq 42다음 "... $name.id ..."은 같은 렌더링 때문에 당신이 원하는처럼 작동하지 않을 ... @{id=42}.id ...대신 원하는 중 ... 42 ...,이를 위해 대답의 방법을 사용합니다 "... $($name.id) ...". 나중에 수정하기 위해 질문을 북마크하고 있습니다.
Jeff Puckett

3
PowerShell 언어 사양을 알려 주셔서 감사합니다. 초보자로서 저는 PowerShell에 공식 자습서가 제공되지 않는 이유에 대해 항상 혼란스러워했습니다. 이 언어 사양은 내가 찾고있는 것 같습니다. 다시 감사합니다!
RayLuo

256

작은 따옴표와 큰 따옴표의 차이점을 언급 한 사람은 없습니다. (PowerShell 4를 사용하고 있습니다).

@Ben이 말했듯 이이 작업을 수행 할 수 있습니다.

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

또는 당신은 이것을 할 수 있습니다 :

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

작은 따옴표는 리터럴을위한 것이므로 문자열을 이와 같이 정확하게 출력하십시오. 큰 따옴표는 변수, 특수 문자 등의 일부 전처리를 원할 때 사용됩니다.

그래서:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

이므로:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

( http://ss64.com/ps/syntax-esc.html 참조하기에 좋습니다).


1
1.0에서도 작동합니다.
Johnth

134

한 가지 방법은 다음과 같습니다.

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

다른 하나는 다음과 같습니다.

Write-host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

또는 그냥 (그러나 나는 그것을 좋아하지 않습니다)) :

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner

7
나는 마지막 것이 당신이 기대 한대로 정확하게 작동한다고 생각하지 않습니다. 여기에서 pastebin을 참조 하십시오 . PowerShell은 사이의 공백에 대한 출력 (여기 두에도 불구하고) 공간을 하나를 추가합니다 $assoc.Id"(외). 즉, 옵션 1 당신에게 제공한다 Id__-__Name__-__Owner(각의 각면에 두 개의 공백을 -)하지만, 옵션 3을 제공합니다 Id___-___Name___-___Owner( 자리).
루핀

4
아마도 더 유용한 pastebin 입니다. $assoc.Id"###"$assoc.Name 것이다 ###의 양측에 공간 부가 곳이 "$($assoc.Id)###$($assoc.Name)" 없는 것이다 .
ruffin

1
두 번째로 Powershell이 ​​제 목적에 필요한 것임을 확신했습니다. 감사합니다!
MaVCArt

123

당신은 또한 사용할 수 있습니다 -join

예 :

$name = -join("Jo", "h", "n");

"John"을 $ name에 할당합니다.

따라서 한 줄로 출력하려면 다음을 수행하십시오.

Write-Host (-join("Jo", "h", "n"))

적어도 이것은 foreach에서 사용될 수 있습니다
dEmigOd

68

인쇄하고자하는 것을 괄호로 묶어보십시오.

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

귀하의 코드는에 전달되는 많은 매개 변수로 해석됩니다 Write-Host. 괄호 안에 묶으면 값이 연결되고 결과 값이 단일 매개 변수로 전달됩니다.


3
+1, 저는 큰 따옴표와 같은 변수 나 값을 포함 Write-Debug하거나 다른 방법을 사용할 때이 형식을 선호합니다Write-VerboseWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
IT Bear

예, 이것은 문자열 연결입니다. 줄 바꿈이나 공백을 추가하지 않습니다. 작은 따옴표 나 큰 따옴표로 묶인 문자열을 사용할 수 있습니다.
LexieHankins

이 트릭은 진정한 연결이며 .net에서와 같이 여러 줄 문자열을 수행 할 수 있습니다. 여러 줄로 된 SQL 문을 수행하는 데 매우 좋습니다! powershell이 ​​기본적으로 이것을하지 않는 이유는 무엇입니까?
Brain2000

여러 가지 방법이 있습니다. 그러나 이것이 문자열 연결의 진정한 대답입니다.
chingNotCHing

32

다른 옵션은 다음과 같습니다.

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

"최상의"방법은 아마도 CB가 제안한 방법 일 것입니다.

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

3
StringBuilderconcat-crazy가 될 경우 옵션 을 추가해야합니다 . ; ^)
ruffin

2
원하는 속성을 외부 파일로 파이프 한 다음 하이픈 (?)으로 연결된 구성 요소 문자열로 역 직렬화하는 방법이 있습니다.
Code Jockey

이보다 더 나쁜 어프로치를 상상하기는 어렵습니다. 문자열은 변경할 수 없으므로 각 연결 작업은 실제로 원래 문자열의 문자를 복사하여 새 문자열을 생성합니다.
wombatonfire 1

22

cmdlet에 다른 매개 변수로 처리되지 않도록 식을 괄호 안에 넣어야합니다.

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

이것은 Write-Debug
Frank

19

표현하는 동안 :

"string1" + "string2" + "string3"

문자열을 연결합니다. powershell 명령에 전달 될 때 단일 인수로 평가되도록하려면 괄호 앞에 $를 넣어야합니다. 예:

Write-Host $( "string1" + "string2" + "string3" ) 

보너스로 여러 줄에 걸쳐서 표시하려면 줄 끝에서 ackward backtick 구문을 사용해야합니다 (백틱 오른쪽에 공백이나 문자가없는 상태). 예:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(실제로 Powershell은 현재 괄호 사이에 불필요한 백 틱이 필요하기 때문에 약간 잘못 구현되었다고 생각합니다. Microsoft가 "Python"또는 "TCL"괄호 규칙을 따르면 시작과 시작 사이에 원하는만큼 줄 바꿈을 할 수 있습니다. 괄호를 끝내면 줄 연속 및 문자열 연결과 관련된 powershell에 대해 사람들이 좋아하지 않는 대부분의 문제를 해결할 수 있습니다. 나는 괄호 사이의 줄 연속에서 백 틱을 끌 수 있음을 발견했습니다. 그것이 작동한다면 정말 약하고 실행 불가능한 것입니다. 단지 백틱을 추가하는 것이 좋습니다.)


13

대안으로 다른 방법이 있습니다.

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)

9

.NET String.Format을 사용 하여이 작업을 수행하는 다른 방법을 원합니다 .

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))

2
String.Format오래된 일반 대신 .NET을 사용하면 어떤 이점이 "{0}" -f $var있습니까? 일반 PowerShell이 ​​작업을 수행 할 수있는 .NET 코드 사용의 요점을 모르겠습니다 ...
Dinei

4
@DineiRockenbach 아마 아닐 것입니다. 다른 예를 제시하고 싶었습니다.
Martin Brandl

9

(현재 PS 버전 5.1.17134.407)

그것은 모두 지금까지 말하고 완료했다고 생각하지만 이것은 현재 작동합니다.

$myVar = "Hello"

echo "${myVar} World"

참고 : 이것은 큰 따옴표로만 작동합니다


7

이 답변은 모두 매우 복잡해 보입니다. PowerShell 스크립트에서 이것을 사용하는 경우 간단히 다음을 수행 할 수 있습니다.

$name = 'Slim Shady'
Write-Host 'My name is'$name

출력됩니다

제 이름은 Slim Shady입니다

당신을 위해 단어 사이에 공백이 어떻게 있는지 확인하십시오.



6

DOS 시절과 마찬가지로 문자열을 연결하십시오. 이것은 로깅에 큰 문제이므로 여기로 이동하십시오.

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday

6

PowerShell을 사용하지 않을 때마다 PowerShell을 사용할 때 마다이 (그리고 다른 많은 직관적이지 않은 것들)로 고투하는 것처럼 보이므로 이제 다음을 선택합니다.

[string]::Concat("There are ", $count, " items in the list")

1
이것은 System.Object, fyi를 반환합니다.
Barry

3

Write-Host 는 다음과 같이 연결할 수도 있습니다.

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner

이것이 가장 간단한 방법입니다 (IMHO).


2
$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife

2

파일 경로를 만들기 위해 문자열을 연결하는 경우 join-path 명령을 사용하십시오.

join-path C:\temp "MyNewFolder"

적절한 후행 / 선행 슬래시가 자동으로 추가되어 작업이 훨씬 쉬워집니다.

이것이 너무 주제가 아닌 경우 사과하지만 일부 도움이 될 것이라고 생각했습니다.
PowerShell을 잠시 사용하지 않으면 때로는 존재하지 않고 연결 연산자를 찾기 시작합니다.


0

C # /. NET 메소드에 액세스 할 수 있으며 다음도 작동합니다.

$string1 = "Slim Shady, "
$string2 = "The real slim shady"

$concatString = [System.String]::Concat($string1, $string2)

Output:

Slim Shady, The real slim shady

-2

재미 로요 아래와 같이 PSObject의 값에 직접 액세스 할 수도 있습니다.

$assoc.psobject.Properties.value -join " - "

그러나 객체를 주문하도록 지정하지 않으면 Powershell은 임의의 순서로 값을 표시합니다. 따라서 [순서] 플래그를 추가해야합니다

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.