PowerShell -Part 3

■ このスレッドは過去ログ倉庫に格納されています
2018/10/09(火) 17:46:48.32ID:G4IJkzod
前スレ
【最強CUI】PowerShell -Part 2
http://mevius.5ch.net/test/read.cgi/tech/1480109402/
468デフォルトの名無しさん
垢版 |
2018/12/24(月) 09:16:30.66ID:dTDa6WWm
しかし、この公開モジュールもったいない。改善すれば大変便利
他のサイトで回答したんだけど、データ大きくなければ、結構使える
次の例はexcelブック読んで、性別(列名)の男子だけ抽出して
新たなブック作成した例

(Import-Excel .\Member.xlsx).Where{$_.性別 -eq "男子"}|
Export-Excel .\NewMember.xlsx

これだけでも便利。自分でコマンドレット作っちゃおうかという気が
ムクムクと・・・・
2018/12/24(月) 17:12:10.50ID:X+oEGSDK
SAS : 睡眠時無呼吸症候群 (Sleep Apnea Syndrome)
2018/12/29(土) 14:12:24.74ID:sblaCsBM
多次元配列$aと$bに数値要素を入れて
それらの要素を同じ要素同士で足したり引いたり掛けたりしたものを
同じ構造の多次元配列$cに入れようとしましたが、

powershellの多次元配列の作り方が分かっていないのか、どうしても1つの成分に1つの数値が入りません

$a=@(@(1,2),@(3,4))
$b=@(@(7,8),@(9,10))

$c = New-Object "object[,]" 2,2
だとダメなんですかね?
2018/12/29(土) 14:18:25.07ID:alN1JQ5R
>同じ構造の
同じ構造じゃない
ジャグ配列で検索してみてからまた来てくれ
472デフォルトの名無しさん
垢版 |
2018/12/29(土) 15:15:38.87ID:KNALm1aR
>>470
そういう質問もいいけど
一つ上の層に行って、何をしたいかを聞いてみてもいいかもよ。
そこにもっていかなくても良い手段、あるいは適切なコマンドレットが
すでに存在しているかもしれないので。

余計なお世話で失礼かなとは思ったけど。
2018/12/29(土) 15:46:12.70ID:/U5cTh+v
まぁこれだと「ダメです」としか返ってこないもんね
2018/12/29(土) 17:29:03.55ID:sblaCsBM
$a = New-Object "object[,]" 2,2

$a[0,0] = 1
$a[0,1] = 2
$a[1,0] = 3
$a[1,1] = 4

$b = New-Object "object[,]" 2,2

$b[0,0] = 7
$b[0,1] = 8
$b[1,0] = 9
$b[1,1] = 10

$c = New-Object "object[,]" 2,2

$c[0,0] = $a[0,0] + $b[0,0]
$c[0,1] = $a[0,1] + $b[0,1]
$c[1,0] = $a[1,0] + $b[1,0]
$c[1,1] = $a[1,1] + $b[1,1]

echo $c

出来ました
ありがとうございました
2018/12/29(土) 17:52:09.19ID:sblaCsBM
$a = New-Object "object[,]" 2,2

$a[0,0] = 1.0
$a[0,1] = 2.0
$a[1,0] = 3.0
$a[1,1] = 4.0

$b = New-Object "object[,]" 2,2

$b[0,0] = 7.0
$b[0,1] = 8.0
$b[1,0] = 9.0
$b[1,1] = 10.0

$c = New-Object "object[,]" 2,2

$c[0,0] = 0.4*$a[1,0] + 0.6*$b[0,1]
$c[0,1] = 1.2*$a[0,0] + 0.2*$b[1,1]
$c[1,0] = 0.6*$a[0,0] + 0.8*$b[1,1]
$c[1,1] = 0.3*$a[1,0] + 0.7*$b[0,1]

echo $c

PS [ディレクトリ] .\array3.ps1
6
3.2
8.6
6.5

こういうのも出来ました
ありがとうございました
2乗とか平方根とかも入れてwhileで多数回回して時代遅れのカオス論ごっこで楽しみます
476デフォルトの名無しさん
垢版 |
2018/12/30(日) 16:51:48.83ID:Tt0EhWYe
よかったよかった
2018/12/31(月) 02:48:07.85ID:E3GRK6g9
Ruby の行列を使った方が良さそう
478デフォルトの名無しさん
垢版 |
2018/12/31(月) 06:10:51.81ID:hv1/uFm+
>Ruby の行列を使った方が良さそう

わざわざRuby使うくらいならR使うでしょうに
2018/12/31(月) 10:17:55.48ID:4o6gq25f
Get-Chlditem の -System オプションて機能してなくね? 5.1と6.1で検証した
https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Management/Get-ChildItem?view=powershell-6
2018/12/31(月) 10:51:50.10ID:4o6gq25f
使えないのでこんな風にしてる
gci -force |?{$_.Mode -match 's'}
2018/12/31(月) 13:52:03.55ID:i7poOdM+
>>479-480
普通に機能してるけど?
cmd.e xeのdir /asみたいなことを期待してるならGet-ChildItem -Force -Systemでいけるかと
2018/12/31(月) 20:02:41.24ID:4o6gq25f
-force ないと機能しないのか…
2019/01/01(火) 03:34:35.89ID:ssh3fXac
Ruby の行列では、

a = Matrix[[1, 2], [3, 4]]
b = Matrix[[7, 8], [9, 10]]

p a + b

結果
[[8, 10], [12, 14]]
2019/01/01(火) 09:29:48.04ID:HeFEoGOE
>>482
仕様が違うだけ
Get-ChildItem の -System は単なるフィルター
dir の /a オプションは -Force 相当の機能を含んでる
2019/01/01(火) 10:43:40.32ID:ISJZg14N
Rならこんな感じになるのかな?

a <- matrix(1:4, 2, 2, byrow=T)
b <- matrix(7:10, 2, 2, byrow=T)

a <- a[,1]
b <- b[,2]

matrix(c(0.4, 0.6, 1.2, 0.3), 2, 2)
* rbind(rev(a), a)
+ matrix(c(0.6, 0.8, 0.2, 0.7), 2, 2)
* rbind(b, rev(b))

結果をimage関数に渡してループすると綺麗にチカチカするんだろうか
486デフォルトの名無しさん
垢版 |
2019/01/01(火) 16:03:09.00ID:T6MHXAKy
SAS/IMLだと

a={1 2,3 4};
b={7 8,9 10};
c=a+b;
print c;
2019/01/01(火) 16:25:47.24ID:BBGreIch
行列系数値計算ならJuliaも使いやすい
a = [1 2; 3 4]
b = [7 8; 9 10]
print(a + b)
488デフォルトの名無しさん
垢版 |
2019/01/01(火) 16:57:52.05ID:UIhiNbM3
はっきりしているのは、どれもめちゃ遅い
489デフォルトの名無しさん
垢版 |
2019/01/01(火) 16:59:31.69ID:UIhiNbM3
アルゴリズムを考えたり検証したりには
便利という仕組みですね。
これはこれで価値がある。
2019/01/02(水) 00:00:30.28ID:uM4gOpCa
いろんな言語で書いてくれてるけど
元のソースは行列の単純な和なんて求めてないよね
どうせなら元ソースのエレガントな移植が見たい
491デフォルトの名無しさん
垢版 |
2019/01/02(水) 07:11:32.67ID:JfU1VO50
元のソースは何らかのルールに沿ってたものなのでしょうか
2019/01/02(水) 15:30:48.31ID:meZPNJeK
rubyガイジのフリにまんまと乗ったアホ共が悪い
493デフォルトの名無しさん
垢版 |
2019/01/02(水) 16:52:22.21ID:sVSsgdXZ
まあ、乗ったというより
別にRubyに求めてないし、それが目的なら
もっといいものがあるよいうことを
Rubyフェチの方に教えてあげただけ。
PowerShellはそこを求めたものとちゃうから。
2019/01/02(水) 16:57:28.69ID:PMrmWLAE
一般人の正月:和歌を読んで批評し合う
逸般人の正月:コードを書いて批評し合う
2019/01/02(水) 17:56:16.48ID:Q1TcDhg4
誤)コードを書いて批評し合う
正)コードを書いてマウントごっこ
2019/01/03(木) 09:21:05.05ID:e4doPVb1
コードも書かずにマウントごっこするよりはマシかな
2019/01/03(木) 14:18:46.18ID:EIDJLiBS
出力内容に日本語(2バイト文字)が含まれているとテーブル表示の際にカラムがズレる、ってのは回避方法がないのかな。
https://i.imgur.com/qMJ9fag.png
chcp 437 で英語モードに、って小細工も、Win10/srv2016 以降は出来なくなってる。

# 今気づいたが Unicode の時代に「2バイト文字」って表現は正しくないな
2019/01/03(木) 19:10:30.43ID:9E4VKJOH
あきらめてOut-GridViewを使うとか
2019/01/08(火) 18:45:23.42ID:EC3N2/DB
パワーシェルってカテゴリ的にはスクリプト・プログラム言語?それともWindowsのソフトウェア?
2019/01/08(火) 19:49:18.08ID:GRXV3JJ2
どちらも

シェルと言語に同じ名前が付けられてる(後者はPowerShell Scriptと言ったりするけど)
2019/01/08(火) 20:23:14.66ID:twi+nGjw
なるほど
バッチファイルの場合、言語がMS-DOSでソフトウェアの名前がbatって感じかな
2019/01/08(火) 20:34:38.44ID:GRXV3JJ2
全部ずれてる
2019/01/08(火) 20:45:30.53ID:Ri9uFdMr
bashとシェルスクリプト
command.comとバッチスクリプト
コマンドプロンプト(cmd.exe)とバッチスクリプト
powershell.exeとpowershellスクリプト
2019/01/08(火) 21:11:05.43ID:Ri9uFdMr
つかシェルとシェルスクリプト
PowershellとPowershellスクリプト
が一番わかり易かったな
2019/01/08(火) 22:08:03.20ID:twi+nGjw
むずかしい!w
2019/01/09(水) 02:01:23.48ID:9kxsD7dR
別の言い方としてフロントエンドがある
フロントエンドの形態としてシェル、
シェルの機能としてスクリプトの実行という感じ
507デフォルトの名無しさん
垢版 |
2019/01/09(水) 14:51:11.50ID:teNQqIfe
PowerShellができるようになると何がいい?
2019/01/09(水) 17:40:53.83ID:iwuLoYXa
>>507
あなたの職業、PCの使いみち次第なので、そこが明らかじゃないとなんとも言えない。
2019/01/09(水) 19:51:08.47ID:nNa8IYsJ
>>507
職業で使わない前提なら、
Windowsへの追加のインストールなしにそこそこリッチなツールをスクリプト言語で作れることかな
2019/01/09(水) 21:58:57.96ID:LPlKYmug
それな
今どきの企業はセキュリティポリシーがしっかりしていて
PythonだのRubyだの入れたくてもできないからな
2019/01/09(水) 22:13:34.50ID:WxZlp6Z9
>>507
事務職の俺が思うメリット・デメリット。

■PowerShellに限らないプログラミングのメリット
PCを使った繰り返し作業を省力化できる。例えば、
ファイルの名前変更と移動を定型で定期的にやるとか、
同じWebサイトにアクセスして毎回似たようなことをするとか、
お客さんとか他の部署から送られてくる使いづらいExcelのデータを
シンプルな表に整形するとか。

■PowerShellならではのメリット
他の人も書いてるけど、Windowsに最初から入ってる。
スクリプトファイルを渡すだけで同僚にも使ってもらえる。
(起動用のbatファイルとか、タスクスケジューラの設定とかは必要だけど)

■デメリット
全くのプログラミング素人には難しいと思う。
初めてなら、Pythonあたりを先に勉強した方がいいかも。
「パイプラインではオブジェクトが受け渡しされる」とかいわれても
初心者には何のことか分からんと思うし(俺もいまだにしっくり来てない)
適当に解説している入門書とかWebサイトには
「retrun文の後ろの値が、関数の戻り値になります」といった、
嘘じゃないけど嘘に等しいことが書いてあって初心者は訳がわからなくなる。
俺もトライアンドエラーばかりで、きちんと習得できてないです。
2019/01/09(水) 22:16:39.66ID:WxZlp6Z9
間違えた
return文でした・・・
2019/01/09(水) 22:17:35.75ID:nNa8IYsJ
すごいHaskell本を借りて100ページくらい読んだら、PowerShellの関数型風な書き方も割と理解できるようになった
2019/01/09(水) 22:19:11.83ID:nNa8IYsJ
関数型風というか勝手にOut-Defaultがつく挙動がそう見えるだけかもしれないけど
2019/01/10(木) 00:11:38.57ID:jhx89QXs
関数型は、Ruby, jQuery(JavaScript)。
map というメソッドを頻繁に使う

PowerShell(PS)の延長線上に、Rubyがある

バッチファイル → PS
シェルスクリプト → Ruby

バッチファイル・シェルスクリプトは、とにかく、ハマリが多い!
プログラミングに適さない
2019/01/10(木) 00:25:40.33ID:mktY/a5R
dosならまだしもwinで無理やり拡腸されたのはちょっとね・・・
2019/01/10(木) 00:28:19.57ID:FheW454d
>>515
この人は何でいつも同じような論調でどこにでも現れるのだろうか。
やたらruby推しするわりには具体的なrubyの良さが全く伝わってこなくて、むしろマイナスイメージをばら蒔いているような気がする。
2019/01/10(木) 00:33:03.30ID:jxmC/C32
>>516
誤字がひどい
2019/01/10(木) 04:58:55.23ID:Pqz/qBav
>>507
batファイルが書けるよりも何が便利かという視点だと、batがひどいからずっとマシというのがある
batでは初歩的な処理もできなかったり、実現までに手間を要したりする
保守性も悪い
2019/01/10(木) 05:25:45.52ID:nf36oLbM
>>519
それを言うなら、batとvbsやJscriptを組み合わせてようやく出来てたことが、よりPowershellでは少ないコーディングで同等以上の機能を実現できる。て書こうよ
2019/01/10(木) 05:57:47.50ID:Pqz/qBav
>>520
処理をちょっと追加・変更したくなったときにすぐほかの言語の利用や外部コマンド調達が必要になることを含めて、実現までに手間を要する、と言ったんだけどね
vbs等を覚えてそちら主体で書く前提なら、別途そういう視点での比較論を語ってくれ
2019/01/10(木) 06:03:49.10ID:nf36oLbM
MSの意図も、現実の普及や活用もvbsはbatの補間機能だよ、それらの一括後継がPowershell、そんなことを今更説明しなきゃならんとは残念至極
つかvbs覚えずにbatだけでwinの管理ワークなんかできなかったよ
2019/01/10(木) 07:54:48.12ID:e7V8oUZV
パワーシェルとrubyは似てる言語なの?
僕とかパワーシェルマスターベーションなのでruby勉強してみようかな
2019/01/10(木) 12:28:31.19ID:8HdqxYaB
>>517
ruby を NG してる
525デフォルトの名無しさん
垢版 |
2019/01/10(木) 17:29:11.64ID:jhx89QXs
そりゃ、Ruby がベスト。
Vagrant, Chef, Homebrew, Redmine も、Ruby

JavaScript(JS)は、Ruby に似せてくるから、扱いやすい。
Node.js のnpm, yarn も、Ruby のBundler そっくり。
GUI は、HTML, CSS, JS

再帰的なディレクトリのファイル操作も、glob がある

オブジェクト指向・関数型・Duck Typing・Open Class など、あらゆるデザインパターンの宝庫

Ruby から、PowerShell も呼べる。
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ダブルクリックで起動したい時だけ、VBS を使っている

ピラフ大王は、PowerShellで、5ch をスクレイピングするほどだけど、
漏れは、Ruby, Selenium Webdriver でやってる

