2017-08-10 4 views
1

私は.CSVファイル内の引用符を削除するには、次のPowerShellスクリプトを使用しています:ワイルドカードパスを使用して読み込んだ同じファイルにどのように書き戻すことができますか?

(gc C:\TestQualifier*.csv) | % {$_ -replace '"', ""} | out-file C:\TestQualifier.csv -Fo -En ascii 

ファイルは常にTestQualifierという名前になりますが、ファイル名の末尾にスタンプの日付と時刻を有することができる(たとえば、 TestQualifier10082017091010)。ワイルドカードはこれをソースで処理しますが、ソースファイル名を出力ファイル名に書き込む方法を理解できません。 Out-Fileはワイルドカードを受け入れません。

理想的には、ファイルが出力されるときに既存のファイルを上書きすることもできます。

助けがあれば助かります。

答えて

1

パスを解決する必要があり、理想的には変数をパイプに使用するために変数に保存する必要があります。独自のリターンSystem.Management.Automation.PathInfoオブジェクト上

$path = Resolve-Path C:\TestQualifier*.csv | Select -Expand Path 

Resolve-Pathので、我々はちょうどそれを取得するには、パスのプロパティを展開します。

そのフィルタに一致するパスが1つしかないと仮定すると、文字列として$pathに格納されます。

(Get-Content $path) | ForEach-Object{$_ -replace '"', ""} | Out-File $path -Force -Encoding ascii 

これは一回限りのコードであれば、それは問題ではありませんが、あなたがその後で使用する予定の場合は、別名を使用しないように、完全なパラメータ名を使用するために、それが簡単になります。
完全なコマンドとパラメータ名を使用すると、コードをすぐに読むことができます。

+0

良いアドバイスの完全な名前。 'Resolve-Path C:\ TestQualifier * .csv | 'の簡単な代替手段です。選択した-ExpandProperty Path'は、プロバイダのネイティブパス(.NETメソッド呼び出しでも安全に使用できます)に展開されます: 'Convert-Path C:\ TestQualifier * .csv'。 (後者は、 'Resolve-Path C:\ TestQualifier * .csv | Select -ExpandProperty ProviderPath'と同等です。) – mklement0

+1

クール良いことを知ってください – Matt

0

複数のファイルをワイルドカードで処理する必要がある場合:

ForEach ($File in (gci C:\TestQualifier*.csv)){(gc $File)|%{$_ -replace '"'}|out-file $File -Fo -En ascii} 

冗長

ForEach ($File in (Get-ChildItem C:\TestQualifier*.csv)){ 
    (Get-Content $File) | ForEach-Object { 
     $_ -replace '"' 
    } | Out-File $File -Force -Encoding ascii 
} 
1

-pv-PipelineVariable)共通パラメータ(PSV4 +)を使用して、別のソリューションを、提供するには:

Get-Item C:\TestQualifier*.csv -pv file | % { 
    (Get-Content $file.FullName) | % { $_ -replace '"' } | 
    Out-File $file.FullName -Force -Encoding Ascii 
} 

* As質問では、入力ファイル全体がの先頭にあると確実に読み取れるように、Get-Contentコールは(...)で囲まれています。この結果、入力ファイルに結果を書き戻すことができます。
* .FullNameは厳しく、この場合には必要ですが、[System.IO.FileInfo]インスタンスは常にファイルのフルパスに文字列に変換しませないので、それは、それを使用するほうが安全ですされていない - this GitHub issueを参照してください。
* $_ -replace '"', ""は、$_ -replace '"'に短縮されました。ではありません。は空の文字列を指定するのと同じです。

注目的のファイルを検索するための最初のステップでGet-Itemの使用、及び方法-pv file次いで%ForEach-Object)スクリプトブロック内に手で入力ファイルを表す変数$fileを、定義します。
より一般的に言えば、には、各パイプライン処理ステップでというインスタンス出力がGet-Itemであり、後続のパイプラインコマンドのスクリプトブロックがそれを参照できるようになっています。

+1

私はいつも問題を抱えていました。私は遊ぶことを見てうれしい – Matt

関連する問題