PowerShell -Part 4at TECH
PowerShell -Part 4 - 暇つぶし2ch2:デフォルトの名無しさん
20/01/01 18:34:35.19 dhZuPVlL.net
すみません教えてください。テキストファイル内の当日の日付を検索したいんですが
patternに変数を使うにはどうすればいいんでしょうか?↓だと検索がヒットしません
$today = Get-Date -Format "yyyyMMdd"
Select-String -path c:\a.txt -pattern $today

3:デフォルトの名無しさん
20/01/01 20:08:13.94 kGjhqYZD.net
怒らないで教えて欲しいんだが
WSLでよくね?

4:デフォルトの名無しさん
20/01/01 20:34:33.16 o3B0+Nz9.net
>>2
まずは
Select-String -path c:\a.txt -pattern '20200101'
で試したら?

5:デフォルトの名無しさん
20/01/01 20:48:49.03 MALUlSLD.net
$today に適当な文字列を代入して、sls しても出来る!
一応、パス区切りが\ の場合は、クォートした方が間違いない
たぶん、そのファイルが存在しないか、エラーが起きているのかも。
それか、文字コードが異なるとか?
$today = "file"
echo $today
Select-String -path c:\Users\Owner\Documents\a.txt -pattern $today
Select-String -path "C:/Users/Owner/Documents/a.txt" -pattern $today
漏れは、UTF-8 を、WSL で、grep してる

6:2
20/01/01 21:05:16.52 dhZuPVlL.net
ごめんなさい。凄い勘違いをしてた・・・。
今日は1月2日だと思い込んでて、テキストファイル内には20200102という文字列しかなくて
Get-Dateで今日の日付で検索してもヒットしない訳だ・・・。
Select-String -patternには変数が問題なく使えることが確認できました。お騒がせして申し訳ない

7:デフォルトの名無しさん
20/01/01 21:45:29.95 qtzGmu9D.net
>>3
怒らないで教えて欲しいんだが
PowerShellでよくね?

