• ベストアンサー

PowerShell ファイル連結&出力方法

PowerShellについてお教え下さい。Cドライブ直下に100のCSVファイルがあります。ヘッダーがある為、全CSVファイルの2行目以降を連結させて1ファイルを作りたいと思っています。 そこで下記のようなスクリプトを書きました。 Get-ChildItem $path | % {Get-Content $_ | Select-Object -Skip 1} > xxx.csv しかし、xxx.csvにデータは出力されるのですが、ループ状態に陥ってしまいファイル容量がどんどん増えていってしまいます。これを解決するにはどのようにしたらよいでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19380)
回答No.1

>ループ状態に陥ってしまい リダイレクト先が「読み込んでいるcsvファイルと同じ場所で、拡張子がcsv」なのが原因。 「> xxx.csv」ってやってるから、ファイルを順に処理していく最中に「xxx.csvが読み込み対象にされてしまう」のです。 xxx.csvが読み込み対象にされてしまうと「xxx.csvから読んで、xxx.csvに書き足す」って事になるので、「HDDが空き容量不足で書き込みが出来なくなる」と言う状態になるまで、xxx.csvの読み込みが終了しません。 これを解決するには ・リダイレクト先のファイル名を、入力対象にならない名前にする。 例えば「> xxx.tmp」などのように、リダイレクト先のファイル名をcsvじゃないファイル名にして、全ファイルの処理が終わってから「xxx.tmp」を「xxx.csv」にリネームする(xxx.tmpは拡張子がcsvじゃないから入力には使われない) ・リダイレクト先のフォルダ位置を、入力対象にならない位置にする。 例えば「> ..\xxx.csv」のように、リダイレクト先のフォルダ位置を「1つ上のフォルダ」にする(xxx.csvはフォルダが違うから入力には使われない) などの対処が必要です。

fflashing
質問者

お礼

ご回答ありがとうございます。わかってしまうと単純なことですが、そんなことがわからなく悩んでいました。拡張子を変更することにより無事に解決しました!ありがとうございました!

