2017-02-13 1 views
0

Powershellのいくつかの.tex文書のアーカイブを自動化しようとしています。名前のような宣言された変数の値を除外したいと思います。 これは私がGoogleで時間を費やして以来今までに持っていたことです。Powershell:文字列をtexファイルから取り出してそれらを切り取る

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\FamilyName{.*?}" | Select Matches 
$FamilyName = $FamilyNameLine -replace '\\FamilyName{', '' 

私は家族の名前を取得するには、これを使用してみましたが、私は、私はまだPowerShellのに新しいですしながら、最後のブラケット

を遮断しようとすることの後に、それは

@{Matches=System.Text.RegularExpressions.Match[]} 

を返します。 RegEx(私はそれをgrepでちょっと使っただけです)、私は何かが分かりにくいと感じています。

サンプル入力:

\usepackage{grffile} 
\usepackage[utf8]{inputenc} 
\usepackage{tocbibind} 
\usepackage{pdfpages} 
\usepackage{amsmath} 
\usepackage{rotating} 
\FamilyName{Mustermann} 
\cleardoublepage 
\pagenumbering{arabic} 

サンプル出力限り、私はあなたの主な問題は、このラインで理解しましたよう

echo $FamilyName 
Mustermann 
+0

@メルポメン - 編集 –

答えて

0

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | Select Matches 

machtingラインの変更を取得するにはあなたのコードは:

$FamilyNameLine = Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | select -ExpandProperty Line 

これは、パターンが一致するドキュメントの行を返します。私はMatchInfoオブジェクトのLineプロパティを使用しました。メソッドのプロパティメソッドに関する情報を取得するには、Get-Memberを使用できます。例:

$FamilyNames = @() # Empty array 
$FamilyNameLine | Foreach-Object { $FamilyNames += ($_ -replace '\\FamilyName{', '') } 

役立ちます希望を:あなたは経由で置き換えることができます。その後

Select-String $DocFullFileName -Pattern "\\Surname{.*?}" | Get-Member 
TypeName: Microsoft.PowerShell.Commands.MatchInfo 

Name   MemberType Definition              
----   ---------- ----------              
Equals  Method  bool Equals(System.Object obj)         
GetHashCode Method  int GetHashCode()             
GetType  Method  type GetType()             
RelativePath Method  string RelativePath(string directory)        
ToString  Method  string ToString(), string ToString(string directory)    
Context  Property Microsoft.PowerShell.Commands.MatchInfoContext  Context {get;set;} 
Filename  Property string Filename {get;}           
IgnoreCase Property bool IgnoreCase {get;set;}          
Line   Property string Line {get;set;}           
LineNumber Property int LineNumber {get;set;}           
Matches  Property System.Text.RegularExpressions.Match[] Matches {get;set;}   
Path   Property string Path {get;set;}           
Pattern  Property string Pattern {get;set;}           

+0

ありがとうございます! –

0

Select-Stringは、match-objectのコレクションを持つmatches-propertyを含むがこれに限定されないオブジェクトを返す。 Select-Objectは値を抽出しませんが、そのプロパティのみを持つオブジェクトを作成します。 System.Text.RegularExpressions.Match[]}

-ExpandPropertyを使用してみてくださいタイプのプロパティと一致して、一つのオブジェクトを:

@{Matches=System.Text.RegularExpressions.Match[]} 

意味:あなたは、それは、オブジェクトの文字列の定義を出力する理由である文字列としてそのオブジェクトを変換しようとしていますSelect-Stringと入力してマッチオブジェクトを直接取得します。

$FamilyNameLine = Select-String -InputObject $s -Pattern "\\FamilyName{.*?}" | Select-Object -ExpandProperty Matches 
$FamilyName = $FamilyNameLine -replace '^\\FamilyName{|}$' 

$FamilyName 

またはあなたはそれを直接抽出するためにラインを組み合わせることができ:

$FamilyName = Select-String -InputObject $s -Pattern "\\FamilyName{.*?}" | Foreach-Object { $_.Matches.Value -replace '^\\FamilyName{|}$' } 

$FamilyName 

は、私はあなたがあまりにも末尾}を削除するに置き換える修正しました。

関連する問題