8:デフォルトの名無しさん
20/01/01 23:40:11.34 MALUlSLD.net
WSL なら、これでフォルダ内のすべてのファイルから検索できる。
grep -i '文字列' ./*
Windows 側のフォルダに、alias も貼っているから、カレントフォルダの移動も簡単
shopt -s expand_aliases
alias windoc='cd /mnt/c/Users/Owner/Documents'

9:デフォルトの名無しさん
20/01/02 00:33:51.58 Qw2T8cPg.net
コーディングとは直接関係ないのですが、
WMF をわざわざインストールせず、WindowsUpdate のみ適用し続けた Windows7 の場合、
Windows PowerShell のバージョンって 2.0 のままでしょうか?
試せる環境が手元に無くて…。ググっても分かりませんでした。
よろしくお願いします。

10:デフォルトの名無しさん
20/01/02 05:37:52.46 rdmxrK4p.net
【 Select-String 】コマンドレット―ファイルからテキスト(文字列)を検索する
URLリンク(www.atmarkit.co.jp)
grepコマンドとPowerShellのsls (Select-String)の比較
URLリンク(tech.sanwasystem.com)

11:デフォルトの名無しさん
20/01/02 09:32:26.45 m85p0XAo.net
>>5
>>8
やっぱりbashの方が優秀なんだな、、
Powershellてアホやろ

12:デフォルトの名無しさん
20/01/02 11:13:06.84 qQsPuinH.net
>>11
>>6

13:デフォルトの名無しさん
20/01/02 14:16:49.21 jegIeSSN.net
>>11
あほ

14:デフォルトの名無しさん
20/01/02 14:34:14.71 osenxolW.net
つまりbashを使ってるとあほになる
やっぱりPowerShellの方が優秀なんだな、、

15:デフォルトの名無しさん
20/01/02 14:58:28.80 80VOHiHM.net
poewrshellはcmd内蔵にはあったバイナリのコピーが簡単にできなかったり色々半端だよね

16:デフォルトの名無しさん
20/01/02 16:08:26.45 7QP/YGP+.net
>>15
poewrshellはそうだろね

17:デフォルトの名無しさん
20/01/02 16:49:39.53 Yqaismel.net
>>15
Copy-Itemじゃ駄目なの?

18:デフォルトの名無しさん
20/01/02 17:02:09.06 SnzEOw/h.net
Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね
革新性面白さに主眼が置かれて運用をきっちりこなす為の地味な部分は蔑ろにされた

19:デフォルトの名無しさん
20/01/02 17:04:14.31 SnzEOw/h.net
×cmdに置き換わっていた
○cmdを置き換えていた

20:デフォルトの名無しさん
20/01/02 17:05:15.20 7QP/YGP+.net
>>18
具体的には?

21:デフォルトの名無しさん
20/01/02 17:37:05.84 PYyaD2Jg.net
PSでrobocopy使えば良いじゃん
これで置換出来るね

22:デフォルトの名無しさん
20/01/02 18:19:47.57 d4KLeRXS.net
魚を下ろすなら出刃包丁、鉛筆を削るならカッターナイフ。一つだけに限定する必要はない。
スクリプティング環境も同じ。WSL でも PowerShell でも、適材適所で選べばいいだけだろ。
俺の場合は WSL ではなく Cygwin と PowerShel を併用してるけど。

23:デフォルトの名無しさん
20/01/02 18:26:02.49 diWefbzT.net
>>22
パワー汁

24:デフォルトの名無しさん
20/01/02 19:34:13.71 LqVuN/CI.net
>>18
robocopyレベルの機能が欲しいなら欲しい機能をPowerShellで実装すればいいだけだろ
出来合いのものが欲しい人が見るスレじゃないよ?

25:デフォルトの名無しさん
20/01/02 21:14:01.25 RdZD9Uhx.net
>>18
URLリンク(www.powershellgallery.com)
URLリンク(www.powershellgallery.com)
URLリンク(www.powershellgallery.com)
好きなのを使えや

26:デフォルトの名無しさん
20/01/02 21:32:35.62 ShHqIFTQ.net
漏れは、スクリプトを下のように、Ruby で書く
powershell は、そのスクリプト内で、コマンドを呼び出す程度にしか使わない。
長いコードでは圧倒的に、Rubyの方が可読性が高い
# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換
ary = str.each_line.map( &:strip ) # 連続する空白類を除去する
IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end

27:デフォルトの名無しさん
20/01/02 21:59:33.06 SnzEOw/h.net
>>24
>>25
こういう暇人達のオモチャだから置き換わらないんだよ

28:デフォルトの名無しさん
20/01/02 23:12:10.06 Luby4/oL.net
>>26
あっ、Rubyはいいです(^^ゞ
もう終わった言語なんで
PythonかJavaScriptでお願いします

29:デフォルトの名無しさん
20/01/03 08:42:58.49 Tlg/GH8q.net
>>27
お前の理屈だとPerlのCPANやPythonのPyPIも「暇人達のオモチャ」だなww

30:デフォルトの名無しさん
20/01/03 09:33:21.20 3Uhjf7eS.net
PowershellはWPFと同様に
こんなことできちゃう俺ってすごい?
って承認要求を満たす為のツール

31:デフォルトの名無しさん
20/01/03 10:07:45.44 fRk42gOq.net
こんな低い程度で承認欲求満たせるなんて
さぞかし安っぽく薄っぺらな人生を歩んで来たんだろうね
君のような知恵遅れクンが羨ましい限りだよ

32:デフォルトの名無しさん
20/01/03 13:07:55.88 3Uhjf7eS.net
>>31
涙ふけよw

33:デフォルトの名無しさん
20/01/03 14:14:41.25 wJkHBgCK.net
>>18
>Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね
見当違いだよ
あんたがrobocopy相当でないことに不満を持っているのは分かったが、世の中が同じ不満を持っていると勝手に決めつけてもしょうがない
自己と他者の境界を混同する癖があると生き辛さの原因になるぞ
Powershellもcmdもシェルなんだから、どっちからでもrobocopyを呼べばいい
変な固執がなければそれで解決
そもそもPowershellが完璧に作り込まれていたとしてもcmdは置き換わってない
長年のデファクトスタンダードとして居座ったシェルスクリプトを書き直す人はほとんどいないし、そこで覚えた知識を必要に迫られてもいないのにアップデートする人もいない
Powershellへの移行は強制されない限り極めて緩慢にしか進まないんだ

34:デフォルトの名無しさん
20/01/03 14:18:05.13 E2rkGUYG.net
>>30
いや普通にぱぱっと学んで普通に道具として使うだろ
どんだけ頭わるいのかコンプレックス丸出し

35:デフォルトの名無しさん
20/01/03 14:34:10.57 /oC1Ys4Z.net
PowerShell使いよりUNIXシェル使いのほうが凄い
同じコマンドなのに仕様が全然違うのを我慢できるんだぜww

36:デフォルトの名無しさん
20/01/03 14:51:58.50 E2rkGUYG.net
ごめんな
シェルを使うのに凄いとか凄くないとかちょっと俺には理解できない
チンパンジーが箸を使うとすごいとかそういうレベルの話なのかな

37:デフォルトの名無しさん
20/01/03 18:53:03.63 IPdxVfSe.net
>>33
そもそもcmd(MS-dos)もPowerShellも今日日いらんがな
WSL入れとけって

38:デフォルトの名無しさん
20/01/03 21:26:42.13 LoHkYQxe.net
WSLは手間が掛かりすぎてNG
・「入れとけ」というが、ユーザー毎にいちいち手動で入れさせる手間が掛かる。しかも厄介なストア配布形態
・一番使いたいはずのログインスクリプト等に使えない
全く話にならない

39:デフォルトの名無しさん
20/01/03 22:06:06.23 ZgWtqjsT.net
過去の遺産があるならWSLでもいいけど、どちらでも使えて新規で組むならPowerShellだな

40:デフォルトの名無しさん
20/01/04 01:33:39.67 r5thPytl.net
>>35
UNIXって瀕死だろ

41:デフォルトの名無しさん
20/01/04 02:12:51.07 aSKFbY9r.net
>>40
bashかパワーシェル(爆笑)で比較しませんか、ドザさんwww

42:デフォルトの名無しさん
20/01/04 02:52:56.44 eFXyJY/2.net
今日日こんなのでマウント取ろうとする化石がいるとは
もう令和だぞおっさん

43:デフォルトの名無しさん
20/01/04 08:03:14.83 T5YxFwCT.net
えっ、この幼稚さはガキなんじゃねーの?おっさんだとしたらヤバいな

44:デフォルトの名無しさん
20/01/04 09:02:43.07 H9Ya7buR.net
今時のガキでbash推しとかありえへんやろw

45:デフォルトの名無しさん
20/01/04 10:38:35.92 uBZCVRc/.net
>>44
あなたノンプログラマの人?w

46:デフォルトの名無しさん
20/01/04 11:23:41.53 LH34clIM.net
何を言ってるんだろう、この人

47:デフォルトの名無しさん
20/01/04 14:44:48.90 fYLLjFYo.net
前提条件(要件)の提示もなく優劣を論じちゃうのって、典型的な「自称パワーユーザ」だな

48:デフォルトの名無しさん
20/01/04 14:50:50.91 6l4U8fFo.net
bashの初見殺しっぷりがハンパない件
URLリンク(qiita.com)

49:デフォルトの名無しさん
20/01/04 15:49:43.41 RXEH0V5g.net
>>48
おバカ自慢は要りません

50:デフォルトの名無しさん
20/01/04 21:04:10.88 4JCx1BTQ.net
いろいろな *[!c]sh 実装のキライなところ
URLリンク(fumiyas.github.io)
まだBashで消耗してるの?
URLリンク(www.slideshare.net)

51:デフォルトの名無しさん
20/01/05 08:09:38.59 +ZtpY4Sw.net
>>50
おバカ自慢要らない

52:デフォルトの名無しさん
20/01/05 08:35:56.46 8wcedpaS.net
その「おバカ」とやらに使ってもらおうって気がないから
いつまでたってもLinuxデスクトップは普及しないんだよ

53:デフォルトの名無しさん
20/01/05 09:21:09.84 +ZtpY4Sw.net
Linuxデスクトップ「おバカには使ってほしくありません」

54:デフォルトの名無しさん
20/01/05 14:43:55.52 ZEXd5sZ7.net
それはシェアをあきらめるって事だと分かってて言うならそれでもいいんだけどね

55:デフォルトの名無しさん
20/01/05 18:40:06.22 B53H42aR.net
スレチ続けてんじゃねえぞ、糞ども

56:デフォルトの名無しさん
20/01/06 21:20:05.02 ID1ddVMh.net
>>48
存分に威張って良いほどの馬鹿

57:デフォルトの名無しさん
20/01/06 21:40:32.90 ID1ddVMh.net
>>50
> いろいろな *[!c]sh 実装のキライなところ
UNIX系シェルは古くからあるから色々意見があっていいけど、嫌いなとこ言うだけってのは馬鹿。
> まだBashで消耗してるの?
読んだけど2年前のスライド&スライド発表者が馬鹿過ぎる。
現在のTwitterアカウントを見たけど「進歩がない…」の一言。
makeのアルゴリズムを紹介するよ!的なことやってて…大丈夫かこいつ…いやはやく(周りが)何とかしないと駄目だろ…。
ていうか >>48 の記事の筆者か…。
生きてて楽しいのかこいつ…。

58:デフォルトの名無しさん
20/01/07 08:15:41.91 5fudPZU/.net
>>57
> 読んだけど2年前のスライド&スライド発表者が馬鹿過ぎる。
> 現在のTwitterアカウントを見たけど「進歩がない…」の一言。
スレチな話題を延々と繰り返すバカよりは256倍マシだと思うよ

59:デフォルトの名無しさん
20/01/07 08:38:58.32 Ks+JfxYO.net
>>57
> 嫌いなとこ言うだけってのは馬鹿
> 生きてて楽しいのかこいつ…
ここでPowerShell叩きだけやってるやつそのものじゃん

60:デフォルトの名無しさん
20/01/10 01:58:55.42 orNiqaoM.net
ところでWSLを入れて
Windows10の制御はどういう風にやるんだろ?

61:デフォルトの名無しさん
20/01/10 02:00:24.71 orNiqaoM.net
そもそもUNIXからの流れって
スクリプトがないと何もできなかった
というだけだよね。

62:デフォルトの名無しさん
20/01/10 09:21:51.82 cqQYZnld.net
dosはスクリプトなしで運用できたん?

63:デフォルトの名無しさん
20/01/10 12:28:21.35 vcBIqSBB.net
>>62
たいして設定項目ないからcomfig.sysとかを直接編集してただろ
ちなみに同時期のunixも似たようなもんだった
スクリプトで設定するようになったのはだいぶ後だったように思う

64:デフォルトの名無しさん
20/01/10 14:42:27.33 IxDycp4w.net
>>63
> だいぶ後だったように思う
80年代からマイコンを使ってた世代からすれば、確かに「だいぶ後」ですねw

65:デフォルトの名無しさん
20/01/10 18:17:26.14 PkgwRlbI.net
Windows10, WSL, Ubuntu(Linux)側から、
Wondows側のC ドライブへのアクセスは、
/mnt/c/Users/ユーザー名/Documents/~
漏れは、いつも、WSL側から、Windows側をgrep してる。
なぜなら、Windowsでは、CP932 と、BOM 無しUTF-8 を区別できないから
BOMが付いていれば区別できるけど、
普通、ウェブ系開発ではバグるので、BOMを付けない

66:デフォルトの名無しさん
20/01/10 18:58:35.89 gMOJaPF1.net
>>65
死ねクズ

67:デフォルトの名無しさん
20/01/12 03:08:17.75 gh55rPFY.net
Lnuxユーザは大変やね
Winodowsユーザは、そんな面倒なことはしないわな
それなりのツールつかうから

68:デフォルトの名無しさん
20/01/12 03:10:21.78 gh55rPFY.net
要はLinuxなどの場合は、近頃はいいだろうが
そういうことのためのツールが用意されていないんで
スクリプトに頼るしかなかったということなんだろうな

69:デフォルトの名無しさん
20/01/12 04:03:14.54 Wu3j+6b0.net


70:デフォルトの名無しさん
20/01/12 04:22:58 Uj5X0q1W.net
設定ファイルがスクリプトということに何も疑問を持たなかったんだろかと思うことはある。

71:デフォルトの名無しさん
20/01/12 05:11:45 Hfpc94Xd.net
知らんがな
linux板でやれよ

Linux
URLリンク(mao.5ch.net)

72:デフォルトの名無しさん
20/01/12 09:20:24.49 Uj5X0q1W.net
Linux板は荒らししかいないし、末期のウェブ板やPHP板みたいになってる。
まともな住人はここに移住してきても良いよね?
ウェブ板やPHP板も移住してるんだし。

73:デフォルトの名無しさん
20/01/12 09:21:14.45 Uj5X0q1W.net
Linux板は志賀何とかさんのことを語る板になってしまった。

74:デフォルトの名無しさん
20/01/12 10:59:33.84 FbSdnFnB.net
まさかとは思うがツールというのはGUIのことだろうか
PowerShellスレでCUIよりもGUIが無条件に優れているという話をしているのだろうか
スレチを自己正当化する理由が、然るべきスレが機能不全を起こしてるから行きたくないと?
しつこいスレチがここに機能不全を招くとは思わないのだろうか
前スレに続いての「WSLでよくね」なんて明らかに反応を楽しむ愉快犯なのに、まんまとLinuxのほうが残念だもん!って
いいかげん落ち着いてくれよ

75:デフォルトの名無しさん
20/01/12 18:25:07.68 6gxIPrAU.net
>>72
お前はスレタイを100回読み直せ

76:デフォルトの名無しさん
20/01/12 19:02:16.18 Uj5X0q1W.net
bash最高って書いてあるけど。

77:デフォルトの名無しさん
20/01/12 21:27:38.66 gh55rPFY.net
>>74
>まさかとは思うがツールというのはGUIのことだろうか
なわけないよ。
要は今は良くなってきているが
シェル言語なないと処理できないようなのがUnix系の世界
だったということ
ほかにろくなものないから

78:デフォルトの名無しさん
20/01/12 22:41:27.46 gh55rPFY.net
ま、そりゃいいか。
PowerShellを語る板だから
ごめん。
PowerShellの話に戻します。

79:デフォルトの名無しさん
20/01/13 13:13:43.40 GhUCXbF0.net
意味不明。結局、CUIでない、GUIでもない"ツール"とはいったい何だったのか

80:デフォルトの名無しさん
20/01/16 08:46:49.48 wD5IBL5x.net
テキストユーザインタフェース
URLリンク(ja.wikipedia.org)

81:デフォルトの名無しさん
20/01/28 00:59:10 b7mfcqCA.net
刻々と変化する変数をフォームに表示させたいんだけど
当然この例だと実行した時点での変数しか表示されません。
フォームのラベルの変数を動的に表示し続ける方法を教えてください(この例だと時計のように動かしたい)

$time = Get-Date
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$label = New-Object System.Windows.Forms.Label
$label.Text = $time
$form.Controls.Add($label)
$form.ShowDialog()

82:デフォルトの名無しさん
20/01/28 02:09:43 Vj4Y99PX.net
タイマーイベントとかあるじゃろ
C#タイマーあたりでぐぐれ

83:デフォルトの名無しさん
20/01/28 05:27:11.17 gua2EZr0.net
正確な時間じゃなくても良いなら、Ruby なら、sleep で簡単にできる。
ただし、OS がバッファリングしてると、最後にまとめて出力されてしまう!
STDOUT.sync = true # バッファリングしない
3.times do
puts Time.now
sleep 3
end

84:デフォルトの名無しさん
20/01/28 08:59:06 CfcUNbbY.net
フォーム要素はどこに行った

85:デフォルトの名無しさん
20/01/28 19:45:19 xyAuIeAM.net
>>81
別スレッドで非同期にフォームを起動すればいい

using namespace System.Windows.Forms
using assembly System.Windows.Forms

$label = [Label]@{ Dock = "Fill"; Font = "Meiryo,20" }
$form = [Form]@{ Size = "350,100" }
$form.Controls.Add($label)

$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.Open()
$pipeline = $runspace.CreatePipeline()
$pipeline.Commands.AddScript({ param ($form) $form.ShowDialog() })
$pipeline.Commands[0].Parameters.Add("form", $form)
$pipeline.InvokeAsync()

foreach ($p in 1..10) {
  if ($Runspace.RunspaceAvailability -ne "Busy") { break }
  $time = [datetime]::Now
  $label.Text = $time
  sleep 1
}

if ($Runspace.RunspaceAvailability -eq "Busy") { $form.Close() }
$runspace.Dispose()

86:デフォルトの名無しさん
20/01/30 19:49:29 dJd/g4Kb.net
>>85
すげー一気に解決したわ
Runspaceとか知らんよありがと

87:デフォルトの名無しさん
20/02/01 09:36:54.77 tNoLSDZ1.net
v6.2.4
URLリンク(github.com)

88:デフォルトの名無しさん
20/02/01 10:30:55.09 escHc8OK.net
PowerShel で凝ったことやろうとすると、どうしても C# の知識が必要になるよな。
おかげで、C# を勉強する良いきっかけになったわ。スキルの幅が広がるのは嬉しい。

89:デフォルトの名無しさん
20/02/01 11:42:52 S54SgdVf.net
C#スキル?
.net frameworkの知識じゃなくて?

90:デフォルトの名無しさん
20/02/01 21:57:28 KsqMKxaU.net
C#全く使えん奴は凝ったことすら思いつかないのでは

91:デフォルトの名無しさん
20/02/01 22:22:36.87 QN2fVxGF.net
$label = [Label]@{ Dock = "Fill"; Font = "Meiryo,20" }
という式を初めて見て驚いてるんだけど、これについてのドキュメントってどこかにありますか?

92:デフォルトの名無しさん
20/02/01 23:27:18 1A0Wf54C.net
>>91
PowerShell 3からの機能
クラスが引数を取らないコンストラクタを持っていて、プロパティがパブリックでset可能なら使える

URLリンク(docs.microsoft.com)

93:デフォルトの名無しさん
20/02/02 11:46:03 9GpNdTap.net
>>92
ありがとう
だいぶ楽になった

こういうの知ってる人ってMSDNのヘルプに全部目を通してるの?

94:デフォルトの名無しさん
20/02/04 17:22:37 Rq+qX9o+.net
オブジェクト志向ライクでいいんだけど、
powershellへbatやVBSから置き換えようとすると機能によってはバージョンチェックをしないといけないのがもどかしい
.NETにしろそうなんだけどね

95:デフォルトの名無しさん
20/02/04 20:42:27.29 uL6VAIkG.net
ご教示ください。
商品の価格を定期的にWebサイトから取得したいのですが、Invoke-WebRequestで取得したHtmlWebResponseObjectから要素の内の文字列を取り出そうとすると「Windows セキュリティの警告」のポップアップが表示されてしまいます。
ポップアップを出さずに要素の内の文字列を取得するにはどうすればよいでしょうか?
$response = Invoke-WebRequest -uri "URLリンク(www.yodobashi.com)
$price = $response.ParsedHtml.getElementById("js_scl_unitPrice").innerText
これを実行すると「この Web サイトから個人用の情報を提供できるように、Cookie と呼ばれる小さなファイルをこのコンピューターに配置できるようにしますか?」と表示されます。

96:デフォルトの名無しさん
20/02/04 21:00:56.36 sy7Lzsaq.net
なんでPSで?・・・

97:デフォルトの名無しさん
20/02/04 22:40:04.72 tW1M7Be/.net
cookie powershellでぐぐればやり方は出てくる
javascriptとか出てきたら素直にseleniumを使う
seleniumをpowershellで使う方法もある

98:デフォルトの名無しさん
20/02/07 03:46:32 eL08TT0Y.net
DateTimePickerで翌日の日付をデフォルト選択する方法ありませんか?

99:デフォルトの名無しさん
20/02/07 06:17:27 Ec63bSXx.net
[DateTimePicker]@{ Value = [datetime]::Now.AddDays(1) }

100:デフォルトの名無しさん
20/02/07 17:42:43 eL08TT0Y.net
>>99
できましたサンクス!

101:デフォルトの名無しさん
20/02/09 17:36:01 7dfvQcUC.net
同スクリプト重複実行抑止する場合
皆さんどうしてますか?
pid書き出し?Mutex?

102:デフォルトの名無しさん
20/02/09 19:33:00 9UBXd1bi.net
mutex

103:デフォルトの名無しさん
20/02/10 12:17:46.17 f4vRyC3Z.net
コールバック関数ってpowershellで可能ですか?

104:デフォルトの名無しさん
20/02/10 12:24:25 8uBZGbTk.net
可能ですよ

105:デフォルトの名無しさん
20/02/10 14:42:20.49 OVbm/XKG.net
どうやるのですか?

106:デフォルトの名無しさん
20/02/10 15:13:30.85 8uBZGbTk.net
スクリプトブロックを渡すか、関数なら
$function:関数名
で渡す
実行は & でやるのが基本で他にもいろいろ方法がある

107:デフォルトの名無しさん
20/02/10 18:46:32.72 D64OFTKi.net
スクリプトからフォームをshowメソッドで表示すると固まってしまい、
showDialogメソッドで表示すると操作できるようになります。
例えばモーダルフォームを表示した親フォームが固まるのは分かるのですが、
呼び出したモードレスフォームが固まってしまうのは何故なのでしょうか。

108:デフォルトの名無しさん
20/02/10 21:56:58.62 RZngPC6l.net
103です。
実はコールバック関数が何かもよく理解してませんが、
以下URL先の
$sslStream = New-Object System.Net.Security.SslStream($stream,$false,({$True} -as [Net.Security.RemoteCertificateValidationCallback]))
の第三引数がコールバック関数でしょうか?
このやり方を理解したくて。
URLリンク(stackoverflow.com)

109:デフォルトの名無しさん
20/02/11 13:53:02.82 iYccZVyV.net
コールバックはこの説明が分かりやすい
URLリンク(wa3.i-3-i.info)
Powershellだと「スクリプトブロック」というコードを { } で括った物がコールバック関数として使える
引数として直接書いてもいいし、一度変数に代入して変数を引数に渡してもいい
{$True} という部分がそれ
でも今回は「スクリプトブロック」じゃなくて「RemoteCertificateValidationCallback」でと指定されている
三つ目のコンストラクタの引数の型に注目
URLリンク(docs.microsoft.com)
なので -as 演算子で型変換をしてる

110:デフォルトの名無しさん
20/02/11 14:24:03.53 AAFADizG.net
とりあえず、引数がご飯で戻り値がウンコと言う事だけはわかった。

111:デフォルトの名無しさん
20/02/11 15:25:48 LmagV5MS.net
>>107
win32APIでウィンドウ作ったりしたことなかったら分からないかもしれないけどざっくり言うと
ウィンドウがOSからのメッセージ(マウスがクリックされたとか、ボタンが押されたとか)
を処理するにはOSからのメッセージをウィンドウに知らせてやる必要がある(メッセージループ)
ShowDialogはその辺をよしなにやってくれる

112:デフォルトの名無しさん
20/02/15 04:04:02.58 Nij30Obe.net
>>111
ありがとうございます。
モーダルがどうのこうのというよりも、
Showコマンドだとクリックなどの命令を受け付けないという感じでしょうか

113:デフォルトの名無しさん
20/02/15 08:45:46.45 Ba23wrvp.net
>>109
103です。ありがとうございます。なんとなくわかったような気がしますが、自分には.netクラスライブラリのリファレンスマニュアル読めるほどのオブジェクト指向プログラムの知識が足りてないようです。
powershellでちょっと小難しい事しようと思うといつもこの壁にぶち当たります。

114:デフォルトの名無しさん
20/02/15 09:54:27 /QpUFa9s.net
>>112
デバッガで実行ステップを追う感覚で捉えると分かりやすいよ
Powershellのようなコンソールアプリって基本シングルスレッドで、上から下に処理が流れて最後まで行ったら終わりでしょ
Showメソッドは表示するだけ
ShowDialogと違って閉じるのを待たずに呼び出し元に処理を戻すから、メインスレッドはすぐに続きのスクリプト処理を再開してしまう
ウィンドウっていつでもユーザーのマウス操作に反応できて、閉じられるまでは処理が終わらないよね
それは無限ループを回し続けて、マウス操作のような指令が来るまでキューを調べて待つ体制に入ってるから
その仕事を直接的にも間接的にもやってないならウインドウはだんまりになって当然
結論、コンソールアプリから最初に呼び出すウィンドウはモーダル表示にすべし

115:デフォルトの名無しさん
20/02/16 00:31:35 EHy9IoT2.net
>>114
ありがとうございます
スッキリしました

よくC#でShowDialogで表示した時はDisposeを呼ばないとダメと言いますが、
これもイベントループを作るのか作らないかの差なのでしょうか
また、PowerShellでもDisposeした方がいいのでしょうか

116:デフォルトの名無しさん
20/03/05 08:17:58 Lxf+ynQs.net
Announcing PowerShell 7.0
URLリンク(devblogs.microsoft.com)

Today, we’re happy to announce the Generally Available (GA) release of PowerShell 7.0!

117:デフォルトの名無しさん
20/03/06 04:35:17.20 fNVi1eTS.net
インストーラで出てくるスパイダーマンのパチモンみたいなの何なの

118:デフォルトの名無しさん
20/03/06 05:16:26.33 hxBXwa2S.net
Overwatchのソンブラにそっくりだけどパクったのか?

119:デフォルトの名無しさん
20/03/06 09:18:25 jyEHwxlL.net
URLリンク(blog.shibata.tech)

このキャラクターはあまり認知度は高くないと思いますがPowerShell公式のキャラクターです。

名前はそのまま PowerShell の様です。(よくある言語の擬人化なのでしょう)
中の人からはPowerShell HeroやPosh-Chan*2と呼ばれている様です。

いまではPowerShell TeamのTwitterアイコンにも採用されています。

120:デフォルトの名無しさん
20/03/06 11:37:23.38 B7JE7mx4.net
>>116
キタ━━(゚∀゚)━━!!

121:デフォルトの名無しさん
20/03/06 16:45:05 EUcOgnT/.net
PowerShellの本増えないかなー
日本でももう少し流行ってほしい

122:デフォルトの名無しさん
20/03/06 17:17:48.60 mKExt1TS.net
>>121
Windows が関係するインフラ系の管理ではデファクトだと思ってたけど違うんかい?
自分はインフラ系の仕事が多いんだけど、MS 製品は言うに及ばず、
VMware、AWS、HPE の設定とか構築で使うためのモジュールが用意されてるんで、
そっち系の人は全員使ってるのかと思ってた。
今関わってる案件だと客先で用意された作業用 PC でも PowerCLI は
入れさせてもらえるんで、VMware の構築&設定が超絶はかどってすごく助かってる。

123:デフォルトの名無しさん
20/03/06 19:23:36.96 EUcOgnT/.net
>>122
IT系ですらない製造業の人間なので、インフラとかよく知らんです
CSVファイルとか扱う定型業務でVBAの代わりに流行らないかなーと思ってる
会社PCに標準で入ってるのが何よりありがたい
たまたまC#の経験あるからPowerShellが使いやすく感じるだけなのかもしれんけど
VBAは古すぎるし、文化が違いすぎて好きになれない…

124:デフォルトの名無しさん
20/03/06 22:15:50 mKExt1TS.net
>>123
確かに、RPA 的な用途にも使えるわね。

そう言われてみれば、IT プロ向けの PowerShell の資料は山ほどあるけど、
エンドユーザの業務効率化に的を絞った資料ってあまり聞かないね。

エンドユーザが手作業でやってる定型業務を PowerShell +αで
自動化/半自動化する事例を紹介する資料を作れば需要ありそう。

125:デフォルトの名無しさん
20/03/07 20:55:12.96 yZMlhieX.net
Windows以外でもGridViewが使える
A new kind of GridView right in your console: Introducing the early preview of ConsoleGuiTools
URLリンク(devblogs.microsoft.com)

126:デフォルトの名無しさん
20/03/09 17:26:48.99 BZZ4ItAR.net
パワーシェルでテキストファイルを一行ずつ読み取って環境変数化するのはどうやるんでしょうか?
バッチファイルだと簡単にできるのにパワーシェルだと難しい
イメージ的にはこんなことをパワーシェルでやりたいです
for /f %%a “usebackq” in (./testfile.txt) do (
set testenv=%%a
echo !testenv!
)

127:デフォルトの名無しさん
20/03/10 14:15:31 qUF7p1Fi.net
こーゆー感じのことやりたいのか?

cat .\testfile.txt | %{ $env:testenv = $_; $env:testenv }

128:デフォルトの名無しさん
20/03/10 14:32:38.22 j2kTK4tI.net
>>126
Get-Content -Path .\TextFile.txt | ForEach-Object -Process { $env:TestVar = $_ }
もしくは
$ContentData = Get-Content -Path .\TextFile.txt
foreach ($LineData in $ContentData) {
$env:TestVar = $LineData
}
こんな感じじゃないかな
知らんけど
グローバルな環境変数への代入はどうするのかな?

129:デフォルトの名無しさん
20/03/11 20:45:46.50 lIDu6EwW.net
>>128
上の方の感じでできました!ありがとうございます
グローバルな環境変数とはなんですか?

130:デフォルトの名無しさん
20/03/11 20:47:48.33 lIDu6EwW.net
あ、システム環境変数のことですか
シェルスクリプト内の一時環境変数?で良いのです

131:デフォルトの名無しさん
20/03/13 14:02:44 MwEg+WGB.net
javawみたいな感じで、スクリプト実行時にコマンドプロンプトを出さない方法はありませんか?1ファイルで。
ショートカットやvbs等の2ファイル使う方法なら解ってます。

132:デフォルトの名無しさん
20/03/13 15:02:17.45 VpgJT114.net
まだ開発中
WIP: Add pwshw for console-less PowerShell on Windows
URLリンク(github.com)

133:デフォルトの名無しさん
20/03/13 15:27:21 e1b5/B0w.net
↑そのpwshwが取り込まれるまでは、↓を自前でビルドして自作pwshwなり、powershellwなりを作ることもできるよ
URLリンク(github.com)
ビルドしてできたhiddenw.exeをリネームして使うだけ

134:デフォルトの名無しさん
20/03/13 19:15:38.63 cafRoH7X.net
>>131
1,まず、.ps1 で動作するスクリプトを作る
2,1を BASE64 でエンコード
3,powershell.exe にオプション -EncodedCommand と 2をつないで実行
4,3を .cmd (.bat) に書く
詳細は「powershell EncodedCommand」みたいな感じでググればいいでしょう。

135:1134
20/03/13 19:18:46.13 cafRoH7X.net
>>131
すまん、コマンドプロンプトを出さずに、か。勘違いしてました。
>>134 は取り下げます。

136:デフォルトの名無しさん
20/03/14 10:34:16 3Jd+nG/t.net
exe化するやつにそんなオプションがあったと思う

137:デフォルトの名無しさん
20/03/15 16:23:53 ake3THHi.net
Windows PowerShell in Action、900ページあるけど面白かった
次はPowerShell fo Sysadmins読もうかな

138:デフォルトの名無しさん
20/03/15 23:09:18.13 b9Qsc7j/.net
python.exe / pythonw.exe や ruby.exe / rubyw.exe の違いでよく悩むのでまとめておく
URLリンク(blog.shibayan.jp)

139:デフォルトの名無しさん
20/03/16 21:24:16.40 vD0R4SAm.net
>>133
さいこー。ありがとう

140:デフォルトの名無しさん
20/03/20 21:08:31 hI9v4wSz.net
win10 バージョン5.1
Invoke-RestMethodの"-body"にjsonを入れる方法を教えてほしい
google photos apiで日付を指定して一覧を取得したい
ubuntu + curlで
curl -s -X POST -H "Authorization: Bearer " -H "Content-type: application/json"
-d '{"filters":{"dateFilter": {"dates":[{"year":2019,"month":11,"day":15}]}}}'
URLリンク(photoslibrary.googleapis.com)
これだと取得出来るんだけど

powershellで
$header = @{"Authorization" = "Bearer "};
$body = '{"filters":{"dateFilter": {"dates":[{"year":2019,"month":11,"day":15}]}}}';
Invoke-RestMethod -Uri URLリンク(photoslibrary.googleapis.com)
-Method Post -Headers $header -Body $body ;

(400) 要求が不適切ですでエラーになる
たぶんbodyの入れ方が悪いだと思うんだけど

アルバムIDの絞り込みだったら
$body=@{
"albumId"="id"
}
で取得出来た

141:デフォルトの名無しさん
20/03/20 23:34:49 fNo2jQuJ.net
-ContentType "application/json" を付けるか
もしくは全部ヘッダに入れる

$accessToken = "your access token"
$uri = "URLリンク(photoslibrary.googleapis.com)

$response = Invoke-RestMethod $uri -Method Post -Headers @{
  Authorization = "Bearer $accessToken"
  Filters = @{
    DateFilter = @{
      Dates = @{ Year = 2016; Month = 3; Day = 1 }
    }
  }
}

142:デフォルトの名無しさん
20/03/21 00:10:00.03 AKmTgF3+.net
ごめんやっぱBodyに入れないといけない
$body = @{
  filters = @{
    dateFilter = @{
      dates = @(@{ year = 2019; month = 11; day = 15 })
    }
  }
} | ConvertTo-Json -Depth 100
$param = @{
  Uri = $uri
  Method = "Post"
  Headers = @{ Authorization = "Bearer $accessToken" }
  Body = $body
  ContentType = "application/json"
}
$response = Invoke-RestMethod @param

143:デフォルトの名無しさん
20/03/21 00:24:48 WepcD5N+.net
>>141
>>142
なるほど、curlの"Content-type: application/json"の部分を指定してやらんといかんかったのか。
そしてちょっとあきらめてた連想配列も提示してもらっちゃって
超ありがとうございました。
ばっちり動いたっす

144:デフォルトの名無しさん
20/03/21 09:18:44 AEZYARkU.net
PowerShell 7.0 の新機能
URLリンク(docs.microsoft.com)

145:デフォルトの名無しさん
20/03/21 09:34:19 Nklv0DXu.net
VSCode の拡張機能、REST Client が簡単!

POST URLリンク(localhost:8888) HTTP/1.1
content-type: application/json

{
"name": "abc",
"time": "時刻"
}

146:デフォルトの名無しさん
20/03/21 10:02:37 +Hs4SQrc.net
>>144
・パイプラインの並列化 (ForEach-Object -Parallel を使用)
これいいな

147:デフォルトの名無しさん
20/03/21 17:39:49 vJ0Lurek.net
Windows PowerShell in Actionの改3版、日本語訳してくれないかなぁ…

148:デフォルトの名無しさん
20/03/23 10:55:55.25 wpOCnP6k.net
パイプラインを繋げる先を条件で分岐って可能ですか?
イメージとしては
Get-Nantoka |
Switch ($_.Name)
Case ('A') | Get-NantokaA
Case ('B') | Get-NantokaB
Case ('C') | Get-NantokaC
な感じです

149:デフォルトの名無しさん
20/03/23 22:15:40 nB8lN/u6.net
さすがにそんなシンタックスはないが同じような動作はできる

$continuation = @{
  A = { select Name,Age | Write-Host -f Cyan }.GetSteppablePipeline()
  B = { select Name,Gender | Write-Host -f Magenta }.GetSteppablePipeline()
  C = { select Name | Write-Host -f Yellow }.GetSteppablePipeline()
}
$continuation.Values.ForEach("Begin", $true)

@"
Name,Age,Gender
A,12,Male
C,93,Female
B,32,Male
A,52,Female
C,73,Female
"@ | ConvertFrom-Csv | foreach { $continuation[$_.Name].Process($_) }

$continuation.Values.ForEach("End")

150:デフォルトの名無しさん
20/03/24 02:11:10.59 1omVAMXs.net
結局処理を別々に書かなきゃいけないなら書いてる通りswitch文でいいんじゃねって気はする

151:デフォルトの名無しさん
20/03/24 12:26:04.21 /23EZweg.net
switch文だと毎回新規にGetNantokaAとかが呼ばれてしまうため例えばGetNantokaAがMeasure-Objectだと意味がなくなる

152:デフォルトの名無しさん
20/03/24 13:30:06.69 n2AHJDo3.net
>>149
ありがとうございます
やっぱり分岐先を埋めたオブジェクトや関数を作らなきゃいけない感じですね
いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな

153:デフォルトの名無しさん
20/03/24 16:14:53.92 /23EZweg.net
>>152
> いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな
同じルーチンが複数同時に走るってことだとと思う
排他制御とか順序の保証とかがどうなってるのかが気になる

154:デフォルトの名無しさん
20/03/24 19:15:33.49 n2AHJDo3.net
>>153
オブジェクトをパイプライン上に並列で走らせるって事?
非同期通信的な・・・

155:デフォルトの名無しさん
20/03/24 19:46:16.61 1omVAMXs.net
>>151
あーそれでわざわざGetSteppablePipeline使ってるのね

156:デフォルトの名無しさん
20/03/24 21:24:12 LC2xv/4E.net
>>149が何やってるのかサッパリ
GetSteppablePipelineでぐぐっても日本人はほとんど存在士らないのかなって具合

157:デフォルトの名無しさん
20/03/24 22:44:37.71 VBWCR/ci.net
ScriptBlock.GetSteppablePipeline Method
URLリンク(docs.microsoft.com)

158:デフォルトの名無しさん
20/03/24 23:52:12.51 LC2xv/4E.net
>>149の最初の連想配列作ってるとこは判る
問題は次
>$continuation.Values.ForEach("Begin", $true)
これ何してるの?
Values.ForEachて。
こんな書き方でSteppablePipelineのBeginメソッドが呼べるの?
C言語の配列で"A"[0]みたいなトリッキーさを連想させるのだが

159:デフォルトの名無しさん
20/03/25 03:41:09 IDfpoHeN.net
.ForEachはメソッド形式のForeach-Objectで、要するにC#のLINQをPowerShell風にアレンジした何か
どっちかというと.ForEach({ ..... }) みたいにスクリプトブロックを渡す使い方が主流だと思うけど、メソッド名を文字列で渡してオブジェクトのメソッドを呼び出すこともできる

ステッパブルパイプラインは任意のパイプライン(文)をメソッド形式で呼び出せるようにするための何か
渡された引数を先頭のコマンドにパイプして実行させることができる

160:デフォルトの名無しさん
20/03/25 18:56:02.32 8IWtSBvh.net
powershellで2つのファイルの差分のみを抜き出して追加や削除されたものは別ファイルに出力したいです
例えば
fileA.txt
aaa
uuu
iii
fileB.txt
iii
uuu
eee
とあった場合にfileBをマスタとしてaaaの文字列をdelete.txtにeeeの文字列をadd.txt出力したいです。
やり方教えてください!

161:デフォルトの名無しさん
20/03/25 19:05:36 D/1vKEW+.net
素人ですまんけど、
$test0 = "a", "b", "c"
$test1 = $test0[1]
こういった時に、$test0のbを同時に削除する書き方はありますか?別途処理を書く必要あり?

162:デフォルトの名無しさん
20/03/26 00:05:42 fIJkkKI3.net
>>160
function Marge([object[]]$Adds,[object[]]$Deletes){
$Adds|Where-Object{$_ -notin $Deletes}
}
Marge $(Get-Content fileB.txt) $(Get-Content fileA.txt) > add.txt
Marge $(Get-Content fileA.txt) $(Get-Content fileB.txt) > delete.txt

163:デフォルトの名無しさん
20/03/26 00:09:27 fIJkkKI3.net
>>161
bを削除という条件なら

$test0 = "a", "b", "c"
$test1 = ($test0 -ne "b")[1]

-ne演算子は左オペランドがコレクションの場合、差分を返す

164:デフォルトの名無しさん
20/03/26 00:14:14 fIJkkKI3.net
-ne演算子の場合は大小比較をしないので注意
もし比較する場合は>>162のように-notin演算子とWhere関数でフィルタする

165:デフォルトの名無しさん
20/03/26 08:51:19.38 BddTdfqa.net
>>162
ありがとうございます
Mergeって関数の中で処理している感じですね
詳細な処理の内容は理解していないので調べつつやってみます!

166:デフォルトの名無しさん
20/03/28 02:03:33 .net
scoop の魅力

167:デフォルトの名無しさん
20/03/30 02:08:56 VM+VSYRD.net
> $a = try{get-content data.txt}catch{@()}
> $a = if(3 -ne 4){11}else{22}
ダメ元で試してみたらこんな書き方出来たのかよ

168:デフォルトの名無しさん
20/03/30 07:08:11.36 PN3/f/57.net
うん、だから三項演算子入れないでほしかった
なんでわざわざ評判微妙な記法を取り入れたんだろ

169:デフォルトの名無しさん
20/03/30 18:31:48.20 2xrywwd7.net
三項演算子は俺の大好物

170:デフォルトの名無しさん
20/03/30 18:44:14.41 kxtxXuN0.net
C#8.0のswitch式見ててあれってなったけど、そういえば右辺に文を持ってこれるのってPowerShellくらいなんだっけ

171:デフォルトの名無しさん
20/03/30 22:05:50.57 bK3E1kug.net
goto を禁止して
今度は if then else を禁止しようってか?

172:デフォルトの名無しさん
20/03/31 09:18:05 hmCJ2D6X.net
# RSSの内容を取得
$url="URLリンク(rss.itmedia.co.jp)
$webclient = new-object System.Net.WebClient
$webclient.Encoding = [System.Text.Encoding]::UTF8
$rss = [xml]$webclient.downloadstring($url)

とやった場合に$rssの内容を手早く調べるにはどうやればいいですか?
$rss | ConvertTo-Json -Depth 100
$rss | Out-GridView
なんかは表示が貧弱すぎてわかりません
多少長くてもいいので正確に(できればJSONで)階層化する方法が知りたいです
$rssはあくまで一例で類似の複雑なオブジェクト全般について知りたいです

173:デフォルトの名無しさん
20/03/31 12:14:42.73 b44czDa9.net
>>172
$rss.rss.channel.item で一覧表示される(もちろんGridViewで見てもよい)けど、そういうことではなくて?

174:デフォルトの名無しさん
20/03/31 13:02:27.84 UGGIMXD4.net
>>172
JSONとXMLじゃ表現できる範囲が違うから「正確に」と言うなら$rss.OuterXmlとかで見るしかないと思うよ
インデントとか付けて見易くしたいならXmlWriter使って整形すればいい
URLリンク(imihito.hatenablog.jp)

175:172
20/03/31 15:56:05.63 hmCJ2D6X.net
ISEからVSCodeに変えてデバッグ&インスペクトしたら大体望み通りの表示が得られました
URLリンク(i.imgur.com)
[xml]な$rssも細部まで階層表示が出来ました
余計なプロパティがあまりにもごちゃごちゃしていて目視で$rssの把握は無理気味でしたが…
ありがとうございました

176:デフォルトの名無しさん
20/04/01 05:14:26.18 T/a2Vy7O.net
VSCode に、XML のお勧め拡張機能はないの?

177:デフォルトの名無しさん
20/04/01 08:11:20.55 VNCwfYlv.net
>>176
スレタイ1024回読み直せ

178:デフォルトの名無しさん
20/04/01 20:40:01.19 wuY/0uuQ.net
classとclassを使うスクリプトの場所を分けたい場合
例えば
c:\workフォルダに
main.ps1
c:\work\class フォルダに
class1.ps1
class2.ps1
class2.ps1はclass1.ps1を読込ので先頭に
cd $PSScriptRoot
. ".\class1.ps1"
main.ps1はclass2.ps1を読込ので先頭に
cd $PSScriptRoot
. ".\class\class2.ps1"
これでmain.ps1動かすとディレクトリがc:\work\classに変わっちゃうから
class2.ps1を読み込んだ後にもう一度cd $PSScriptRootでディレクトリを移動し直すのが
なんか気持ち悪いんですが、絶対パスでやる以外に方法はあるんでしょうか

179:デフォルトの名無しさん
20/04/02 02:02:55 sgXKVFsI.net
pushd popd

180:デフォルトの名無しさん
20/04/02 23:47:54.92 W0wv5F0P.net
. "$PSScriptRoot\class1.ps1"
と絶対パスでやるのが一般的
カレントディレクトリの移動はやらんほうがいい

181:デフォルトの名無しさん
20/04/03 01:06:03.07 BrOkETDP.net
なる程その手があったか
どうもありがとう

182:デフォルトの名無しさん
20/04/08 19:04:23.59 bFKpwotA.net
連想配列をカンマ区切りに置換してファイル出力する方法教えてください
配列の場合はわかるんですが連想配列の場合がわかりません
@{id=001;name=hoge}
みたいなやつを↓
001,hoge
みたいな感じにしたいんです

183:デフォルトの名無しさん
20/04/08 19:27:34.84 VOICq9dy.net
@{id="001";name="hoge"}.Values -join ","

184:デフォルトの名無しさん
20/04/08 20:46:56 u/iW9oDx.net
>>183
なるほど!!

185:デフォルトの名無しさん
20/04/09 10:17:18 qPytwYgo.net
powershellのエラー発生時のログ出力って皆さんどうやってますか?
単純にpowershellの画面上に出力されてるエラーをログに吐き出したいだけなのですがイマイチやり方が分かりません!

186:デフォルトの名無しさん
20/04/09 11:37:10.62 ZcR3gUW3.net
$error

187:デフォルトの名無しさん
20/04/19 17:57:40.84 LL/F5W9x.net
シフト右クリックからpowershellウインドウをここで開くでウインドウ立ち上げた時にアクティブな状態で立ち上がらないから一回クリックしたりして選択し直さないかんのが地味にストレス

188:デフォルトの名無しさん
20/04/19 18:12:07 wL4NwIK0.net
>>187
おま環

189:デフォルトの名無しさん
20/04/19 18:14:16 vjiWfekt.net
シフト右クリックするとメニューが出る
このとき先にシフトを離してから開く操作をするといい
シフトを押した状態でアプリを起動すると非アクティブで開くのはWindowsの昔からの機能

190:デフォルトの名無しさん
20/04/19 18:18:01 vjiWfekt.net
Windows95の頃からこの機能は変わっていないと思う

191:デフォルトの名無しさん
20/04/19 19:11:09 jwLUU+vG.net
>>187
シフト押さないで出すようにしたら?
URLリンク(suyamasoft.blue.coocan.jp)

192:デフォルトの名無しさん
20/04/19 19:35:33.27 /0QkS1hn.net
なるほど、勉強になった
ありがとう

193:デフォルトの名無しさん
20/04/21 22:23:31 8Kh2/Vc8.net
>>137
結構古い本だけど今でも読み応えある感じですか?

194:デフォルトの名無しさん
20/04/23 21:26:18 xCk1mGre.net
日本語に翻訳された初版じゃなくて第3版でしょ

Windows PowerShell in Action, Third Edition
URLリンク(www.manning.com)

195:デフォルトの名無しさん
20/04/28 10:53:40 +ujIhWuh.net
メンバを呼ぶ.(ドット)の演算子を逆参照演算子と呼ぶらしいんだけど、どこら辺が逆なんだろう

196:デフォルトの名無しさん
20/04/28 15:39:52 nkgQazrR.net
Cとかでは * で値を得ることをdereferenceということがあるよ。

197:デフォルトの名無しさん
20/04/28 19:06:19 +ujIhWuh.net
逆参照演算子もdereferenceの直訳っぽいね
参照の反対の行動という意味で逆なのかな

198:デフォルトの名無しさん
20/04/29 08:59:09 pj1FfIiR.net
参照先のオブジェクト実体を見る、参照じゃなくなるからdereference(逆参照)

199:デフォルトの名無しさん
20/04/29 10:32:55 JJa9UlV/.net
普通、参照外しって訳すけどな。「逆」じゃ意味が通じない。

200:デフォルトの名無しさん
20/04/29 11:22:32 HjIuTJYT.net
Powershellに逆参照演算子なんてないでしょ
ドットはMember access operatorとDot sourcing operatorの二種類のはず
ほかの言語との混同があるのでは
C言語の & と * を参照演算子、逆参照演算子と訳すなら分かるし、-> を逆参照演算子と呼ぶのもまあ分かる

201:デフォルトの名無しさん
20/04/29 12:43:39.55 YtBfjahw.net
日本語版Windows PowerShell in Actionにそう書いてあった気がするんだが、
確かにMSDN見るとMember access operatorだ

202:デフォルトの名無しさん
20/04/29 12:50:10 YtBfjahw.net
vscode上だと高度な関数のbeginブロックで定義した変数が、
processブロック中で使ってるにも関わらず未参照の警告が出るんだけど良い解決方法ないでしょうか
未参照確認自体は便利なので黙らせたくはないです

203:デフォルトの名無しさん
20/04/29 21:28:33 kj6lHAl7.net
>>199
逆参照と訳す人が現実にいるんだから仕方がない

URLリンク(www.google.com)

204:デフォルトの名無しさん
20/04/30 09:42:14 Lei4veWw.net
>>200-201
古い about_Operators には property dereferences operator とあるので、改名されたのかも。

URLリンク(docs.microsoft.com)

205:デフォルトの名無しさん
20/04/30 14:51:17 qeUJHkfv.net
URLリンク(docs.microsoft.com)(v=wps.640)

. プロパティ逆参照演算子
オブジェクトのプロパティとメソッドにアクセスします。

$myProcess.peakWorkingSet
(get-process PowerShell).kill()

206:デフォルトの名無しさん
20/05/01 00:27:41 iyqswZZm.net
一般的には
参照 アドレスを取り出す
逆参照 アドレスに入っている値を取り出す
だけど値を取り出すことを「逆」と訳した経緯がわからん

207:デフォルトの名無しさん
20/05/01 05:46:31 XmUvZ7vC.net
変な翻訳だな
値参照でいい

208:デフォルトの名無しさん
20/05/01 12:57:54 578ddPng.net
dereferenceはやっぱ参照外しかな
referenceってポインタ(または名前)が主語で、実体に向かって矢印が向いている、ポイントしている状態
逆参照というとこの矢印を逆に辿る、変数からポインタを探すになっちゃう
接頭辞de-を「離れる」と理解せずに、かなり派生的な「逆」と訳して定着した誤訳に近い語だと思う

209:デフォルトの名無しさん
20/05/01 12:58:58 578ddPng.net
いずれにしてもPowershellでdereferenceなんて概念を持ち込む必要がないからメンバアクセス演算子って名前に改善されたんでしょう

210:デフォルトの名無しさん
20/05/01 16:33:54 5CcYXcTT.net
C系は逆参照じゃないの
むしろ参照外しのほうがわからんかったが

211:デフォルトの名無しさん
20/05/01 17:34:48.85 578ddPng.net
どっちがデファクトスタンダードかって話とどっちが正しいかって話は別だから
確信犯とか姑息みたいに誤用の方が普及して定義が揺らいでる言葉はいろいろあるけどどう使うかは話者次第

212:デフォルトの名無しさん
20/05/04 01:09:24.67 hArtKUaR.net
初心者です
move-item等でファイル名に[]があるとエラーがある事を知りました
ようやく -LiteralPath つければ良いと分かりましたが、
デフォルトの仕様がワイルドカード受け付けるのって初心者殺しというか…
なれてる人はこっちの方が便利なんでしょうか

213:デフォルトの名無しさん
20/05/04 03:59:19.96 eeiLu4M/.net
Powershell好きだけどファイル名の [ ] の扱いは失策だと思う

214:デフォルトの名無しさん
20/05/04 08:21:59.04 ayLem+RW.net
?や*すらファイル名に使えるUNIXの世界へようこそ!

215:デフォルトの名無しさん
20/05/04 09:28:04 hArtKUaR.net
>>213
やっぱりそうですよね・・・

比較演算子も、-matchで[ ]があるとエラーになって困りました
これもいろいろ調べてようやく-match [regex]::escape() にすれば良いと分かりましたが・・・

PowerShellって参考書もあまりなくて古いし、ネットの情報もあまりなくてなかなか学習が進みません・・・

そもそもPowerShell ISEのヘルプで -pathは「ワイルドカード文字を許可する false」って嘘書いてあるのが・・・

216:デフォルトの名無しさん
20/05/04 11:59:27 dnvbBZmT.net
ファイル名はともかくmatch が正規表現で比較ってのは割と知られているような気もするけど

217:デフォルトの名無しさん
20/05/04 13:19:22.94 XmeTIU4M.net
対になるlike演算子があるからなんとなくわかる
ところでreplaceの正規表現じゃない版が欲しい・・・

218:デフォルトの名無しさん
20/05/04 13:22:34 eeiLu4M/.net
たしかに-matchの話に限っては単なる勘違いだな
match(一致)と言われて部分一致だと思うかといえば、普通はpattern matchでしょう
参考にしたサイトが悪かったのかもしれない
正規表現を使わないなら "a[b]c".Contains("[b]") でいい

219:デフォルトの名無しさん
20/05/04 13:25:02.05 eeiLu4M/.net
>>217
上のレスで気付いたかもしれないけど
"a[b]c".Replace("[b]", "[d]") で置換できるよ

220:デフォルトの名無しさん
20/05/04 13:42:36.44 XmeTIU4M.net
なるほどね
そういや -replace [regex]::escape()でもOKか

221:デフォルトの名無しさん
20/05/04 16:06:32 hArtKUaR.net
>>216 >>218
教えていただいてありがとうございます。
自分がやりたかったのは、例えば hoge[hoge] というファイル名で拡張子の違う
複数のファイルの移動だったんですが、最初は

$hoge = "hoge[hoge]"
Move-Item "C:\test\$hoge.*" "C:\test2"
これは失敗しました([ ]があるファイルを処理していて気がつきました)

いろいろ調べて
Get-ChildItem "C:\test\*.*"|Where-Object{$_.basename -match [regex]::escape("$hoge")}|Move-Item -Destination "C:\test2"
してみて成功しました

今回教えてもらって
Get-ChildItem "C:\test\*.*"|Where-Object{$_.basename.contains("$hoge")}|Move-Item -Destination "C:\test2"

これでOKみたいです。まだ冗長な気もしますが・・・

222:デフォルトの名無しさん
20/05/04 17:06:49.01 LlR+aKwZ.net
パスの角括弧の扱いはpsの一番いけてないとこだからね
角括弧のみをエスケープする場合は次のようにする
move "C:\test\$hoge.*".Replace('[', '``[') "C:\test2"
もしくは-Filterパラメータが角括弧をワイルドカード扱いしないことを利用して
move "C:\test\*" "C:\test2" -Filter "$hoge.*"

223:デフォルトの名無しさん
20/05/04 18:54:18.78 hArtKUaR.net
>>222
なるほど。 [  だけエスケープすれば大丈夫なんですね
ようやく引っかかってた所から脱出できそうです
皆さん大変ありがとうございました

224:デフォルトの名無しさん
20/05/06 21:11:41.78 prm5gj7H.net
これってクラス多めのオブジェクト指向でやるべきなのか、
高度な関数多めのパイプライン志向(?)でやるべきなのか、
どっちがいいのかな

225:デフォルトの名無しさん
20/05/07 01:36:33.14 k5uIH00p.net
オブジェクト使い回す設計のほうが読みやすそうならそうする
高度な関数ってどんなんやねん

226:デフォルトの名無しさん
20/05/07 02:22:01 GVyLSOna.net
高度な関数ってずいぶん懐かしい単語だな、普通に関数でいいと思うよ
全ては無理に和訳しようとしたMSが悪い

227:デフォルトの名無しさん
20/05/07 08:07:17 O8jL8wQb.net
>>224
本来のシェル的な使い方がメインなら
関数でパイプライン多用した方が使いやすい

普通のアプリに近いものを作る場合には
クラスでOOPした方が使いやすい

228:デフォルトの名無しさん
20/05/07 08:26:30 H2g0PsUL.net
PSのクラスって判らんからコード量増えたらC#埋め込むわ

229:843
20/05/07 09:38:19 1Drf/TcZ.net
PSのクラスって機能が足りないとかはあるけど特に難しい所はないと思うが…

230:デフォルトの名無しさん
20/05/07 23:47:47 cnY/r+Lf.net
教えてください。
WindowsServer2012のADユーザー情報の取得についてです。

testunyo.local
┗ユーザー
  ┗Users
上記OUにあるユーザーの情報のうち、
 ログオンID
 フルネーム(表示名)
 所属するグループ名 の情報をcsvで抽出したいとき、

Get-ADPrincipalGroupMembership -identity test | Select-Object name | Format-Wide -Column 20 | Out-String -Width 500 >> C:\work\logtest.csv

とすると所属するグループ名しか抽出できません。
A列にログオンID、
B列にフルネーム、
C列以降に所属するグループ名
と、1ユーザー1レコードで表示させたいとき、
どのようにするのが良いでしょうか?

Get-ADPrincipalGroupMembershipではなく、csvdeを使うのが良さそう
とは思ったのですが、うまく抽出できませんでした。

231:デフォルトの名無しさん
20/05/08 01:23:43 GBARQ9Uf.net
Select-Object name で name プロパティしか抽出できてないとか?

232:デフォルトの名無しさん
20/05/08 12:22:27 Fn4yfVbS.net
>>221
Ruby で作った。
DryRun なので、実際には実行されません

require 'fileutils'

dest_dir = "C:/test2"
keyword = "hoge[hoge]"

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/test/*"
src_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select { |full_path| File.basename( full_path, ".*" ) === keyword } # 拡張子を取り除いた部分のファイル名
.each do |full_path|
dest_path = dest_dir + "/" + File.basename( full_path ) # ファイル名
FileUtils::DryRun.move( full_path, dest_path )
end

出力
mv C:/test/hoge[hoge].txt C:/test2/hoge[hoge].txt

233:デフォルトの名無しさん
20/05/08 13:46:42 fxtS7XW6.net
GetNewClosureで作ったクロージャからトップレベルに定義した関数にアクセスできんのだがスコープどうなってんだ?

function Hoge () {}

{ Hoge }.Invoke() #うごく
{ Hoge }.GetNewClosure().Invoke() #うごかん

234:デフォルトの名無しさん
20/05/08 15:09:04 eZ8FT/L5.net
またキチガイが湧いてきたか
NG しやすいように、コテハン付けて欲しいわ

235:デフォルトの名無しさん
20/05/10 09:05:34.07 oQrk4XHl.net
>>233
トップレベルと呼んでいるのは、(仮に) Hoge.ps1 の Script スコープでいいよね?
PowerShell のクロージャは、動的モジュールにバインドされたスクリプトブロック。
モジュールの Script スコープは、常に Global スコープの直接の子なので、
クロージャの Local スコープは、Hoge.ps1 の Script スコープの子孫にならない。
スコープの親子関係:
[Global] - [Script(Hoge.ps1)] <== Hoge 関数の定義されているスコープ
[Global] - [Script(動的モジュール)] - [Local] <== 問題のクロージャ内のスコープ

236:デフォルトの名無しさん
20/05/10 15:23:52 JjPR8mXC.net
Ruby で作った!

237:デフォルトの名無しさん
20/05/11 21:37:49 41JmE2xy.net
>>235
なるほど
PowerShellって便利で面白いけど時々変な癖あるよな

238:デフォルトの名無しさん
20/05/12 21:11:03 2xTEfvW8.net
Closures in PowerShell
URLリンク(devblogs.microsoft.com)

Windows PowerShell uses dynamic modules to create dynamic closures.
A closure in computer science terms (at least as defined in Wikipedia) is “a function that is evaluated in an environment containing one or more bound variables.”
A bound variable is, for our purposes, a variable that exists and has a value. The environment in our case is the dynamic module.

239:デフォルトの名無しさん
20/05/15 09:02:37.24 B71gCNON.net
v6.2.5
URLリンク(github.com)
v7.0.1
URLリンク(github.com)

240:デフォルトの名無しさん
20/05/15 09:54:10 JVqn6ak1.net
昔ながらのPowerShellとPowerShell Coreって共存できんの?
PowerShell CoreってクロスプラットフォームだけどWindowsの管理コマンドとか旧PowerShell資産とかとどれぐらい互換性あるのかな

241:デフォルトの名無しさん
20/05/15 12:11:51 spGK6l8f.net
>>240
共存できる。Core をインストールしても、PowerShell 5.1 を置き換えない。
インストールされるパスが違うし、そもそも実行ファイルのファイル名も違うので。

242:デフォルトの名無しさん
20/05/15 21:26:49 OwQtRj4C.net
Windows PowerShell 5.1 から PowerShell 7 への移行
URLリンク(docs.microsoft.com)

243:デフォルトの名無しさん
20/05/16 02:28:51 LVL/9uGV.net
むしろCore版を上書きしてほしんだが

Powershellで検索すると大量に出てきてうざいし、
Win+Xのショートカットから起動したいし

244:デフォルトの名無しさん
20/05/16 02:29:08 LVL/9uGV.net
逆、Core版で、ね

245:デフォルトの名無しさん
20/05/16 21:17:04 I3dvVBqE.net
>>243
タスクバーにピン留めでは駄目なの?

246:デフォルトの名無しさん
20/05/19 11:55:42.51 1h+Pwucu.net
C#クラスFooをAdd-Typeして
Fooを継承するpowershell class Barを定義しようとするとVSCodeの静的解析に型Fooが無いって言われる
実行時には問題なく動作するんだけど鬱陶しい
どうにかならんのかこれ

247:デフォルトの名無しさん
20/05/19 16:52:18 JYrNQD+Z.net
>>246
現状では継承クラスを別ファイルにして読み込み元で先にadd-typeしてから遅延読み込みするしかない
core系統ではusing assemblyの実装が保留されてるから
将来的にはおそらくそこをクリアしたusing assemblyが実装されると思うけど

>実行時には問題なく動作するんだけど

それはどこかしらで自分で先にadd-typeしてるからだと思う。そうじゃないとエラーで止まる

今の段階で最善と思われる方法はマニフェストモジュールにして
psd1内でRequiredAssembliesに継承元のアセンブリを設定すること
それをusing moduleで読み込むようにすれば最も自然に使える

248:デフォルトの名無しさん
20/05/19 20:59:56 JYrNQD+Z.net
>>246
ごめんよく読んだら的外れなレスだったわ
C#のコードをadd-typeするってことね
.NETのクラスを継承すると勘違いした

249:デフォルトの名無しさん
20/05/19 21:17:33 qw+UaCoQ.net
Suppressing Rules
URLリンク(github.com)

250:デフォルトの名無しさん
20/05/19 21:19:20 qw+UaCoQ.net
urlおかしかったからやり直し

URLリンク(github.com)

251:デフォルトの名無しさん
20/05/25 18:56:03 1KC3re4i.net
教えてください。Windows10です。
クリップボードに次の文字をコピーします。
Get-ChildItem -Path "c:\doc★"
これをPowershellに貼り付けると、勝手に★が削除されて
Get-ChildItem -Path "c:\doc"
になってしまいます。正常に貼り付けるには、
どのようにすればよろしいでしょうか?

252:デフォルトの名無しさん
20/05/25 20:12:08 zwsFaYDZ.net
Powershellコンソールのバグらしいよ

253:デフォルトの名無しさん
20/05/26 00:18:53 oj/EjNC2.net
そうですか。バグなのですか。ありがとうございました。

254:デフォルトの名無しさん
20/05/26 08:41:22.73 Ay3ltgvo.net
コンソールじゃなくてPSReadLineのバグでしょ
Remove-Module PSReadLine を実行した後なら普通に貼り付けできる

255:デフォルトの名無しさん
20/05/26 08:45:00.47 TWTiQG7J.net
>>251
知らんかった、こんなバグが有ったのか。ウチの環境でも再現した。
echo '★★★★'
echo '☆☆☆☆'
これを貼り付けると、
echo ''
echo ''
こうなったわ。

256:デフォルトの名無しさん
20/05/26 08:56:54.86 lYnWhySi.net
>>254
ホントだ、治った

257:デフォルトの名無しさん
20/05/26 10:38:39.59 DUXfe990.net
なん…だと…

258:デフォルトの名無しさん
20/05/26 11:36:52.76 fIo6Jhad.net
スクリプトならok?

259:デフォルトの名無しさん
20/05/26 15:52:47 q+hnim2U.net
スクリプトならOKだよ
画面を色分けする処理がバグってたはず

260:デフォルトの名無しさん
20/05/26 19:42:26 wDroaLCo.net
echo 'yatta-man★ko-hi-★raita-'
いやー、もう少しで社会的に抹殺されるところだったよ

261:デフォルトの名無しさん
20/05/27 18:03:22.45 8S2S1tlw.net
htmlのdiffでまともな方法ない?

262:デフォルトの名無しさん
20/05/28 16:49:06.82 NkjBuM4x.net
Get-ADPrincipalGroupMembership -identity testuser1 | Select-Object name | ・・・
というshellを2つ続けて流すと、ログファイルに記載されたとき、
1つ目のshellの結果と2つ目のshellの結果に3行の空白が生まれます。
なぜでしょうか・・・?

263:デフォルトの名無しさん
20/05/29 08:40:18 GJdaxgw0.net
>>262
shell ってどういう意味ですか?

264:デフォルトの名無しさん
20/05/29 09:24:43 AL+gVKfO.net
URLリンク(ejje.weblio.jp)

shellとは
貝殻、(カキの)殻、(カメ・エビ・カニなどの)甲羅、(カブトムシなどの)硬い外皮、(鳥の卵の)殻、(果実・種子などの)殻、(豆類の)さや、(建物・乗り物などの)骨組み、外郭、船体

265:デフォルトの名無しさん
20/05/29 09:26:47 d1uEOplb.net
>>263
すみません。
PowerShellスクリプト、です。

266:デフォルトの名無しさん
20/05/29 12:54:04.01 1C1s9P85.net
ログファイルはフィルターして見るから、どうでも良くね?
サーバー運用部門しか見ないし。
一般社員が見ないだろ
数年保存して捨てるだけの、ログファイルの書式にこだわっても、仕方ない

267:デフォルトの名無しさん
20/05/29 14:16:17.31 8xO19nFy.net
なぜそうなるかを知りたいってことだろ
>>262がどういうスクリプトを流してるのかさっぱり要領を得ないから原因は全くわからんけど

268:デフォルトの名無しさん
20/05/29 15:24:58.90 GJdaxgw0.net
>>265
(1)1回目と2回目は、パラメータが違うのですか?それとも、全く同じ内容で実行のタイミングが違うだけですか?
(2)何度も尋ねるのは煩雑なので、可能であれば端折らずに記述内容を全て記載してもらえませんか?

269:デフォルトの名無しさん
20/05/29 15:38:08.24 QVnkNeSg.net
まあでも、センスは出るよね

270:デフォルトの名無しさん
20/05/29 15:53:45 d1uEOplb.net
>>266
 正にその通りなんですが、サーバー運用部門としてみる人数が多いので、
 可能な限り整った書式で出力したい次第です。

>>267
 今までも様々なログを出力してきましたが、
 今回のような不思議な現象は初めてで、どうしてなのか解明したいです。

>>268
 (1)1回目と2回目はほぼ同じスクリプトです。
 (2)端折っていない実行したスクリプトを記載します。

>>269
 センス、出ますよね・・・。

端折っていないスクリプトです。
以下二つを、同時に流しました。

Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Width 1000 >> C:\work\logtest0528.csv
Get-ADPrincipalGroupMembership -identity test222 | Select-Object name | Format-Wide -Column 20 | Out-String -Width 1000 >> C:\work\logtest0528.csv

よろしくお願いします。

271:デフォルトの名無しさん
20/05/29 16:13:12.46 1C1s9P85.net
たぶん、1つ目のアプリが、3行の改行コードを出力してるからだろ
例えば、HTML みたいに、データ内の区切りに、CR・LF の改行コードを使っているものもある。
それらを出力すると、空行ができる
それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか

272:デフォルトの名無しさん
20/05/29 16:16:40 yQdVc2qs.net
>>262 > というshellを2つ続けて流すと
>>270 > 以下二つを、同時に流しました。

相手を混乱させて遊んでるっていう理解でいい?

273:デフォルトの名無しさん
20/05/29 16:45:48.92 d1uEOplb.net
>>271
 バグですか・・・
 必要なデータは取得できているんですが、
 その下に不必要な空行が発生するのは、もう、仕方ないんですかね・・・
>>272
 混乱させるつもりはなかったのですが、
 >>270のスクリプトは、エクセルで作成をしました。
 (A1に1つ目のスクリプト、A2に2つ目のスクリプト・・・という感じです)
 作成したスクリプトの全てをコピーし、PowerShellに貼り付ける、
 という作業をしました。

274:デフォルトの名無しさん
20/05/29 16:56:48 xfksWnzq.net
そもそも Get-ADPrincipalGroupMembership が何個の要素をパイプラインに流してるか見てみたら?

275:デフォルトの名無しさん
20/05/29 17:01:45 GJdaxgw0.net
>>270
ユーザが所属しているグループをファイルに吐きたいわけですよね。
1ユーザごとに1ファイル、グループは横に並べて出力、という条件は必須ですか?

276:デフォルトの名無しさん
20/05/29 17:11:08 GJdaxgw0.net
>>273
力技だけど、これでどうですかね。うちの環境ではうまく行ってます。
(Get-ADPrincipalGroupMembership -identity testuser111 ).name | %{"$_`t"| Out-File -NoNewline -Encoding ascii -Append -FilePath "C:\a.txt"}

277:デフォルトの名無しさん
20/05/29 17:38:52 d1uEOplb.net
>>274
 その考えは無かったです・・・
 調べてみます。

>>275
 >>270のコードでtest111,test222としているところ、
 実際には3000程の数があります。
 実行するスクリプトの結果(ログ)は一つのファイルに追記する形で、
 理想の出力は、
 1ユーザーの所属するグループが、1セル1グループに横並びになることです。

     A      B     C
  1 グループ1 グループ2 グループ3   ←1つ目のスクリプトで流したtest111の所属するグループ
  2 グループ1 グループ3 グループ4   ←2つ目のスクリプトで流したtest222の所属するグループ

 というイメージです。

>>276
 ありがとうございます!
 検証してみます。

278:デフォルトの名無しさん
20/05/29 18:01:42 d1uEOplb.net
>>276
 -NoNewline でエラーになります・・・
 Out-FileのパラメーターとしてNoNewLineというものが無いと表示されます。

 276さんはうまくいったとのことなので、
 環境が違うのでしょうか・・・?

279:デフォルトの名無しさん
20/05/29 18:11:11 GJdaxgw0.net
>>278
じゃあ、最初の趣旨とは違ってますけどこれでどうでしょう。
"C:\users.txt"には、対象となるユーザ名を1行に一つという形式で記述してください。
まあ、対象ユーザも Get-ADObject で取得したほうがスマートですけどね。「特定のコンテナ内のユーザ」といった条件なら簡単なのですが。

$users = Get-Content "C:\users.txt"
foreach ($user in $users) {
if($user -eq ''){
break
}
echo $user
$grps = (Get-ADPrincipalGroupMembership -identity $user ).name
$line = ''
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding utf8 -Append -FilePath "C:\grp.csv"
}

280:デフォルトの名無しさん
20/05/29 18:22:56 d1uEOplb.net
>>279
 ありがとうございます。
 すでに私に理解できる範囲を超えているのですが、、、

 データを取得したい対象ユーザーは”特定のコンテナ内”です。

 その場合であれば、どこを変更するようになるでしょうか?
 すみません。ご教示ください。

281:デフォルトの名無しさん
20/05/29 18:44:52.24 GJdaxgw0.net
>>280
じゃあこれが良いと思います。
3行目の「"OU=Newusers,DC=example,DC=local"」となっている箇所を、実際の環境に置き換えてください。
以下は、ドメイン名が「example.local」、最上階層の「Newusers」という OU 内の UserObject を全て取得する場合の例です。
デスクトップ上に 'yyyyMMdd_hhmmss.csv' を出力します。1カラム目はユーザ名で、2カラム目以降がグループ名です。
$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
foreach ($user in $users) {
if($user -eq ''){
break
}
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding 'utf8' -Append -FilePath $logPath
}

282:デフォルトの名無しさん
20/05/29 18:48:35.39 GJdaxgw0.net
>>280
追伸。まず、
Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
だけ実行して希望通りのユーザオブジェクトが出力されることを確認してください。
"OU=Newusers,DC=example,DC=local"の記述方法がキモになりますが、
よくわからない場合は「distinguished name」でググってください。

283:デフォルトの名無しさん
20/05/29 23:38:38 d1uEOplb.net
>>281
>>282
 本当にありがとうございます!
 今は検証環境に繋げないので、明日、試してみます!
 また結果を明日の夜します!

284:デフォルトの名無しさん
20/05/30 00:38:50 AsxV9jzU.net
ふーむcsvde使った方が楽そうだな

285:デフォルトの名無しさん
20/05/30 07:47:46.25 Z2NT1d95.net
PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある

286:デフォルトの名無しさん
20/05/30 08:49:02.75 d859mrLa.net
結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど

287:デフォルトの名無しさん
20/05/30 10:31:28 KjUAf8QQ.net
>>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ

288:デフォルトの名無しさん
20/05/30 13:24:05 9sn/rA++.net
余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?

289:デフォルトの名無しさん
20/05/30 16:10:14.39 KjUAf8QQ.net
>>288
会社によるだろう、としか

290:デフォルトの名無しさん
20/05/30 23:54:06.76 iu9cBMrA.net
合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない

291:デフォルトの名無しさん
20/05/31 00:40:12 +AbQWtDJ.net
ちなみにレジストリをいじるのは認められているの?

292:デフォルトの名無しさん
20/05/31 01:57:51 81hmFEht.net
うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。

293:デフォルトの名無しさん
20/05/31 12:20:40 b/Zu62PW.net
管理者権限アカウントの申請は必要てのはあるよね

294:デフォルトの名無しさん
20/05/31 17:04:24.67 rtfQfZlf.net
部のPC担当じゃなければせいぜいパワーユーザーだと思うけど

295:デフォルトの名無しさん
20/05/31 23:56:26.74 iB7Renkw.net
>>281
報告が遅くなりました・・・。
検証環境で実行した結果、
A列にログオンID、B列に所属するグループ1、が表示されました。
ここまではかなりいい感じだったのですが、
所属するグループの2つ目以降が出力できませんでした・・・。
2つ目以降を出力できるよう考えてみましたが、
取ってつけた知識では太刀打ちできませんでした。
すみません。2つ目以降を出す方法を教えていただけますでしょうか。
csvdeも考えたのですが、
先に形になったのがGet-ADPrincipalGroupMembershipだったので、
そちらを主軸に考えていました。
理想形が出力されればcsvdeでも全く問題ありません!
レジストリはいじれますが、あくまでもシステム管理部であるから、
という感じですね。
あー、PowerShellを使うこと、が目的になってしまってる感はありました。
理想の出力結果が出れば、フリーのツールでもOKなんですが、、、

296:デフォルトの名無しさん
20/06/01 00:21:41 vdF2NbM2.net
余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}

297:281
20/06/01 08:58:32.48 Pn8bHbMj.net
>>295
説明がしにくいので、pastebin に貼りました。
URLリンク(pastebin.com)
こちらで試している限り、所属グループが複数でも正しく出力されています。
現象的に、12行目の
$line += '"{0}",' -f $grp
が、「+」が抜けて
$line = '"{0}",' -f $grp
になっているように思えます。
確認1:
コードはコピペされてますか?それとも、画面を見ながら手打ちで転記でしょうか。
もし後者の場合はコピペで試してみてください。
また、仮にコピペだったとしても、5ちゃんからではなく上記 URL の pastebin からコピペしなおしてみてもらえますか。
確認2:
ファイルに書き出すものと同じ内容を画面にも出力するようにしています。
グループ名が一つだけ、というのは画面上でもでしょうか?

298:デフォルトの名無しさん
20/06/01 20:38:24 6WpvIjeC.net
>>296
 ありがとうございます。
>>270に記載のスクリプトを編集して、
 Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()} >> C:\work\logtest0528.csv
 という感じになるでしょうか?

>>297
 ありがとうございます。
 確認1:5ちゃんをコピペしてました。
     明日検証環境を使えるので、URLのpastebinからやってみます。
 確認2: グループ名が一つだけ、というのは画面上でもそうなってます。
     (実際には所属するグループが3つあるユーザーを作りテストしています)
「+」は確かに抜けているところがありますね・・・。
修正して、もう一度検証してみます。

ありがとうございます!

299:デフォルトの名無しさん
20/06/01 23:33:53 5NIHbXOS.net
「慶應卒の学歴なんていらない」10代起業で成功する子の共通点
URLリンク(www.excite.co.jp)
起業で成功するキャリア形成の仕方とは? 元プロサッカー選手で起業家の鈴木啓祐氏に聞いた
URLリンク(sogyotecho.jp)
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
URLリンク(www.dreamgate.gr.jp)
学生起業家が開発、「人を軸に本を探すアプリ」とは?読書通じて「考える力」養って
URLリンク(newswitch.jp)
島田商高生がアプリ考案、発表 ICT起業家育成プログラム
URLリンク(www.at-s.com)
医師コンビが「治療用アプリ」で起業、禁煙に続き高血圧治療アプリを開発
URLリンク(diamond.jp)
好きが高じて“カレー起業”、キャッシュレス決済アプリ「TOKYO MIX CURRY」の挑戦
URLリンク(diamond.jp)

300:デフォルトの名無しさん
20/06/02 12:00:25.43 TaVu0Z+0.net
>>297
 pastebinに記載いただいたスクリプトをマルっとコピペで、
 理想形として出力することができました!!
 本当にありがとうございました!!
 一文で作成しようと考えていましたが、
 こんなに長いスクリプトが必要とは思いませんでした・・・。

301:297
20/06/02 13:51:33.65 4gU+uBDd.net
>>300
うまく動いたようで良かったです。
あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。
また、記述する際も省略表記はなるべく避けるようにしましたので、
ググって意味を調べるのも容易かと思います。
Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。

302:デフォルトの名無しさん
20/06/02 16:16:22.57 e5f6kXC+.net
csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね

303:デフォルトの名無しさん
20/06/02 18:35:36 TaVu0Z+0.net
>>301
 本当にありがとうございました。
 次にこの出力したデータを加工して、今度はインポートする作業が待っていますが、
 調べて頑張ってみます。

>>302
 はい。家庭で検証ができないのでテストが大変でした。
 csvdeも今後使うことがありそうですので、注意してみておきます。

304:300
20/06/03 17:19:22.25 OSlS0ZCr.net
すみません。頑張り切れませんでした。
>>297 の出力結果に加え、
そのアカウントの有効/無効の情報を同時に取得したいと思い、
Enabledを加えてみましたが、うまく出力できませんでした。
Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?

305:300
20/06/03 18:10:05 OSlS0ZCr.net
Write-Hostの前じゃなかったです。
後ろでした。
これで


$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase " OU=ユーザー,DC=test,DC=local "
foreach ($user in $users) {
if($user -eq ''){
break
}
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
 Write-Host ('{0} : ' -f $user.Enabled) -NoNewline      ←★★ココ
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding 'utf8' -Append -FilePath $logPath
}

これで画面には出るようになりました。
出力するファイルにも出るようにするには、、、

306:297
20/06/04 11:06:18 TeZKrupD.net
>>305
$line = '"{0}",' -f $user.SamAccountName
の下に、
$line += '"{0}",' -f $user.Enabled
を追加してみてください。
あと、
if($user -eq ''){
break
}
は、対象のユーザ名をファイルから読み取っていたバージョン (>>279) の名残ですので、バッサリ削除しても良いですね。

まとめるとこうです。
URLリンク(pastebin.com)

念のため解説しておくと、$line は、最終的にファイルに書き込むことになる文字列を格納しています。
で、代入時に「=」ではなく「+=」を使ってますので、代入の都度「置き換え」ではなく「追記」になります(文字列の場合。数値の場合は加算)。

つまり、
$line += '"{0}",' -f $user.Enabled
を冗長な書き方に直すと、
$line = $line + ('"{0}",' -f $user.Enabled)
ということになります。

文字列の「-f」については以下を参照してください。
URLリンク(www.google.com)
オブジェクトのプロパティを指定したものを文字列に直接記述できないのでこうしています。
(こうは書けない $line += '"$user.Enabled",')

307:300
20/06/04 21:01:19.40 7LqTXEt1.net
>>306
解説までいただきましてありがとうございます!
ご提案のスクリプトで無事、第1段階のデータを出力することができました。
次の作業がまた待っていますが、教えていただいたことを参考に
作ってみます。
本当にありがとうございます。

308:デフォルトの名無しさん
20/06/04 22:31:22.80 sBE+PUel.net
powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?

309:デフォルトの名無しさん
20/06/04 22:43:28 7Yb6fwZR.net
自分で書いたバッチファイルを置き換えるのは効果的な学習だと思う
ただ対応するコマンドを置き換えていくだけだと
オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから
Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな

310:デフォルトの名無しさん
20/06/04 23:21:46.10 hC0MsN2x.net
Ruby の方がよい。
Ruby 内で、powershell, clip コマンドなども呼べる
# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる
str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換
ary = str.each_line.map( &:strip ) # 連続する空白類を除去する
IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end

311:デフォルトの名無しさん
20/06/05 01:16:33.38 amrr7gLk.net
URLリンク(heetnote.com)
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、
FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。
以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。
処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch