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"

...も参照してくださいstackoverflow.com/questions/3235850/...
SteveC

回答:


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 2013

2
powershell 3以降を実行している場合は、github.com / lzybkr / psreadlineを参照してください。履歴トラバーサルは複数行ステートメントで修正されています。
x0n 2013年

43
バックティックの前のスペースが必要です。#learned-the-hard-way
Josh Graham

29
@ josh-grahamそして、バックティックの後にスペース(またはインラインコメント)があってはなりません。#learned-the-hard-way
RayLuo

1
バックチックは(上記のコメントの状態のように)壊れやすく、ファイルを解析または確認するときに見つけるのが困難です。@StevenPennyの答えは、コードのデバッグを簡単にしたい場合に適しています。
mjd2

67

よりクリーンな引数を渡すための別の方法はスプラッティングですです。

次のように、パラメータと値をハッシュテーブルとして定義します。

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

そして、次のようにコマンドレットを呼び出します。

Get-WmiObject @params

Microsoft Docs:スプラッティングについて

TechNetマガジン2011:Windows PowerShell:スプラッティング

Powershell 2.0以降で動作するようです


5
これは素晴らしい!そして、あなたは、このようなパラメータを追加することができます。 $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/...
bgmCoder

1
セミコロンは大丈夫ですが、不必要です。1行に複数の値がある場合にのみ必要です。
ジムバーチ

38

ああ、HTMLのように分解したい非常に長い文字列がある場合@は、アウターの両側にa を置くことで、次のようにできます"

$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>

ただし、そのような@文字列で二重引用符を使用すると、Notepad ++はそれを認識せず、場合によっては、引用符で囲まれていない、または引用符で囲まれているかのように構文の色分けを切り替えます。

そして何がより良いのかはこれです:$ variableを挿入するところはどこでも解釈されます!(テキストにドル記号が必要な場合は、「$ not-a-variable」のようなチェックマークでエスケープします。)

通知!決勝戦"@ラインの最初に置かないと失敗します。コードでインデントできないことを理解するのに1時間かかりました。

これは、件名に関するMSDNです。WindowsPowerShellを使用する“ Here-Strings”


1
端正なトリックですが、変数$がある場合は機能しません。「ここの文字列ヘッダーの後に文字を使用することはできません...」と表示されます
tofutim

変数名を壊すことはできないと思います。文字列だけです。
bgmCoder 2013年

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変数ほどよく知られていません。
Josh Desmond

13

関数がある場合:

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

コマンドレットがある場合:

[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.