これが私のサンプルデータです:
上のオプションfailonnomatch
のOptionバッチ
オフオプション確認
オープンSFTP://ユーザ名:[email protected]:22ホスト鍵= "SSH-RSA 1024 00:00:00:00:00:00:00:00:00: 00:00:00:00:00:00:00 "get File * .txt \ local \ path \ Client \ File.txt
mv File * .txt / remote / archive /
出口を閉じる
このテキストファイルから情報を抽出するPowerShellスクリプトを作成したいと思います。
必要なアイテムのリスト:
これらのいくつかの方法を学べば、この方法がすべての項目に適用できることを願っています。次のPowerShell /正規表現を使用してsshキーを抽出しようとしました。
$doc -match '(?<=hostkey=")(.*)(?=")'
サンプルデータである$ doc
しかし、それは行全体を返しているように見えます。どんな助けでも大歓迎です。ありがとうございました。
場合は-match
返送された行全体を、含意はということで、あなたのLHS-match
操作である配列、今度はあなたが使用することを示唆しているGet-Content
なし-Raw
などの入力をもたらし、配列の行、ケースはこれに-match
として機能フィルター。
代わりに、;を使用してファイルを単一の複数行の文字列として読み取りますGet-Content -Raw
。スカラーLHS、そして返し、とのマッチング演算の結果が自動変数で報告されている(そのハッシュテーブルのエントリは、全体的な試合が含まれている、第一キャプチャグループがマッチしたものを、...):-match
[bool]
$Matches
0
1
# Read file as a whole, into a single, multi-line string.
$doc = Get-Content -Raw file.txt
if ($doc -match '(?<=hostkey=")(.*)(?=")') {
# Output what the 1st capture group captured
$Matches[1]
}
サンプル入力を使用すると、上記の結果が得られます
ssh-rsa 1024 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
次に、アプローチを拡張して複数のトークンをキャプチャできます。その場合は、名前付きキャプチャグループ((?<name>...)
)を使用することをお勧めします。次の例では、このような名前付きキャプチャグループを使用して、対象のトークンのいくつかを抽出します。
if ($doc -match '(?<=sftp://)(?<username>[^:]+):(?<password>[^@]+)@(?<host>[^:]+)'){
# Output the named capture-group values.
# Note that index notation (['username']) and property
# notation (.username) can be used interchangeably.
$Matches.username
$Matches.password
$Matches.host
}
サンプル入力を使用すると、上記の結果は次のようになります。
username
password
host.name.net
上記を拡張して、対象のすべてのトークンをキャプチャできます。デフォルトでは(改行)文字と一致しない
ことに注意し.
てください\n
。
x
(IgnoreWhiteSpace
正規表現を読みやすくする)オプションを:その数のトークンを抽出すると、読みにくい複雑な正規表現が生成される可能性があります。その場合、x
(IgnoreWhiteSpace
)正規表現オプションが役立ちます(インラインオプションとして(?x)
、正規表現の開始時に)。
if ($doc -match '(?x)
(?<=sftp://)(?<username>[^:]+)
:(?<password>[^@]+)
@(?<host>[^:]+)
:(?<port>\d+)
\s+hostkey="(?<sshkey>.+?)"
\n+get\ File\*\.txt\ (?<localpath>.+)
\nmv\ File\*\.txt\ (?<remotepath>.+)
'){
# Output the named capture-group values.
$Matches.GetEnumerator() | ? Key -ne 0
}
ノートは正規表現をより読みやすくするために使用される空白は、(複数の行全体に拡散)する方法無視空白が入力に一致するのに対し、マッチングしながらされなければならないエスケープ単一空間と一致するように、例えば(、\
または[ ]
、又は\s
任意の空白に一致するようにchar。)
サンプル入力を使用すると、上記の結果は次のようになります。
Name Value
---- -----
host host.name.net
localpath \local\path\Client\File.txt
port 22
sshkey ssh-rsa 1024 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
remotepath /remote/archive/
password password
username username
キャプチャグループの順序が狂っている理由$Matches
は、(タイプの)ハッシュテーブル[hashtable]
であり、そのキーの列挙順序は実装アーティファクトであることに注意してください。特定の列挙順序は保証されません。
ただし、キャプチャグループへのランダムアクセスは問題なく機能します。たとえば、$Matches.port
を返し22
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加