質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

576閲覧

Powershellで特定のパーセンテージ以下の情報を出力したい

SUSU0703

総合スコア17

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2018/05/25 04:49

編集2018/05/25 04:51

こんにちは。

CSVのPCリストの中からパーセンテージが10%以下のものだけを抽出して別CSVファイルに出力したいと思っています。

例えばこのようなCSVファイルがあったとして(PCList.csv)
Hostname % Free
PC_aaaa 0%
PC_bbbb 1%
PC_cccc 2%
PC_dddd 3%
PC_eeee 4%
PC_ffff 5%
PC_gggg 6%
PC_hhhh 7%
PC_iiii 8%
PC_jjjj 9%
PC_kkkk 10%
PC_llll 11%
PC_mmmm 12%
PC_nnnn 13%
PC_oooo 14%
PC_pppp 15%

そこから10%以下のものだけを抽出して別ファイル(FilterResult.csv)にしたいのですが、以下のようにすると

import-csv "./PCList.csv" | where {$_.'% Free' -lt '10%'} | Export-Csv "./FilterResult.csv" -NoTypeInformation

0%と1%のものしか出力されません。これはどうすれば10%以下の分だけ抽出出来ますでしょうか。宜しくお願い致します。
Hostname % Free
PC_aaaa 0%
PC_bbbb 1%

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

'% Free'で取得できる値は"10%"と数値ではなく文字列であるため、数値の大小より文字数の大小が優先して比較対象となってしまい質問の様な結果になってしまいます。  

例えば

Import-Csv .\PCList.csv -Delimiter "`t" | where { [int]($_.'% Free'.Replace('%','')) -lt 10}

の様に'% Free'の値をint型に変換して比較すると上手く動作します。
(ただし、この例ではエラー処理がかなりおざなりですので、実データに対してはもう少しきちんとした処理を実装してください。)

PS C:\> Import-Csv .\PCList.csv -Delimiter "`t" | where { [int]($_.'% Free'.Replace('%','')) -lt 10} Hostname % Free -------- ------ PC_aaaa 0% PC_bbbb 1% PC_cccc 2% PC_dddd 3% PC_eeee 4% PC_ffff 5% PC_gggg 6% PC_hhhh 7% PC_iiii 8% PC_jjjj 9%

投稿2018/05/25 05:27

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SUSU0703

2018/05/25 06:39

stknohgさん、早速ありがとうございます! そのままコピペして試してみたのですが、以下のようなエラーが出てしまいました。 PS C:\Powershell> Import-Csv .\PCList.csv -Delimiter "`t" | where { [int]($_.'% Free'.Replace('%','')) -lt 10} You cannot call a method on a null-valued expression. At line:1 char:51 + ... -Delimiter "`t" | where { [int]($_.'% Free'.Replace('%','')) -lt 10} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull パイプラインの前の部分を実行するとちゃんと出力されています。こちらのエラーお分かりになりますでしょうか。どうぞよろしくお願いいたします。 PS C:\Powershell> Import-Csv .\PCList.csv -Delimiter "`t" Hostname,% Free --------------- PC_aaaa,0% PC_bbbb,1% PC_cccc,2% PC_dddd,3% PC_eeee,4% PC_ffff,5% PC_gggg,6% PC_hhhh,7% PC_iiii,8% PC_jjjj,9% PC_kkkk,10% PC_llll,11% PC_mmmm,12% PC_nnnn,13% PC_oooo,14% PC_pppp,15%
stknohg

2018/05/25 06:42

-Delimiter "`t" の部分は無しで実行してください。 質問文を見るとCSVファイルのカンマが消失しており、タブ区切りに見えたので私の環境ではタブ区切りで試してたんですよね。
SUSU0703

2018/05/25 06:52

出来ましたーー! 素晴らしい、大変助かりました。ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問