programing

큰따옴표로 묶인 문자열에서 개체의 속성을 사용하려면 어떻게 해야 합니까?

javajsp 2023. 5. 24. 21:41

큰따옴표로 묶인 문자열에서 개체의 속성을 사용하려면 어떻게 해야 합니까?

다음 코드가 있습니다.

$DatabaseSettings = @();
$NewDatabaseSetting = "" | select DatabaseName, DataFile, LogFile, LiveBackupPath;
$NewDatabaseSetting.DatabaseName = "LiveEmployees_PD";
$NewDatabaseSetting.DataFile = "LiveEmployees_PD_Data";
$NewDatabaseSetting.LogFile = "LiveEmployees_PD_Log";
$NewDatabaseSetting.LiveBackupPath = '\\LiveServer\LiveEmployeesBackups';
$DatabaseSettings += $NewDatabaseSetting;

문자열 execute 명령에서 속성 중 하나를 사용하려고 할 때:

& "$SQlBackupExePath\SQLBackupC.exe" -I $InstanceName -SQL `
  "RESTORE DATABASE $DatabaseSettings[0].DatabaseName FROM DISK = '$tempPath\$LatestFullBackupFile' WITH NORECOVERY, REPLACE, MOVE '$DataFileName' TO '$DataFilegroupFolder\$DataFileName.mdf', MOVE '$LogFileName' TO '$LogFilegroupFolder\$LogFileName.ldf'"

그것은 단지 가치를 사용하려고 노력합니다.$DatabaseSettings의 보다는.$DatabaseSettings[0].DatabaseName그것은 유효하지 않습니다.
해결 방법은 새 변수로 복사하는 것입니다.

큰따옴표로 묶인 문자열에서 개체의 속성에 직접 액세스하려면 어떻게 해야 합니까?

변수 이름을 큰따옴표로 묶은 문자열로 묶으면 해당 변수의 값으로 대체됩니다.

$foo = 2
"$foo"

된다

"2"

단일 따옴표를 사용하지 않으려면 다음을 수행합니다.

$foo = 2
'$foo'

로 묶은을 나속액하그변묶따로대은문인사합다해니묶같야어하에 포함시켜야 .$():

$foo = 1,2,3
"$foo[1]"     # yields "1 2 3[1]"
"$($foo[1])"  # yields "2"

$bar = "abc"
"$bar.Length"    # yields "abc.Length"
"$($bar.Length)" # yields "3"

PowerShell은 이러한 경우에만 변수를 확장할 뿐 그 이상은 아닙니다. 또는 계산을 하여 더 식을 평가하려면 인 " " ", " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "$( )이로 인해 내부 식이 평가되고 문자열에 포함됩니다.

@조이가 정답을 가지고 있지만, 왜 당신이 평가를 강요해야 하는지에 대해 조금 더 덧붙이자면.$():

( 확장은 PowerShell을 PowerShell이라고 됨).ToString()일부 "홀수" 결과를 설명할 수 있는 개체에 대한 메서드).

다음은 명령줄 맨 끝에 포함된 예제입니다.

...\$LogFileName.ldf

기본적으로 개체의 속성이 확장된 경우 위의 내용은 다음과 같이 확인됩니다.

...\

객된이후로에 의해 된 객체 $LogFileName에는 라는속갖않것입을니다지성라는 .ldf,$null(또는 빈 문자열)이 변수로 대체됩니다.

설명서 참고: 문자열 보간은 다루지만, PSv5에서는 자세히 다루지 않습니다.

Joey의 유용한 답변을 PowerShell의 문자열 확장에 대한 실용적인 요약(이중 따옴표로 묶은 문자열 보간)으로 보완합니다."..."a.k.a. 확장 가능한 문자열), 여기에 이중으로 표시된 문자열 포함)

  • , (또는 , ...) 및 (환경 변수)와 같은 참조만 문자열에 직접 포함할 수 있습니다. 즉, 변수 참조 자체만 다음 항목에 관계없이 전체적으로 확장됩니다.

    • 예.,"$HOME.foo"와 같은 것으로 확장됩니다.C:\Users\jdoe.foo왜냐하면.foo부분이 속성 액세스가 아닌 문자 그대로 해석되었습니다.

    • 문자열의 후속 문자에서 변수 이름을 구분하려면 및(예: )로 묶습니다.
      변수 이름 뒤에 다음과 같은 경우 특히 중요합니다.:PowerShell이 다른 방법을 사용할 경우 두 제품 사이의 모든 것을 고려할 수 있습니다.$그리고:스코프 지정자, 일반적으로 보간 실패를 유발합니다. 예:"$HOME: where the heart is."휴식, 하지만"${HOME}: where the heart is."의도한 대로 작동합니다.
      (또는,`-최후의::"$HOME`: where the heart is."하지만 변수 이름을 따르는 문자가 실수로 이전 문자와 이스케이프 시퀀스를 형성하지 않을 경우에만 작동합니다.`,예를 들어`b_Special_Characters 도움말 항목에 대한 개념 참조).

    • 료기하를 것.$ 는또."문자 그대로, 이스케이프 문자로 접두사를 붙입니다. (백티크); 예:
      "`$HOME's value: $HOME"

  • 배열 첨자 사용 및 개체 변수의 속성 액세스를 포함하여 다른 모든 경우에는 하위 표현식 연산자(예:"PS version: $($PSVersionTable.PSVersion)"또는"1st el.: $($someArray[0])")

    • 용사를 합니다.$(...)심지어 전체 명령의 출력을 이중 패리티 문자열에 포함할 수도 있습니다(예:"Today is $((Get-Date).ToString('d')).").
  • 보간 결과가 반드시 기본 출력 형식과 동일하게 나타나지는 않습니다(예를 들어, 변수/하위 표현식을 콘솔에 직접 인쇄한 경우 표시되는 내용은 기본 포맷터를 포함합니다. 참조).

    • 배열을 포함한 집합요소의 문자열 표현 사이단일 공간을 배치하여 문자열로 변환됩니다. (기본적으로 기본 설정 변수를 설정하여 다른 구분 기호를 지정할 수 있지만 실제로는 거의 볼 수 없습니다.) 예:"array: $(@(1, 2, 3))" 확량수array: 1 2 3

    • 다른 유형의 인스턴스(자체가 컬렉션이 아닌 컬렉션 요소 포함)는 IF 또는 matable을 호출하여 문자열화됩니다.인스턴스 유형이 IFormatable 인터페이스[1]를 지원하는 경우 또는 .psobject를 호출하여 불변 문화를 사용하는 ToString() 메서드입니다.ToString(). 대부분의 경우 기본 .NET 유형을 호출합니다.ToString() 메서드[2],의미 있는 표현을 제공할 수도 있고 제공하지 않을 수도 있습니다: (비선택적) 유형이 구체적으로 재정의하지 않은 경우.ToString()메소드, 전체 유형 이름(예:"hashtable: $(@{ key = 'value' })" 확량수hashtable: System.Collections.Hashtable).

    • 콘솔 동일한 출력을 얻으려면 파이프로 연결하고 적용할 하위 표현식을 사용합니다..Trim()및 빈 줄을 를 들어 하는경우선및후빈제다선니거합을행원행▁to,다. 예:
      "hashtable:`n$((@{ key = 'value' } | Out-String).Trim())"산출량:

          hashtable:                                                                                                                                                                          
          Name                           Value                                                                                                                                               
          ----                           -----                                                                                                                                               
          key                            value      
      

