여러 줄 명령을 입력하는 방법


425

PowerShell 명령 줄을 여러 줄로 나눌 수 있습니까?

Visual Basic에서는 밑줄 ( _)을 사용 하여 다음 줄에서 명령을 계속할 수 있습니다 .


3
"백 슬래시가 아닌 이유"질문은 Bruce Payette의 PowerShell in Action에서 잘 설명되어 있습니다 . 좋은 책. 브루스는 프로그래밍 언어의 역사에 대한 광범위한 지식을 가지고 있습니다. 이 책의 V2를 기대합니다.
Jay Bazuzi


1
주제가 아닌 경우 죄송하지만 sh명령을 사용 하여 스크립트를 제출해야하는 경우 bash 규칙이 ​​유지되므로 백 슬래시를 사용할 수 있습니다. 이 경우 스크립트에는 유닉스 스타일의 엔딩이 있어야합니다.
kon psych

`문자를 사용하여 여러 줄에서 명령을 구분하기
Asad Shakeel

답변:


634

공백 다음에 억음 악센트 (백틱)를 사용할 수 있습니다.

Get-ChildItem -Recurse `
  -Filter *.jpg `
  | Select LastWriteTime

그러나 이것은 위와 같은 경우에만 필요합니다. 일반적으로 해당 지점에서 명령을 구문 적으로 완료 할 수없는 경우 자동 줄 연속을 얻습니다. 여기에는 새로운 파이프 라인 요소 시작이 포함됩니다.

Get-ChildItem |
  Select Name,Length

|다른 파이프 라인 요소가 없어서 명령을 완료 할 수 없으므로 문제없이 작동 합니다. 중괄호 또는 다른 종류의 괄호를 열면 줄 연속을 직접 사용할 수 있습니다.

$x=1..5
$x[
  0,3
] | % {
  "Number: $_"
}

|쉼표 와 유사하게 일부 상황에서도 작동합니다.

1,
2

JavaScript의 Automatic Semicolon Insertion 과 유사하지만 줄 바꿈 앞에 오는 유효한 문장 있기 때문에 비슷한 부분이 있습니다 .

return
  5

작동 안 할 것이다.

마지막으로 문자열 (모든 종류)은 한 줄 이상으로 확장 될 수도 있습니다.

'Foo
bar'

그런 다음 문자열 내에 줄 바꿈을 포함시킵니다.


4
그리고 다른 토큰들도 라인 연속기 |와 같은 역할을한다는 것을 잊지 마십시오 {.
Keith Hill

1
@Keith : 감사합니다. 아마도 언급하기에는 너무 분명했을 것입니다. ;-)
Joey

16
아니, 나중에 참조 할 수 있도록 이러한 다른 문자를 문서화하는 것이 좋습니다.
Keith Hill

1
@JackDouglas : 여는 괄호 바로 뒤에 줄 바꿈을 할 수 있지만 연산자 앞의 표현식 안에는 없습니다. 나는 문법에 대한 감독이 될 것이라고 믿습니다.
Joey

10
ISE 명령 창에서 줄 연속이 작동하지 않는 것 같습니다.
Khouri Giordano

64

난 그냥가 안된다는 것을 발견 어떤 후면 틱과 줄 바꿈 사이의 문자. 공백조차도 명령이 작동하지 않습니다.


10
이것은 기술적으로 질문에 대한 답변이 아니지만 +1은 절대적으로 필수적이기 때문에 +1입니다. 방금 이것을 어려운 방법으로 발견했으며 가능한 미래의 개발에서 백틱을 피할 것입니다.
Dave Markle

4
따라서 Powershell에서 긴 줄을 끊는 강력한 방법은 본질적으로 없습니다. 어디에서나 2 화면 와이드 powershell 스크립트 를 보는 경향이 있습니다 . #ShakeMyHead
RayLuo

나도 이것으로 고투하고 있었다 ... 당신은 다음과 같이 주석을 포함하기 위해 백 틱 앞에 인라인 주석을 삽입 할 수있다 : Some-Command`-arg1 <# Explain arg 1 #>`-arg2 <# Explain arg 2 #>
joelsand

2
어. 따라서 Shift + Enter를 사용하면 사람이 명령을 읽거나 백틱을 사용할 때 ISE의 ​​명령 줄에서 잘못 구문 분석 될 수 있으므로 PowerShell 코드를 문서 나 웹 사이트에 게시하기가 불필요하게 어렵습니다.
GuitarPicker

의견의 본질로 인한 투표 (원래 질문에 대한 완전한 답변은 아님).
CodeBreaker

38

대부분의 C와 같은 언어에서는 코드를 가장 쉽게 읽을 수 있다고 생각되는 곳에 중괄호를 배치하는 것에 대해 신중히 생각합니다.

PowerShell 구문 분석기는 명령문이 명확하게 완료되지 않은 시점을 인식하고 다음 줄을 찾습니다. 예를 들어 선택적 스크립트 블록 매개 변수를 사용하는 cmdlet을 상상해보십시오.

    Get-Foo {............}

스크립트 블록이 매우 길면 다음과 같이 작성하십시오.

    Get-Foo
    {
        ...............
        ...............
        ...............
    }

그러나 이것은 작동하지 않습니다. 파서는 두 가지 진술을 보게 될 것입니다. 첫 번째는 Get-Foo두 번째는 스크립트 블록입니다. 대신에 나는 다음과 같이 쓴다.

    Get-Foo {
        ...............
        ...............
        ...............
    }

