web-dev-qa-db-ja.com

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

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

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

339
eXXL

スペースの後にグレーブアクセントを付けることができます(バックティック)。

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

ただし、これは上記のような場合にのみ必要です。通常、コマンドがその時点で構文的に完了できない場合は、自動的に行が継続されます。これには新しいパイプライン要素の開始も含まれます。

Get-ChildItem |
  Select Name,Length

|の後に別のパイプライン要素がないためにコマンドを完了できないため、問題なく動作します。また、中括弧やその他の種類の括弧を開くと、行を直接継続することができます。

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

|と同様に、コンマもいくつかのコンテキストで機能します。

1,
2

ただし、JavaScriptの 自動セミコロン挿入 と同様に、の前に有効な文があるところで改行が発生するため、同様に壊れるものがいくつかあります。

return
  5

動作しないでしょう。

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

'Foo
bar'

その場合、文字列内に改行が含まれます。

517
Joey

私はちょうどバックティックと改行の間に any の文字があってはいけないことを知りました。空白でもコマンドは機能しません。

55
Neffets

ほとんどのCライク言語では、コードを読みやすくする場所にブレースを配置することを慎重に検討しています。

PowerShellのパーサーは、ステートメントが明らかに不完全であることを認識し、次の行を見ます。たとえば、オプションのスクリプトブロックパラメーターを受け取るコマンドレットを想像してみてください。

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

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

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

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

 Get-Foo {
 ............... 
 ............... [ [……] ............. [
]} 

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

この場合は前括弧を前の行に置く必要があるので、私はどこでもそのパターンに従います。

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

ifステートメントは言語文法の中でスクリプトブロックを必要とするので、パーサーはスクリプトブロックのために次の行を見ますが、一貫性のために、私は開き括弧を同じ行に保ちます。

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

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

cristobalito's answer に展開するには:

私はあなたがコマンドラインで話していると仮定します - それがスクリプトの中にあるなら、そして改行>がコマンドデリミタとして働きます。

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

例えば:

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

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

PowerShellおよびPowerShell ISEでは、使用することも可能です。 Shift + Enter (標準バッククォート`の代わりに)複数行編集のために各行の終わりに。

14
Bad

文字列を複数の行に分割しようとしている場合は、「+」を使用できます。例えば:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

ちょうどのようになります:

$header = "Make,ComputerName,Model,Windows Version"
2
Steve Fellwock

私はあなたがコマンドラインで話していると仮定します - それがスクリプトの中にあるなら、そして改行がコマンドデリミタとして機能します。

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

1
cristobalito
  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