이 놀라운 행동은 문화에 민감한 표현을 지원하는 유형의 경우,$obj.ToString()현재 문화에 적합한 표현을 산출하는 반면,"$obj"(문자열 보간법) 항상 문화적 의미의 표현이 됩니다. 다음 답변을 참조하십시오.

주목할 만한 재지정:
이전에 논의된 컬렉션의 문자열화(같은 것이 아닌 요소의 공백으로 구분된 목록)System.Object[]).
의 해시 테이블과 같은 표현[pscustomobject] 문자열이 아닌 인스턴스(여기에 표시됨)를 입력합니다.

@조이는 좋은 대답을 합니다.String을 사용하여 .NET 모양을 더욱 돋보이게 하는 또 다른 방법이 있습니다.동일한 형식으로 개체의 속성에 액세스할 때 선호합니다.

자동차에 관한 것들:

$properties = @{ 'color'='red'; 'type'='sedan'; 'package'='fully loaded'; }

개체 만들기:

$car = New-Object -typename psobject -Property $properties

문자열 보간:

"The {0} car is a nice {1} that is {2}" -f $car.color, $car.type, $car.package

출력:

# The red car is a nice sedan that is fully loaded

따옴표 내에서 속성을 사용하려면 다음과 같이 하십시오.속성을 인쇄하려면 괄호 밖의 $를 사용해야 합니다.

$($variable.property)

예:

$uninstall= Get-WmiObject -ClassName Win32_Product |
    Where-Object {$_.Name -like "Google Chrome"

출력:

IdentifyingNumber : {57CF5E58-9311-303D-9241-8CB73E340963}
Name              : Google Chrome
Vendor            : Google LLC
Version           : 95.0.4638.54
Caption           : Google Chrome

이름 속성만 원하는 경우 다음과 같이 수행합니다.

"$($uninstall.name) Found and triggered uninstall"

출력:

Google Chrome Found and triggered uninstall

언급URL : https://stackoverflow.com/questions/1145704/how-can-you-use-an-objects-property-in-a-double-quoted-string