Powershellで実行しているスクリプトがあり、スクリプト名とスクリプトコンテンツ自体の間に、結果のテキストファイル出力に行を追加できるようにしたいと考えています。
現在、下から、$str_msg = $file,[System.IO.File]::ReadAllText($file.FullName)
という行が必要ですが、$file
と次の式の結果を区切るための行が必要です。これどうやってするの?
foreach ($file in [System.IO.Directory]::GetFiles($sqldir,"*.sql",
[System.IO.SearchOption]::AllDirectories))
{
$file = [System.IO.FileInfo]::new($file);
$Log.SetLogDir("");
$str_msg = $file,[System.IO.File]::ReadAllText($file.FullName);
$Log.AddMsg($str_msg);
Write-Output $str_msg;
# ...
}
$str_msg = $file,[System.IO.File]::ReadAllText($file.FullName)
はstringを作成せず、2要素の配列を作成します([object[]]
)、$file
[System.IO.FileInfo]
インスタンス、およびそのファイルのコンテンツを含む文字列で構成されます。
おそらく、.AddMsg()
メソッドは単一の文字列を想定しているため、PowerShellstringifyして配列を単一の文字列に変換します。 PowerShellは、配列を1つのスペースを区切り記号として要素を連結してデフォルトで配列を文字列化します。例:[string] (1, 2)
は'1 2'
を返します。
したがって、最初に$str_msg
をstringとして作成し、区切り文字として明示的な改行を使用することをお勧めします。
$strMsg = "$file`r`n$([System.IO.File]::ReadAllText($file.FullName))"
エスケープシーケンス"`r`n"
を使用して、Windows固有の改行シーケンスであるCRLFを生成していることに注意してください。 Unixライクなプラットフォームでは、"`n"
(LF)だけを使用します。
.NETは、プラットフォームに適した改行シーケンス(または、[Environment]::NewLine
内に$([Environment]::NewLine)
として埋め込むこともできます)を返すクロスプラットフォームの抽象化"..."
を提供します。
文字列補間の代わりに、.NET String.Format()
メソッドに基づく文字列フォーマット演算子である-f
を使用することもできます。
$strMsg = '{0}{1}{2}' -f $file,
[Environment]::NewLine,
[System.IO.File]::ReadAllText($file.FullName)
復帰PowerShell特殊文字、「 `r」を使用する必要があります。
このように使用して、行に改行を追加します。
$str_msg = $file,"`r",[System.IO.File]::ReadAllText($file.FullName);
Poewershellの特殊文字の詳細については、 このドキュメント を確認してください。
最初の答えに乾杯
Backtick-r + backtick-nは、PSの改行でキャリッジリターンを行います。 $ file変数のGet-Contentを新しい配列変数として実行し、キャリッジリターンを特定のインデックスに挿入できます。
ファイルの例:test123.txt
ファイルの内容がこれである場合:
line1
line2
line3
インデックスを取得できるように、内容を配列変数に格納します
[Array]$fileContent = Get-Content C:\path\to\test123.txt
Line2とline3の間に復帰を追加するには:
$fileContent2 = $fileContent[0..1] + "`r`n" + $fileContent[2]
次に、新しいファイルを出力します。
$fileContent2 | Out-File -FilePath C:\path\to\newfile.txt
この代替アプローチが将来の回答求職者に役立つことを願っています