「たのしいRuby 第5版、2016」でも読めば?
2019/01/10(木) 17:49:28.58ID:3kN+h5hG
インテリセンスしょぼすぎ
2019/01/10(木) 18:07:50.47ID:vGEkHdSz
>>524
俺もそうする
2019/01/10(木) 18:08:40.70ID:ct6DIWcV
>>525
わざわざ蕎麦好きが集まる蕎麦屋に出向いて、「うどんこそが至高の麺類。なぜなら〜」って
講釈垂れるのと同じくらいヤボだ、って気づくべき。周りは迷惑してるんですよ。
2019/01/10(木) 18:11:49.88ID:SOl/xRps
どんどんrubyの評判を下げてるのがわからんのかねぇ
530525
垢版 |
2019/01/10(木) 18:45:39.00ID:jhx89QXs
漏れは、PowerShell で数行書くなら、Ruby で作ってしまう

クリップボードみたいなのは、Rubyから、PowerShellコマンドを呼ぶ。
ダブルクリックで起動したい時は、VBS・bat を使う

Rubyから、Node.js を呼ぶとか、すべての言語を呼び出せるかも
2019/01/10(木) 18:48:24.32ID:ntFiGaUH
なるほどrubyじゃ何もできないってことだね
2019/01/10(木) 19:03:20.25ID:3kN+h5hG
IronRubyってどうなったの?
2019/01/10(木) 20:51:10.85ID:UUY7OixD
(かつて)仕様書が存在しない処理系を複製するなんてやってられなくなったんじゃないか?
2019/01/14(月) 13:22:32.56ID:i1odpryK
powershellのメリットは対話環境とスクリプトが同一の文法て書けること
ISEやVS codeで小さなブロックの挙動を確認しながら、それらを組み合わせて一連のワークフローを構築できる

『トライ&エラーで作ってる』って方がいたけど、まさにそういったやり方が出来ることが、専門職じゃなくて日常業務の効率化に使ってる自分にとって凄く大きな利点
2019/01/14(月) 16:32:26.56ID:mUB6pFvH
>>534
>powershellのメリットは対話環境とスクリプトが同一の文法て書けること

まさに同じ利点なんだけど、TIPS集みたいな感じでテキストファイルに数行のスクリプトをいくつも集めておいて
必要になったらそこからpowershellウインドウにコピペで即実行できるのがいいね
2019/01/14(月) 17:38:40.92ID:i1odpryK
>>535
それもあるね
psreadline有効にしておけば履歴から同じようなことできるし
unix系で当たり前だったことが、やっと出来るようになったともいえるけど
2019/01/15(火) 07:41:15.21ID:PNg+c5Yb
文化の変化には拒絶反応があるもの
過去のシェルでつけられてきた命令等の名前付けルールを見ても、
今のようにIT文化が広がった時のが目の利用者目線でつけられたものではなく、
あくまでOS周りのシステム開発者と利用者が同一だった時代、要は試行段階の
時代につけられが規則で、今の時代に合わなくなっている。
そこに風穴開けたのは大変良いことだろう。

既存の使い方に慣れた人にとっては、新たな流れは「また覚えることが増える」
「使い方が今までと違う」ということへの拒否反応が少なからずある。

やり取りを見ていて思ったのは、すでに旧来Unix系シェルのルールにのっとって
作られてきたものがレガシーに向かっていると思いたくない、気が付かないひとが
多いこと。時代は変化してゆく。
2019/01/16(水) 08:35:02.57ID:8/OmqdoX
v6.1.2 Release of PowerShell Core
https://github.com/PowerShell/PowerShell/releases/tag/v6.1.2
539デフォルトの名無しさん
垢版 |
2019/01/16(水) 18:21:31.35ID:Y6YhZRdL
>>538
あんがとさん
540デフォルトの名無しさん
垢版 |
2019/01/31(木) 21:35:30.95ID:AeQOSKqu
&{
while($true){
(++$i)
sleep -Seconds 1
}
} | Out-GridView

Get-Date