関連するQ&A

  • PowerShellでファイルの連結方法

    PowerShellでファイルの連結をしたいと思っています。 例えば、C:\にa.csv、b.csv、c.csvがあったとします。 Get-Contentを実行すると、問題なくCSVの中身が出力されます。 次に、ネットにあったファイル結合方法を試してました。 Get-Content *.csv > output.csv 実行すると、output.csvに次々とデータが追加されて、ループ状態でどんどん増えていきます。 強制終了で終了させましたが、1回のみファイルの結合をしたいと思いますが、どのようにすればよいでしょうか?

  • powershellでフォルダ情報を取得したい

    ■前提・実現したいこと powershellで、カレントフォルダ配下にある多数のフォルダに対し、 フォルダ名、最終更新日時、フォルダ内のjpgファイルの個数、フォルダ内のpngファイルの個数 をカンマ区切りのcsv形式でファイルに保存したいです。 ■試したこと 以下のコマンドで、ファイル名、最終更新日は取得することができました。 Get-ChildItem | Sort-Object Name | Select-Object Name, LastWriteTime | convertTo-csv -delimiter "`t" | Select -Skip 2 | Out-File ../out.txt -encoding Default 1つずつのフォルダに対して以下のコマンドでjpgファイルの個数が取得できるようです。 (Get-ChildItem . | Where-Object { $_.Extension -eq ".jpg" }).Count 最初のコマンドにうまく合わせることで、1コマンドで取得できるようにしたいのですが、 どうすればよいのか分からず、教えていただけないでしょうか。

  • PowerShellについて

    PowerShellについて 以下の構文ですが、これは、Cドライブ配下のフォルダを取得し、 アクセス権を取得しCSVに吐き出す処理のようですが、このCSVは どこにはきだされるのでしょうか? ? Cドライブで実行してみましたが、何もファイルが作られていないようです。 Get-ChildItem c:\ -Recurse | Get-ACL |Export-Csv c:ACL-List.csv

  • PowerShellの文字操作について

    恐れ入ります、Powershellを、独学でWebで、調べな柄試しているのですが、よくわからなく、初心者で申し訳ないのですが、ご指導いただけますと幸いです。 やりたいことは、CSVファイル1内から、項目Bの”AAA”を含む文字を抽出して、項目Cと別のCSVファイル2の項目で値が一致しないものを、別CSVファイルにしたいというものなのですが、 CSVファイル1の項目Bから条件一致するデータが抜き出せず、困っております。 $a = Get-Content C:\test\\1.csv | Where-Object {$_.B -like "AAA*"} |out-file C:\test\X.csv -encoding Default | Where-Object {$_.B -like "AAA*"} が良くないのか、Out-fileでファイルが作成されるのですが、中にデータが0で抽出ができませんでした。 どこでうまくいっているのかを確認する方法もわからなくて質問して本当に申し訳ありませんが、少しでも何かヒントいただけると助かります。どうぞよろしくお願いいたします。

  • 簡単なPowerShell

    Windows10のPowerShellで、ディレクトリを作りたいのですが、本日の日付の翌日の日付をyyyymmdd の形式で表した名前のフォルダを作りたいです。 例えば、本日が2022年5月25日であれば、c:\xxx\に、20220526 というフォルダを自動生成したいです。 最終的には、Windowsキー+R キーでファイル名を指定して実行から これが起動できればOKなのですが、何かスクリプトのようなものを作らなければなりませんか?(PowerShellド素人です) (Get-Date).AddDays(+1).ToString("yyyyMMdd") で翌日のyyyymmddを 取り出せることはわかったのですが、それを使って c:\xxxにフォルダはどう作るのかすらわかっていません。 mkdir c:\xxx\(Get-Date).AddDays(+1).ToString("yyyyMMdd") はやっても無駄でした。文法がわからず困ってます。

  • PowerShellでフォルダを削除できない・・・

    [PowerShell]で作成されてから90日以降のフォルダとファイルを削除したいのですが・・・フォルダの削除がうまくいきません・・・ Script Guyを参考に、 $a = Get-ChildItem C:\Scripts foreach($x in $a) { $y = ((Get-Date) - $x.CreationTime).Days if ($y -gt 90 -and $x.PsISContainer -ne $True) {$x.Delete()} } これでC:\Scripts配下のファイルを消すことができることがわかったのですが、C:\Scripts配下のフォルダを削除する方法がわかりません。 なぜこれだとファイルしか消えないのでしょうか? 対象のフォルダにはいっぱいファイル数がありかつファイルサイズもそこそこあります。 PowerShellを動かした時にマシンにかかる負荷を極力抑えたいと思っています。 (なのでループで対象日付のファイルを拾い消し→次にフォルダと考えています。負荷低減になっていますでしょうか?) 詳しい方教えていただけませんでしょうか?

  • PowerShell try~catchについて

    現在、Powershellでスクリプトを作成中ですが、動作がうまくいかず困っております。 スクリプトには以下のコードを記述しています。 簡単に書くと、対象のディレクトリにある作成から90日を超えたアイテムを削除、削除できたら"成功"、削除できなかったら"失敗"と表示します。 $log_dir #削除するファイルが入っているディレクトリ $message1 = "削除完了" $message2 = "削除失敗" try { #作成から90日経過したファイルを削除  Get-Childitem $log_dir | Where-Object [$_.LastWriteTime -lt (Get-Date).AddDays(-90)} | Remove-Item #削除完了メッセージ表示  Write-Host $message1 } catch { #削除失敗メッセージ表示 Write-Host $message2 } 現時点で$log_dirに90日を超えてないファイルがあったとします。 その際は削除されないのですが、上記のコードのままだと$message1が表示されてしまい、catchにいきません。 どう修正すれば、catchに行くでしょうか? Powershell初心者のため、申し訳ございませんが、ご教示をお願いいたします。

  • powershellでのソート

    powershellでのソート処理に関して教えてください。 list.csv F1,F2,F3 file01.txt,c:\dirA,100kb file20.txt,c:\dirC,100kb file100.txt,c:\dirG,100kb file200.txt,c:\dirG,100kb CSVで上記の様なデータがあり、F1のデータにおいて、 ファイル名の数字部分でソートしたいのですが、 意図したソートができません。 数字を考慮してのソートってどうやればよいでしょうか。 PS c:\>Get-Content .\list.csv|ConvertFrom-CSV |Sort-Object f1 F1 F2 F3 -- -- -- file01.txt c:\dirA 100kb file100.txt c:\dirG 100kb file20.txt c:\dirC 100kb file200.txt c:\dirG 100kb file01.txt→file02.txt→file100.txt→file200.txtの並びでソートさせたいです。 よろしくお願いします。

  • PowerShellのスクリプト実行方法

    PowerShellを勉強しようと思い、PowerShell ISEを起動して、色々なコマンドを実行していました。 今度はテキストエディタでコマンドを書いて、「myPSCommand.ps1」というファイルをCドライブ直下に配置しました。 下記のサイトを参考に環境変数にPATHを通しました。 http://www.oborodukiyo.info/PowerShell/v20/PS-EnviromentPath.aspx そして、ファイルをダブルクリックしたら、メモ帳が起動してきました・・・ 調べたら、下記のサイトが見つかりました。 http://www.atmarkit.co.jp/ait/articles/0709/20/news125.html セキュリティの為に、PowerShellからスクリプトを呼び出す必要があると書いてありました。 やりたい事は、あるファイルをバックアップしたいと思います。 スクリプトにコマンドを書き込んで、タスクスケジューラーで特定の時間がくると、ファイルをバックアップするような事をしたいと思います。 ただ、今の状態だとタスクスケジューラーに「myPSCommand.ps1」を指定すると、その時間がくるとメモ帳が開いてしまいます。 スクリプトのみが実行されるには、どのようにすればよろしいでしょうか?

  • powershell で特定の文字を削除したい

    powershell でコマンドの学習をしており、どうしてもやりたいことが実現できないので御教示いただきたく存じます。 学習中のパソコンのOSはWindows 7 になります。 ■前提 以下のA.txt と B.txt と C.txt があります。  ・A.txt の中身   aaa   bbb   123   456   789  ・B.txt の中身   aaa   456  ・C.txt の中身   $PSV   $Object   A123456   123   456   789   6741 ■やりたいこと A.txt と B.txt を比較して差分結果を D.txt に出力します。 次に、D.txt の数値を行ごと削除するために C.txt を使って削除したいのですが、うまくいきません。 実行したコマンドは下記になります。 ・Powershell Compare-Object (Get-Content A.txt) (Get-Content B.txt) -PassThru | Out-File D.txt -encoding Default Get-Content D.txt | Select-String "C.txt" -NotMatch コマンドが思った動作にならないため、お知恵を拝借したいです。 よろしくお願いいたします。 追加質問: 二回に分けてコマンドを実行していますが、一回のコマンドで出来たりしますか?