複数行コマンドを入力する方法


425

PowerShellコマンドラインを複数の行に分割することは可能ですか?

Visual Basicでは、アンダースコア(_)を使用してコマンドを次の行に続けることができます。


3
「なぜバックスラッシュでないのか」という質問は、Bruce PayetteのPowerShell in Actionでうまくカバーされています。素晴らしい本。ブルースはプログラミング言語の歴史について幅広い知識を持っています。この本のV2を楽しみにしています。
Jay Bazuzi


1
オフトピックの場合は申し訳ありませんが、shコマンドを使用してスクリプトを送信する場合は、バックスラッシュを使用できるようにbashの規則が適用されます。その場合、スクリプトにはUNIXスタイルの末尾も必要です。
kon psych 2016年

複数の行でコマンドを区切るには、 `文字を使用するだけ
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ののと同様に、けれども、心に留めておいてください自動セミコロン挿入、改行はそれがポイントで発生するため、同様に壊れているいくつかのものがありますされて有効なステートメントが先行は:

return
  5

動作しないでしょう。

最後に、(すべての種類の)文字列も1行を超えて拡張できます。

'Foo
bar'

次に、文字列内に改行が含まれます。


4
また、他のいくつかのトークンが|、およびなどの行継続文字としても機能することを忘れないでください{
キース・ヒル

1
@キース:ありがとう、私はそれを含めました。それらはおそらく言及するにはあまりにも明白だった;-)
Joey

16
いや、将来の参考のためにこれらの他の文字を文書化しておくのは良いことです。
キース・ヒル

1
@JackDouglas:開き括弧の直後に改行を入れることはできますが、演算子の前の式の中ではできません。そうは言っても、文法の見落としになると思います。
ジョーイ14

10
どうやら、ISEコマンドペインでは行の継続が機能しません。
Khouri Giordano

64

私はちょうどそこにあってはならないことが分かった任意のバックティックと改行の間の文字。空白文字でもコマンドは機能しません。


10
これは技術的には質問に対する答えではありませんが、+ 1は絶対に不可欠であるためです。私はこれを難しい方法で見つけただけで、将来の開発では可能な限りバックティックを回避するでしょう。
Dave Markle 2014年

4
したがって、Powershellで長い行を分割するための堅牢な方法は本質的にありません。どこにでも2画面幅のPowerShellスクリプトが見られる傾向があるのも不思議ではありません。#ShakeMyHead
RayLuo

私もこれで苦労していました...次のように、バックティックの前にインラインコメントを挿入してコメントを含めることができます:Some-Command `-arg1 <#Explain arg 1#>` -arg2 <#Explain arg 2 #>
joelsand 2017

2
ああ。これにより、ドキュメントやWebサイトにPowerShellコードを投稿するのが不必要に難しくなります。Shift+ Enterを使用するとコマンドが人間に誤って読み取られたり、バックティックを使用するとISEのコマンドラインで誤って解析されたりする恐れがあります。
GuitarPicker

コメントの性質上、反対票を投じます(元の質問に対する完全な回答ではありません)。
CodeBreaker

38

ほとんどのC言語のような言語では、コードを最も読みやすくするために中括弧を配置することを意図的にしています。

PowerShellのパーサーは、ステートメントが完全に完了していないことを認識し、次の行を調べます。たとえば、オプションのスクリプトブロックパラメーターを取るコマンドレットを想像してください。

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

スクリプトブロックが非常に長い場合は、次のように記述します。

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

しかし、これは機能しません。パーサーには2つのステートメントが表示されます。1 Get-Fooつ目はスクリプトブロックで、2つ目はスクリプトブロックです。代わりに、私は書きます:

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

行継続文字( `)を使用することもできますが、コードが読みにくくなり、バグが発生します。

この場合、左中括弧が前の行にある必要があるため、どこでもそのパターンに従います。

    if(条件){
        .....
    }

なお、ifパーサはスクリプトブロックの次の行になりますので、文は、言語の文法でのスクリプトブロックを必要とするが、一貫性のために、私は同じ行にオープンブレースを保ちます。

同様に、長いパイプラインの場合は、パイプ文字(|)の後で中断します。

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

どのようにifし、foreachかつtry作業、その後?彼らは次の行でスクリプトブロックを許可します...これはそれが可能であることを意味します
ナハト-モニカを復活させる

@Nacht:さびたメモリから:言語文法に従って、スクリプトブロックを必要とするステートメントは改行を超えて解析し、改行を見つけます。誰か確認できますか?
Jay Bazuzi、2012年

2
@Nacht:「しかし、これは機能しません」とは、ほとんどの場合、追加のパラメーターがオプションである状況を指していました。
ジェイバズジ

1
ああ、今あなたが何を意味しているのか分かります。したがって、「if」と「foreach」は実際にはコマンドレットではありません。これらは実際には文法の一部であるため、強制的に次の行に移動します。次に、ユーザー定義関数に次の行からスクリプトブロックを読み取らせる方法はありませんか。私はあなたの上の答えがその質問に正確に答えると思います。
ナハト-2012年

29

クリストバリトの答えを拡張するには:

コマンドラインで話していると思います-スクリプト内にある場合、改行はコマンド区切り文字として機能します。

コマンドラインでは、セミコロン「;」を使用します。

例えば:

コマンドラインでPowerShellスクリプトに署名します。改行はありません。

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

10
質問に対する答えではなく、あなたの答えが私の質問に答えました。:)
フレデリク

1
それは興味深いですが、それはOPが求めていたものの反対です。OPは、単一のコマンドを複数の行に分割したいと考えていました。複数のコマンドを1行に結合する方法を説明しました。
Daniel Yankowsky

17

PowerShellおよびPowerShell ISEでは、(標準のバックティックの代わりに)各行の末尾にShift+ を使用Enterして複数行を編集することもでき`ます。


2
これは、複数行のhere-stringを編集するのに最適なヒントですSHIFT-ENTER。トリックを知らない場合は、編集が大変です。
dpw

1
これは、PowerShellのコンソールバージョンでは、PSReadLineモジュールまたは同等のものを使用する場合にのみ当てはまると思います。標準のWindowsコンソール入力関数でEnterShift+Enter機能的には同等です。
Bill_Stewart 2017年

@Bill_Stewart true、PSReadlineなしのISEコンソールでは機能しますが、コンソールホストでは機能しません。
ブライアンティスト、2017年

2
明確にするために:1)PSReadlineモジュールはコンソールホストでのみ機能します(ISEでは機能しません)。2)を使用する場合にのみShift+Enter、コンソールホストで機能PSReadlineます。3)Shift+Enter常にISEで機能してきました。4)なしPSReadlineでコンソールホストを使用する場合、Shift+Enterは機能的にを押すのと同じEnterです。
Bill_Stewart 2017

2
これは正解です。受け入れられて400の賛成票を持つものは、非常に混乱し、役に立ちません。
フリッカー、

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分節約できるかもしれません。一連のアクションを使用する場合は、「。」を付ける必要があります。行末にスペースを1つ残し、その後に「 `」(バックティック)を続けます。私はこれを難しい方法で見つけました。

$yourString = "HELLO world! POWERSHELL!". `
                  Replace("HELLO", "Hello"). `
                  Replace("POWERSHELL", "Powershell")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.