上を実行すると1秒ごとにカウントされた値がウインドウ表示されるけど、
ウインドウを閉じたときにそれ以降のコマンド(Get-Date)が実行されず終了するのどう回避すればいいだろう・・・?
541デフォルトの名無しさん
垢版 |
2019/01/31(木) 21:44:25.79ID:AeQOSKqu
Whileの継続判定を

$stop_form = Start-Job {
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
Start-Sleep -Milliseconds 500
[System.Windows.Forms.MessageBox]::Show("計測停止ボタン")
}

のフォームを使って

while($stop_form.state -eq "running"){...}

のようにもしてみたけれどウインドウ2個表示されるので方法として頭悪い・・・
2019/01/31(木) 22:18:49.56ID:xJsSt9Re
Windows では、よく知らないけど、
Linux では、プロセスに親子関係がある

そして親プロセスが終了すると、子プロセスにも終了メッセージが送られて、
それに何も対処しないと、普通は子プロセスも終了する

つまり、親亀こけたら子亀もこける

シェルから起動したプロセスは、シェルの子プロセスになっている

だからデーモン・サービスのように、親プロセスから切り離すか、
親から終了メッセージが送られても、子が終了しないような工夫をする必要がある

また、パイプラインでは、ジョブという処理単位もあり、
ジョブグループにまとめられて、そのグループ全部に対して作用する
2019/01/31(木) 22:20:50.85ID:wdHuOMr6
>>540
while($true){++$i|out-gridview;sleep -seconds 1;get-date}
2019/01/31(木) 22:33:49.84ID:nQoHUWUF
powershell {
&{
while($true){
(++$i)
sleep -Seconds 1
}
} | Out-GridView
}
Get-Date
2019/01/31(木) 23:10:29.40ID:GI5VQ7Hx
>>542
>デーモン・サービスのように、親プロセスから切り離すか
これ、なんか特別なことをしましたっけ…
546542
垢版 |
2019/01/31(木) 23:44:01.11ID:xJsSt9Re
Windows では知らないけど、

Linux なら、systemd で、サービスを起動できる
547デフォルトの名無しさん
垢版 |
2019/01/31(木) 23:44:18.82ID:AeQOSKqu
>>543
いにしえのブラクラかと・・・

>>544
一応こんな感じで、runspacepoolで実行するようにはしてみたけれど、
現実にはwhileの中で実行する関数とかをASTの構文解析使って渡してやる必要があって、少し手間なんですよね

Out-GridViewによるプロセス中断を制御できればなと思っていました
2019/01/31(木) 23:57:01.76ID:eCrLlhCC
>Windows では知らないけど、
このひとなんなん
こわい
2019/02/01(金) 07:42:04.59ID:92aZjlm0
>>545
>>542はWindowどころかLinuxもよく理解できてないみたいだからスルーするがよろし
親プロセスなんてどうでも良くてたぶん制御端末がクローズされた時にSIGHUPが送られる話と勘違いしてる
2019/02/01(金) 09:45:34.37ID:CxyFcB/M
>>547
パッと思いつきだけで考えたけど、
Start-Job
Workflow
あたりを使うのはどうでしょうね(未確認)。
2019/02/01(金) 10:57:54.88ID:Df7lr2kE
>>547
Out-GridView だけを、あちらで実行するとか。
GridView に表示するオブジェクトは、スレッドセーフでないといけないかも。

$run = [RunspaceFactory]::CreateRunspace()
$run.Open()
$ogv = $run.CreatePipeline()
$ogv.Commands.Add('ogv')
$ogv.InvokeAsync()

$exec = {$i = 0; for (;;) {(++$i); sleep 1}}

try {
 & $exec | % {if ($run.RunspaceAvailability -ne 'Busy') {throw} $null = $ogv.Input.Write($_)}
}
catch {
 Write-Warning 'GridView が閉じました。'
}

Get-Date
2019/02/02(土) 21:37:38.54ID:GDLTgOlM
もうOut-GridView側の処理は別ps1ファイルで別けて
メイン側からStart-Process に -NoNewWindow -PassThru -Wait つけて終了まで待って
終わったらメイン側の処理に戻ればいいんじゃね
ISEじゃ余分に窓出ちゃうけど直起動なら窓増えないし
結果受け取りが必要なら一手間いるけど
2019/02/03(日) 05:19:27.02ID:U6zkwiYj
https://i.imgur.com/Sd6FKGQ.jpg