줄 연속 문자 (`)를 사용할 수는 있지만 코드를 읽기 어렵고 버그가 발생합니다.

이 경우 열린 괄호가 이전 줄에 있어야하므로 모든 곳에서 해당 패턴을 따릅니다.

    if (조건) {
        .....
    }

주 것을 if파서가 스크립트 블록에 대한 다음 줄에 보이는 것, 그래서 문은, 언어의 문법에 스크립트 블록을 필요로하지만 일관성을 위해, 나는 같은 줄에 열린 중괄호를 유지한다.

마찬가지로 긴 파이프 라인의 경우 파이프 문자 ( |) 다음에 나옵니다 .

    $ project.Items | 
        ? {$ _. Key -eq "ProjectFile"} |
        % {$ _. Value} | 
        % {$ _. EvaluatedInclude} |
        % {
            .........
        }

어떻게 수행 ifforeachtry작업 후? 그들은 다음 줄에 스크립트 블록을 허용합니다 ... 이것은 음소거가 가능하다는 것을 의미합니다
Nacht-Reinstate Monica

@Nacht : 녹슨 메모리에서 : 언어 문법에 따라 스크립트 블록이 필요한 문장은 줄 바꿈을지나 구문 분석합니다. 누구든지 확인할 수 있습니까?
Jay Bazuzi

2
@Nacht : "하지만 작동하지 않습니다"는 추가 매개 변수가 선택적인 상황을 말하고 있습니다. 대부분의 경우입니다.
Jay Bazuzi

1
아 지금 무슨 말인지 알 겠어. 따라서 "if"와 "foreach"는 실제로는 cmdlet이 아닙니다. 실제로 문법의 일부이므로 다음 줄로 넘어갑니다. 그렇다면 사용자 정의 함수가 다음 줄에서 스크립트 블록을 읽을 수있는 방법이 있습니까? 위의 답변이 해당 질문에 정확하게 답변한다고 가정합니다.
Nacht-복원 모니카

29

cristobalito의 답변 을 확장하려면 :

나는 당신이 명령 줄에 대해 이야기하고 있다고 가정합니다-그것이 스크립트에 있다면, 줄 바꿈은 명령 구분 기호로 작용합니다.

명령 행에서 세미콜론 ';'을 사용하십시오.

예를 들면 다음과 같습니다.

명령 행에서 PowerShell 스크립트에 서명하십시오. 줄 바꿈이 없습니다.

powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert}

10
질문에 대한 답변이 아니라 귀하의 답변이 내 질문에 답변했습니다. :)
Frederik

1
흥미롭지 만 OP가 요구 한 것과 반대입니다. OP는 단일 명령을 여러 줄로 나누기를 원했습니다. 여러 명령을 한 줄에 결합하는 방법에 대해 설명했습니다.
Daniel Yankowsky

17

PowerShell 및 PowerShell ISE에서는 각 줄 끝에 Shift+ 를 사용 Enter하여 여러 줄을 편집 할 수 있습니다 (표준 백틱 대신 `).


2
이것은 여러 줄로 된 here-string을 편집하기위한 훌륭한 팁 SHIFT-ENTER입니다. 트릭을 모르면 편집하기가 끔찍합니다 .
dpw

1
PSReadLine모듈 또는 이와 동등한 기능을 사용할 때만 콘솔 버전의 PowerShell 에서이 경우가 있다고 생각합니다 . 표준 Windows 콘솔 입력 기능에서 EnterShift+Enter기능적으로 동일합니다.
Bill_Stewart

@Bill_Stewart true, PSReadline이없는 ISE 콘솔에서는 작동하지만 콘솔 호스트에서는 작동하지 않습니다.
briantist

2
명확히하려면 : 1) PSReadline모듈은 콘솔 호스트 에서만 작동 합니다 (ISE가 아님). 2) Shift+Enter콘솔 호스트에서 작동 에만 사용하는 경우 PSReadline. 3) Shift+Enter항상 ISE에서 일했습니다. 4)없이 콘솔 호스트를 사용하는 경우 PSReadline, Shift+Enter가압 기능적으로 동일하다 Enter.
Bill_Stewart

2
이것은 정답입니다. 받아 들여지고 400 개의 투표권을 가진 사람은 매우 혼란스럽고 쓸모가 없습니다!
FLICKER

4

문자열을 여러 줄로 분리하려는 경우 "+"를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

다음과 같이 보일 것입니다 :

$header = "Make,ComputerName,Model,Windows Version"

2

명령 줄에 대해 이야기하고 있다고 가정합니다. 스크립트에 있으면 줄 바꿈이 명령 구분 기호로 작동합니다.

명령 행에서 세미콜론 ';'을 사용하십시오.


1
  1. 세미콜론 ;을 사용하여 명령을 분리 하십시오.
  2. 백 슬래시 \\에서 이중 백 슬래시 를 교체하십시오 \.
  3. "'" 'PATH'"와 같은 명령을 전환하기 위해 안전한 주소를 전달하는 데 사용하십시오 .

이 ps1 명령은 로케일 pfx 인증서를 설치합니다.

powershell -Command "$pfxPassword = ConvertTo-SecureString -String "12345678" -Force -AsPlainText ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\My -Password $pfxPassword ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\Root -Password $pfxPassword"




0

여기에 코너 케이스를 추가하십시오. 5 분 절약 할 수 있습니다. 일련의 동작을 사용하는 경우 "."를 넣어야합니다. 줄 끝에서 "`"(백틱) 뒤에 공백을 두십시오. 나는 이것이 어려운 길을 발견했다.

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.