PowerShell에서 긴 명령을 여러 줄로 나누는 방법


227

PowerShell에서 다음과 같은 명령을 어떻게 여러 줄에 나눕니 까?

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"


답변:


322

후행 백틱 문자, 즉

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
-verb:sync `
-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
-dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

공백이 중요합니다. 필요한 형식은 Space`Enter입니다.


1
이것은 명령 히스토리 (위쪽 화살표) 기능을 깨뜨리는 것 같습니다. 각 줄은 별도의 명령으로 나타납니다. 이 주위에 방법이 있습니까?
Richard Ev

2
powershell 3 이상을 실행중인 경우 github.com/lzybkr/psreadline을 참조하십시오. 내역 순회는 여러 줄로 수정되었습니다.
x0n

43
백틱 앞의 공간은 필수입니다. # 학습 – 하드
Josh Graham

29
@ josh-graham 백틱 뒤에 공백이나 인라인 주석이 없어야합니다. # learned-the-hard-way
RayLuo

1
백틱은 깨지기 쉽고 (위의 주석 상태와 같이) 파일을 구문 분석하거나 검토 할 때 찾기가 어렵습니다. 코드를 더 쉽게 디버깅하려면 @StevenPenny의 답변이 더 좋습니다.
mjd2

67

더 깨끗한 인수 전달 방법은 splatting 입니다.

다음과 같이 매개 변수와 값을 해시 테이블로 정의하십시오.

$params = @{ 'class' = 'Win32_BIOS';
             'computername'='SERVER-R2';
             'filter'='drivetype=3';
             'credential'='Administrator' }

그런 다음 커맨드 렛을 다음과 같이 호출하십시오.

Get-WmiObject @params

Microsoft 문서 : Splatting 정보

TechNet Magazine 2011 : Windows PowerShell : 스플래 팅

Powershell 2.0 이상에서 작동하는 것 같습니다


5
대단하다! 그리고 당신은 다음과 같은 매개 변수를 추가 할 수 있습니다 $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/...
bgmCoder

1
세미콜론은 괜찮지 만 불필요합니다. 한 줄에 여러 값이있는 경우에만 필요합니다.
짐 자작 나무

38

아, 그리고 매우 긴 문자열을 나누고 싶다면 HTML 과 같이 @바깥 쪽의 양쪽에 를 넣어서 할 수 있습니다 ".

$mystring = @"
Bob
went
to town
to buy
a fat
pig.
"@

당신은 이것을 정확히 얻습니다 :

Bob
went
to town
to buy
a fat
pig.

Notepad ++를 사용 하는 경우 문자열 블록으로 올바르게 강조 표시됩니다.

이제 해당 문자열에 큰 따옴표를 포함 시키려면 다음과 같이 추가하십시오.

$myvar = "Site"
$mystring = @"
<a href="http://somewhere.com/somelocation">
Bob's $myvar
</a>
"@

당신은 이것을 정확히 얻을 것입니다 :

<a href="http://somewhere.com/somelocation">
Bob's Site
</a>

그러나 @ -string에 큰 따옴표를 사용하면 메모장 ++은이를 인식하지 못하며 경우에 따라 따옴표 또는 따옴표가없는 것처럼 구문 색상 표시를 전환합니다.

더 좋은 점은 $ variable을 삽입하는 곳마다 해석됩니다! (텍스트에 달러 기호가 필요한 경우``$ not-a-variable ''과 같은 체크 표시로 이스케이프 처리하십시오.)

주의! 라인의 시작 부분에 결승전 "@을 넣지 않으면 실패합니다. 코드에서 들여 쓰기 할 수 없다는 것을 알아내는 데 1 시간이 걸렸습니다!

다음은 주제에 대한 MSDN 입니다. Windows PowerShell "Here-Strings"사용


1
깔끔한 트릭이지만 변수 $가 있으면 작동하지 않는 것 같습니다. "문자열 헤더 뒤에 문자를 사용할 수 없습니다 ..."
tofutim

변수 이름을 바꿀 수 있다고 생각하지 않고 문자열 만 있습니다.
bgmCoder

19

백틱 연산자를 사용할 수 있습니다.

& "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
    -verb:sync `
    -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
    -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"

그것은 여전히 ​​내 취향에 비해 너무 길기 때문에 잘 알려진 변수를 사용합니다.

$msdeployPath = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
$verbArg = '-verb:sync'
$sourceArg = '-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web"'
$destArg = '-dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"'

& $msdeployPath $verbArg $sourceArg $destArg

1
Powershell 이외의 전문가에게는 가장 읽기 쉬운 옵션이기 때문에 다른 제안보다 변수 이름이 마음에 듭니다. 스플래 팅을 사용하는 튜토리얼 / 설정 가이드를 보면 스플래 팅에 대한 하위 튜토리얼없이 진행중인 작업에서 완전히 손실됩니다. 마찬가지로, 백틱은 깨지기 쉬우 며 단순한 시도 된 PS 변수보다 덜 알려져 있습니다.
조쉬 데스몬드

13

기능이있는 경우 :

$function:foo | % Invoke @(
  'bar'
  'directory'
  $true
)

cmdlet 이있는 경우 :

[PSCustomObject] @{
  Path  = 'bar'
  Type  = 'directory'
  Force = $true
} | New-Item

응용 프로그램이있는 경우 :

{foo.exe @Args} | % Invoke @(
  'bar'
  'directory'
  $true
)

또는

icm {foo.exe @Args} -Args @(
  'bar'
  'directory'
  $true
)

3

PowerShell 5 및 PowerShell 5 ISE에서는 각 줄 끝에 표준 백틱이 아닌 여러 줄 편집에 Shift+ 만 사용하는 것도 가능합니다 .Enter`

PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" # Shift+Enter
>>> -verb:sync # Shift+Enter
>>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" # Shift+Enter
>>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

0

계산을 통한 스 플랫 방법

스 플랫 방법을 선택하는 경우 다른 매개 변수를 사용하여 계산을 수행하십시오. 실제로 때로는 변수를 먼저 설정 한 다음 해시 테이블을 만들어야합니다. 또한 형식에는 키 값이나 세미콜론 (작은 따옴표) 주위에 작은 따옴표가 필요하지 않습니다 (위에서 언급 한 것처럼).

Example of a call to a function that creates an Excel spreadsheet

$title = "Cut-off File Processing on $start_date_long_str"
$title_row = 1
$header_row = 2
$data_row_start = 3
$data_row_end = $($data_row_start + $($file_info_array.Count) - 1)

# use parameter hash table to make code more readable
$params = @{
    title = $title
    title_row = $title_row
    header_row = $header_row
    data_row_start = $data_row_start
    data_row_end = $data_row_end
}
$xl_wksht = Create-Excel-Spreadsheet @params

참고 : 파일 배열에는 스프레드 시트를 채우는 방법에 영향을주는 정보가 포함되어 있습니다.


-1

여러 줄에서 문자열을 나누는 또 다른 방법은 문자열 중간에 빈 식을 넣고 줄을 바꾸는 것입니다.

샘플 문자열 :

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

여러 줄로 나뉩니다.

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.