型指定した変数に$nullを代入できないの?
554デフォルトの名無しさん
垢版 |
2019/02/03(日) 10:45:58.13ID:p2YNM7CO
PS > [bool]""
False
PS > [bool]$s
False

なので$nullではなく空白が代入されてる
代入の時点で型変換されてる?
2019/02/03(日) 11:34:45.18ID:gZVRTEN5
psのnullはnullじゃないってどこかで記事見たな
556デフォルトの名無しさん
垢版 |
2019/02/03(日) 12:12:22.77ID:p2YNM7CO
PS > [string]$s -eq $null
False
PS > $s -eq $null
True
2019/02/03(日) 12:17:47.78ID:sBfvPdNi
型変換が定義されてるっぽいね
2019/02/03(日) 12:58:35.28ID:jpAIKS8U
$nullの型が何なのか調べればわかること
$null.GetType()
You cannot call a method on a null-valued expression.
At line:1 char:1
+ $null.GetType()
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

まとめ
結構嫌な感じですね。
559デフォルトの名無しさん
垢版 |
2019/02/03(日) 13:06:40.62ID:KnacfqZI
>>553
[string]::IsNullOrEmpty($s)

NullならTrueが返るから
if([string]::IsNullOrEmpty($s)){ "ぬるだよ"}
2019/02/03(日) 13:52:06.12ID:fFxNo4TL
>>559
[string]::IsNullOrEmpty("") もtrueになるんだが

String.IsNullOrEmpty(String) Method
https://docs.microsoft.com/ja-jp/dotnet/api/system.string.isnullorempty
>指定された文字列が null または空の文字列 ("") であるかどうかを示します。
2019/02/03(日) 14:28:24.77ID:gZVRTEN5
うーむ・・・

[string]$s = $null
$s -eq [string]$null
$s -eq $null
$s.GetType()
True
False

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object


Remove-Variable s
$s -eq [string]$null
$s -eq $null
$s.GetType()
False
True
null 値の式ではメソッドを呼び出せません。
発生場所 行:5 文字:1
+ $s.GetType()
+ ~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) []、RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
562デフォルトの名無しさん
垢版 |
2019/02/03(日) 14:38:16.60ID:KnacfqZI
>>560
じゃこんな感じで
[string]$s=$null
if($s -eq [string]$null){"ぬるぬるだよ"}
563デフォルトの名無しさん
垢版 |
2019/02/03(日) 14:53:04.55ID:KnacfqZI
可能であれば [string]$s=$null
でなく    [object]$s=$null でよければ
ならば、普通に比較ができるんだけどね
564デフォルトの名無しさん
垢版 |
2019/02/03(日) 14:53:36.20ID:KnacfqZI
何でフォントが変わったんだろ?
2019/02/03(日) 17:18:00.01ID:gLy6KBGU
stringやintはC#と同じくnull許容型ではないということだな

[string]$s = $null
$s
// 代入時にキャストされ空文字列になる

[int]$i = $null
$i
// 代入時にキャストされ0になる

[Nullable[string]]$s = $null
$s
// $nullが代入できる
566デフォルトの名無しさん
垢版 |
2019/02/03(日) 17:37:25.59ID:KnacfqZI
>>565
>stringやintはC#と同じくnull許容型ではないということだな

C#にstringのnull許容型ってないよね。
参照型には?を付けられないよね。
567デフォルトの名無しさん
垢版 |
2019/02/03(日) 17:47:48.25ID:KnacfqZI
>>565
>[Nullable[string]]$s = $null
>$s
>// $nullが代入できる

やってみたら、今度は文字代入するとエラーになるぞよ

Unable to find type [Nullable[string]]. Details: 'System.Nullable`1[T]' 上の Gene
ricArguments[0]、'System.String' が型 'T' の制約に違反しています。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況