programing

PowerShell에서 문자열과 변수를 연결하려면 어떻게 해야 합니까?

telebox 2023. 5. 7. 11:23
반응형

PowerShell에서 문자열과 변수를 연결하려면 어떻게 해야 합니까?

다음과 같은 스니펫이 있다고 가정해 보겠습니다.

$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을 사용하여 이 문제에 어떻게 접근해야 합니까?

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

Windows PowerShell 언어 사양 버전 3.0, p34, 하위 표현식 확장을 참조하십시오.

단일 따옴표와 이중 따옴표 사이에는 차이가 있습니다.(PowerShell 4를 사용하고 있습니다.)

Benjamin이 말한 대로 다음을 수행할 수 있습니다.

$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

(사용 방법: 이스케이프 문자, 구분 기호 및 따옴표가 참조에 적합함).

사용할 수도 있습니다.-join

예.

$var = -join("Hello", " ", "world");

$var에 "Hello world"를 할당할 것입니다.

출력하려면 한 줄로:

Write-Host (-join("Hello", " ", "world"))

한 가지 방법은:

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

인쇄할 내용을 괄호로 묶습니다.

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

코드가 전달되는 많은 매개 변수로 해석되고 있습니다. 괄호 안에 코드를 묶으면 값이 연결되고 결과 값이 단일 매개 변수로 전달됩니다.

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

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

"최선의" 방법은 아마도 C.B.가 제안한 방법일 것입니다.

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

표현하는 동안:

"string1" + "string2" + "string3"

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

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

추가적으로 여러 줄에 걸쳐 사용하려면 줄 끝에 어색한 백틱 구문을 사용해야 합니다(백틱 오른쪽에 공백이나 문자가 없음).

예:

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

(사실 현재 PowerShell은 괄호 사이에 불필요한 백스틱을 요구하여 약간 잘못 구현되어 있다고 생각합니다.Microsoft가 시작 괄호와 끝 괄호 사이에 원하는 만큼 새 줄을 넣을 수 있도록 하는 Python 또는 Tcl 괄호 규칙을 따르면 줄 계속 및 문자열 연결과 관련된 PowerShell에 대해 사람들이 좋아하지 않는 대부분의 문제를 해결할 수 있습니다.

괄호 사이에 온라인 연속으로 백택스를 해제할 수 있다는 것을 알게 되었습니다. 하지만 그것이 효과가 있을지는 정말로 불안정하고 예측할 수 없습니다.백스틱만 추가하는 것이 좋습니다.)

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

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

(현재 PowerShell 버전 5.1.17134.407)

이 기능은 현재에도 작동합니다.

$myVar = "Hello"

echo "${myVar} World"

참고: 큰따옴표가 있는 경우에만 작동합니다.

대안으로 다음과 같은 방법이 있습니다.

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

저는 단지 이것을 하기 위한 다른 방법을 가지고 싶습니다.NET 문자열.형식:

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

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

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

출력됩니다.

내 이름은 슬림 셰이디야.

단어 사이에 공백이 들어가는 방법을 메모합니다.

DOS 시절처럼 문자열을 연결합니다.이것은 로깅을 위한 큰 문제이므로 다음을 수행합니다.

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

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

PowerShell을 사용할 때마다 이러한 문제(그리고 다른 많은 무의식적인 문제)로 어려움을 겪는 것 같아 이제 다음을 선택하게 되었습니다.

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

PowerShell에서 해야 할 일/하지 말아야 할 일: 1부:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"

쓰기 호스트는 다음과 같이 연결할 수 있습니다.

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

이게 가장 간단한 방법이야, 임호.

파일 경로를 만들기 위해 문자열을 연결하는 경우 Join-Path 명령을 사용합니다.

Join-Path C:\temp "MyNewFolder"

사용자에게 적합한 후행/선행 슬래시를 자동으로 추가하여 훨씬 쉽게 작업할 수 있습니다.

$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

다른 곳에서 언급한 바와 같이 조인을 사용할 수 있습니다.

명령을 입력으로 사용하는 경우(나와 마찬가지로) 다음 구문을 사용합니다.

-join($(Command1), "," , $(Command2))

그러면 두 출력이 쉼표로 구분됩니다.

관련 의견은 https://stackoverflow.com/a/34720515/11012871 을 참조하십시오.

개인적으로 저는 이런 스타일을 선호합니다.

[string]::Join(' - ', 42, 'Slim Shady', 'Eminem')

또는 속성 유형이 서로 다른 개체를 기반으로 합니다.

$assoc = [psCustomObject][ordered]@{
    Id    = 42
    Name  = 'Slim Shady'
    Owner = 'Eminem'
}
[string]::Join(' - ',$assoc.psObject.Properties.value)

다음과 같은 결과를 얻을 수 있습니다.

42 - Slim Shady - Eminem

그냥 재미로.아래와 같이 PSO 개체의 값에 직접 액세스할 수도 있습니다.

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

그러나 개체의 순서를 지정하지 않으면 PowerShell은 값을 임의 순서로 표시합니다.그래서 당신은 깃발을 추가해야 합니다.[ordered]:

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

또한 C#/에 액세스할 수 있습니다.NET 방법 및 다음 방법도 작동합니다.

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

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

Output:

Slim Shady, The real slim shady

언급URL : https://stackoverflow.com/questions/15113413/how-do-i-concatenate-strings-and-variables-in-powershell

반응형