TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
懐かしのMS-DOSプログラミング ver.2
NullPointerExceptionを「ぬるぽ」と呼ぶスレ6
Gitをより良くするための運用ガイドライン作成スレ
簡単なプログラム言語って何?
オブジェクト指向ってクソかよPart5
【C++】マイナーGUIツールキット
初心者の俺が初めて覚えるプログラム言語
Android開発質問スレ
静的型付け言語の潜在開発生産性は今の100倍 ×5
プログラミング未経験→月4万

PowerShell -Part 4


1 :2020/01/01 〜 最終レス :2020/06/14
前スレ
PowerShell -Part 3
https://mevius.2ch.sc/test/read.cgi/tech/1539074808/

次スレは>>980が立ててね!!

2 :
すみません教えてください。テキストファイル内の当日の日付を検索したいんですが
patternに変数を使うにはどうすればいいんでしょうか?↓だと検索がヒットしません

$today = Get-Date -Format "yyyyMMdd"
Select-String -path c:\a.txt -pattern $today

3 :
怒らないで教えて欲しいんだが

WSLでよくね?

4 :
>>2
まずは
Select-String -path c:\a.txt -pattern '20200101'
で試したら?

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

7 :
>>3
怒らないで教えて欲しいんだが

PowerShellでよくね?

8 :
WSL なら、これでフォルダ内のすべてのファイルから検索できる。
grep -i '文字列' ./*

Windows 側のフォルダに、alias も貼っているから、カレントフォルダの移動も簡単

shopt -s expand_aliases

alias windoc='cd /mnt/c/Users/Owner/Documents'

9 :
コーディングとは直接関係ないのですが、
WMF をわざわざインストールせず、WindowsUpdate のみ適用し続けた Windows7 の場合、
Windows PowerShell のバージョンって 2.0 のままでしょうか?

試せる環境が手元に無くて…。ググっても分かりませんでした。
よろしくお願いします。

10 :
【 Select-String 】コマンドレット――ファイルからテキスト(文字列)を検索する
https://www.atmarkit.co.jp/ait/articles/1607/06/news028.html
grepコマンドとPowerShellのsls (Select-String)の比較
https://tech.sanwasystem.com/entry/2016/07/05/185717

11 :
>>5
>>8
やっぱりbashの方が優秀なんだな、、
Powershellてアホやろ

12 :
>>11
>>6

13 :
>>11
あほ

14 :
つまりbashを使ってるとあほになる
やっぱりPowerShellの方が優秀なんだな、、

15 :
poewrshellはcmd内蔵にはあったバイナリのコピーが簡単にできなかったり色々半端だよね

16 :
>>15
poewrshellはそうだろね

17 :
>>15
Copy-Itemじゃ駄目なの?

18 :
Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね
革新性面白さに主眼が置かれて運用をきっちりこなす為の地味な部分は蔑ろにされた

19 :
×cmdに置き換わっていた
○cmdを置き換えていた

20 :
>>18
具体的には?

21 :
PSでrobocopy使えば良いじゃん
これで置換出来るね

22 :
魚を下ろすなら出刃包丁、鉛筆を削るならカッターナイフ。一つだけに限定する必要はない。
スクリプティング環境も同じ。WSL でも PowerShell でも、適材適所で選べばいいだけだろ。

俺の場合は WSL ではなく Cygwin と PowerShel を併用してるけど。

23 :
>>22
パワー汁

24 :
>>18
robocopyレベルの機能が欲しいなら欲しい機能をPowerShellで実装すればいいだけだろ
出来合いのものが欲しい人が見るスレじゃないよ?

25 :
>>18
https://www.powershellgallery.com/packages/PowerShell.PowerLibrary.RoboCopyExtension/
https://www.powershellgallery.com/packages/RobocopyPS/
https://www.powershellgallery.com/packages/xRobocopy/

好きなのを使えや

26 :
漏れは、スクリプトを下のように、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 :
>>24
>>25
こういう暇人達のオモチャだから置き換わらないんだよ

28 :
>>26
あっ、Rubyはいいです(^^ゞ
もう終わった言語なんで

PythonかJavaScriptでお願いします

29 :
>>27
お前の理屈だとPerlのCPANやPythonのPyPIも「暇人達のオモチャ」だなww

30 :
PowershellはWPFと同様に
こんなことできちゃう俺ってすごい?
って承認要求を満たす為のツール

31 :
こんな低い程度で承認欲求満たせるなんて
さぞかし安っぽく薄っぺらな人生を歩んで来たんだろうね
君のような知恵遅れクンが羨ましい限りだよ

32 :
>>31
涙ふけよw

33 :
>>18
>Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね

見当違いだよ
あんたがrobocopy相当でないことに不満を持っているのは分かったが、世の中が同じ不満を持っていると勝手に決めつけてもしょうがない
自己と他者の境界を混同する癖があると生き辛さの原因になるぞ

Powershellもcmdもシェルなんだから、どっちからでもrobocopyを呼べばいい
変な固執がなければそれで解決

そもそもPowershellが完璧に作り込まれていたとしてもcmdは置き換わってない
長年のデファクトスタンダードとして居座ったシェルスクリプトを書き直す人はほとんどいないし、そこで覚えた知識を必要に迫られてもいないのにアップデートする人もいない
Powershellへの移行は強制されない限り極めて緩慢にしか進まないんだ

34 :
>>30
いや普通にぱぱっと学んで普通に道具として使うだろ
どんだけ頭わるいのかコンプレックス丸出し

35 :
PowerShell使いよりUNIXシェル使いのほうが凄い
同じコマンドなのに仕様が全然違うのを我慢できるんだぜww

36 :
ごめんな
シェルを使うのに凄いとか凄くないとかちょっと俺には理解できない
チンパンジーが箸を使うとすごいとかそういうレベルの話なのかな

37 :
>>33
そもそもcmd(MS-dos)もPowerShellも今日日いらんがな
WSL入れとけって

38 :
WSLは手間が掛かりすぎてNG
・「入れとけ」というが、ユーザー毎にいちいち手動で入れさせる手間が掛かる。しかも厄介なストア配布形態
・一番使いたいはずのログインスクリプト等に使えない
全く話にならない

39 :
過去の遺産があるならWSLでもいいけど、どちらでも使えて新規で組むならPowerShellだな

40 :
>>35
UNIXって瀕死だろ

41 :
>>40
bashかパワーシェル(爆笑)で比較しませんか、ドザさんwww

42 :
今日日こんなのでマウント取ろうとする化石がいるとは
もう令和だぞおっさん

43 :
えっ、この幼稚さはガキなんじゃねーの?おっさんだとしたらヤバいな

44 :
今時のガキでbash推しとかありえへんやろw

45 :
>>44
あなたノンプログラマの人?w

46 :
何を言ってるんだろう、この人

47 :
前提条件(要件)の提示もなく優劣を論じちゃうのって、典型的な「自称パワーユーザ」だな

48 :
bashの初見殺しっぷりがハンパない件
https://qiita.com/kugyu10/items/5c852e5c1b0f8c98da01

49 :
>>48
おバカ自慢は要りません

50 :
いろいろな *[!c]sh 実装のキライなところ
https://fumiyas.github.io/2016/12/25/dislike.sh-advent-calendar.html
まだBashで消耗してるの?
https://www.slideshare.net/SanosukeKato/bash-83053839

51 :
>>50
おバカ自慢要らない

52 :
その「おバカ」とやらに使ってもらおうって気がないから
いつまでたってもLinuxデスクトップは普及しないんだよ

53 :
Linuxデスクトップ「おバカには使ってほしくありません」

54 :
それはシェアをあきらめるって事だと分かってて言うならそれでもいいんだけどね

55 :
スレチ続けてんじゃねえぞ、糞ども

56 :
>>48
存分に威張って良いほどの馬鹿

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

58 :
>>57
> 読んだけど2年前のスライド&スライド発表者が馬鹿過ぎる。
> 現在のTwitterアカウントを見たけど「進歩がない…」の一言。

スレチな話題を延々と繰り返すバカよりは256倍マシだと思うよ

59 :
>>57
> 嫌いなとこ言うだけってのは馬鹿
> 生きてて楽しいのかこいつ…

ここでPowerShell叩きだけやってるやつそのものじゃん

60 :
ところでWSLを入れて
Windows10の制御はどういう風にやるんだろ?

61 :
そもそもUNIXからの流れって
スクリプトがないと何もできなかった
というだけだよね。

62 :
dosはスクリプトなしで運用できたん?

63 :
>>62
たいして設定項目ないからcomfig.sysとかを直接編集してただろ
ちなみに同時期のunixも似たようなもんだった
スクリプトで設定するようになったのはだいぶ後だったように思う

64 :
>>63
> だいぶ後だったように思う

80年代からマイコンを使ってた世代からすれば、確かに「だいぶ後」ですねw

65 :
Windows10, WSL, Ubuntu(Linux)側から、

Wondows側のC ドライブへのアクセスは、
/mnt/c/Users/ユーザー名/Documents/〜

漏れは、いつも、WSL側から、Windows側をgrep してる。
なぜなら、Windowsでは、CP932 と、BOM 無しUTF-8 を区別できないから

BOMが付いていれば区別できるけど、
普通、ウェブ系開発ではバグるので、BOMを付けない

66 :
>>65
Rクズ

67 :
Lnuxユーザは大変やね
Winodowsユーザは、そんな面倒なことはしないわな
それなりのツールつかうから

68 :
要はLinuxなどの場合は、近頃はいいだろうが
そういうことのためのツールが用意されていないんで
スクリプトに頼るしかなかったということなんだろうな

69 :


70 :
設定ファイルがスクリプトということに何も疑問を持たなかったんだろかと思うことはある。

71 :
知らんがな
linux板でやれよ
Linux
http://mao.2ch.sc/linux/

72 :
Linux板は荒らししかいないし、末期のウェブ板やPHP板みたいになってる。
まともな住人はここに移住してきても良いよね?
ウェブ板やPHP板も移住してるんだし。

73 :
Linux板は志賀何とかさんのことを語る板になってしまった。

74 :
まさかとは思うがツールというのはGUIのことだろうか
PowerShellスレでCUIよりもGUIが無条件に優れているという話をしているのだろうか

スレチを自己正当化する理由が、然るべきスレが機能不全を起こしてるから行きたくないと?
しつこいスレチがここに機能不全を招くとは思わないのだろうか

前スレに続いての「WSLでよくね」なんて明らかに反応を楽しむ愉快犯なのに、まんまとLinuxのほうが残念だもん!って
いいかげん落ち着いてくれよ

75 :
>>72
お前はスレタイを100回読み直せ

76 :
bash最高って書いてあるけど。

77 :
>>74
>まさかとは思うがツールというのはGUIのことだろうか

なわけないよ。
要は今は良くなってきているが
シェル言語なないと処理できないようなのがUnix系の世界
だったということ
ほかにろくなものないから

78 :
ま、そりゃいいか。
PowerShellを語る板だから
ごめん。
PowerShellの話に戻します。

79 :
意味不明。結局、CUIでない、GUIでもない"ツール"とはいったい何だったのか

80 :
テキストユーザインタフェース
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%A6%E3%83%BC%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9

81 :
刻々と変化する変数をフォームに表示させたいんだけど
当然この例だと実行した時点での変数しか表示されません。
フォームのラベルの変数を動的に表示し続ける方法を教えてください(この例だと時計のように動かしたい)
$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 :
タイマーイベントとかあるじゃろ
C#タイマーあたりでぐぐれ

83 :
正確な時間じゃなくても良いなら、Ruby なら、sleep で簡単にできる。
ただし、OS がバッファリングしてると、最後にまとめて出力されてしまう!

STDOUT.sync = true # バッファリングしない

3.times do
puts Time.now
sleep 3
end

84 :
フォーム要素はどこに行った

85 :
>>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 :
>>85
すげー一気に解決したわ
Runspaceとか知らんよありがと

87 :
v6.2.4
https://github.com/PowerShell/PowerShell/releases/tag/v6.2.4

88 :
PowerShel で凝ったことやろうとすると、どうしても C# の知識が必要になるよな。
おかげで、C# を勉強する良いきっかけになったわ。スキルの幅が広がるのは嬉しい。

89 :
C#スキル?
.net frameworkの知識じゃなくて?

90 :
C#全く使えん奴は凝ったことすら思いつかないのでは

91 :
$label = [Label]@{ Dock = "Fill"; Font = "Meiryo,20" }
という式を初めて見て驚いてるんだけど、これについてのドキュメントってどこかにありますか?

92 :
>>91
PowerShell 3からの機能
クラスが引数を取らないコンストラクタを持っていて、プロパティがパブリックでset可能なら使える
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-7#creating-objects-from-hash-tables

93 :
>>92
ありがとう
だいぶ楽になった
こういうの知ってる人ってMSDNのヘルプに全部目を通してるの?

94 :
オブジェクト志向ライクでいいんだけど、
powershellへbatやVBSから置き換えようとすると機能によってはバージョンチェックをしないといけないのがもどかしい
.NETにしろそうなんだけどね

95 :
ご教示ください。
商品の価格を定期的にWebサイトから取得したいのですが、Invoke-WebRequestで取得したHtmlWebResponseObjectから要素の内の文字列を取り出そうとすると「Windows セキュリティの警告」のポップアップが表示されてしまいます。
ポップアップを出さずに要素の内の文字列を取得するにはどうすればよいでしょうか?

$response = Invoke-WebRequest -uri "https://www.yodobashi.com/product/100000001002955686/"
$price = $response.ParsedHtml.getElementById("js_scl_unitPrice").innerText

これを実行すると「この Web サイトから個人用の情報を提供できるように、Cookie と呼ばれる小さなファイルをこのコンピューターに配置できるようにしますか?」と表示されます。

96 :
なんでPSで?・・・

97 :
cookie powershellでぐぐればやり方は出てくる
javascriptとか出てきたら素直にseleniumを使う
seleniumをpowershellで使う方法もある

98 :
DateTimePickerで翌日の日付をデフォルト選択する方法ありませんか?

99 :
[DateTimePicker]@{ Value = [datetime]::Now.AddDays(1) }

100 :
>>99
できましたサンクス!

101 :
同スクリプト重複実行抑止する場合
皆さんどうしてますか?
pid書き出し?Mutex?

102 :
mutex

103 :
コールバック関数ってpowershellで可能ですか?

104 :
可能ですよ

105 :
どうやるのですか?

106 :
スクリプトブロックを渡すか、関数なら
$function:関数名
で渡す
実行は & でやるのが基本で他にもいろいろ方法がある

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

108 :
103です。
実はコールバック関数が何かもよく理解してませんが、
以下URL先の
$sslStream = New-Object System.Net.Security.SslStream($stream,$false,({$True} -as [Net.Security.RemoteCertificateValidationCallback]))
の第三引数がコールバック関数でしょうか?
このやり方を理解したくて。
https://stackoverflow.com/questions/19252963/powershell-ssl-socket-client

109 :
コールバックはこの説明が分かりやすい
https://wa3.i-3-i.info/word12295.html

Powershellだと「スクリプトブロック」というコードを { } で括った物がコールバック関数として使える
引数として直接書いてもいいし、一度変数に代入して変数を引数に渡してもいい
{$True} という部分がそれ

でも今回は「スクリプトブロック」じゃなくて「RemoteCertificateValidationCallback」でと指定されている
三つ目のコンストラクタの引数の型に注目
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.security.sslstream?view=netframework-4.8#constructors

なので -as 演算子で型変換をしてる

110 :
とりあえず、引数がご飯で戻り値がウンコと言う事だけはわかった。

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

112 :
>>111
ありがとうございます。

モーダルがどうのこうのというよりも、
Showコマンドだとクリックなどの命令を受け付けないという感じでしょうか

113 :
>>109
103です。ありがとうございます。なんとなくわかったような気がしますが、自分には.netクラスライブラリのリファレンスマニュアル読めるほどのオブジェクト指向プログラムの知識が足りてないようです。

powershellでちょっと小難しい事しようと思うといつもこの壁にぶち当たります。

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

115 :
>>114
ありがとうございます
スッキリしました
よくC#でShowDialogで表示した時はDisposeを呼ばないとダメと言いますが、
これもイベントループを作るのか作らないかの差なのでしょうか
また、PowerShellでもDisposeした方がいいのでしょうか

116 :
Announcing PowerShell 7.0
https://devblogs.microsoft.com/powershell/announcing-powershell-7-0/
Today, we’re happy to announce the Generally Available (GA) release of PowerShell 7.0!

117 :
インストーラで出てくるスパイダーマンのパチモンみたいなの何なの

118 :
Overwatchのソンブラにそっくりだけどパクったのか?

119 :
https://blog.shibata.tech/entry/2017/10/14/153510
このキャラクターはあまり認知度は高くないと思いますがPowerShell公式のキャラクターです。
名前はそのまま PowerShell の様です。(よくある言語の擬人化なのでしょう)
中の人からはPowerShell HeroやPosh-Chan*2と呼ばれている様です。
いまではPowerShell TeamのTwitterアイコンにも採用されています。

120 :
>>116
キタ━━━━(゚∀゚)━━━━!!

121 :
PowerShellの本増えないかなー
日本でももう少し流行ってほしい

122 :
>>121
Windows が関係するインフラ系の管理ではデファクトだと思ってたけど違うんかい?

自分はインフラ系の仕事が多いんだけど、MS 製品は言うに及ばず、
VMware、AWS、HPE の設定とか構築で使うためのモジュールが用意されてるんで、
そっち系の人は全員使ってるのかと思ってた。

今関わってる案件だと客先で用意された作業用 PC でも PowerCLI は
入れさせてもらえるんで、VMware の構築&設定が超絶はかどってすごく助かってる。

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

124 :
>>123
確かに、RPA 的な用途にも使えるわね。
そう言われてみれば、IT プロ向けの PowerShell の資料は山ほどあるけど、
エンドユーザの業務効率化に的を絞った資料ってあまり聞かないね。
エンドユーザが手作業でやってる定型業務を PowerShell +αで
自動化/半自動化する事例を紹介する資料を作れば需要ありそう。

125 :
Windows以外でもGridViewが使える

A new kind of GridView right in your console: Introducing the early preview of ConsoleGuiTools
https://devblogs.microsoft.com/powershell/introducing-consoleguitools-preview/

126 :
パワーシェルでテキストファイルを一行ずつ読み取って環境変数化するのはどうやるんでしょうか?

バッチファイルだと簡単にできるのにパワーシェルだと難しい
イメージ的にはこんなことをパワーシェルでやりたいです
for /f %%a “usebackq” in (./testfile.txt) do (
set testenv=%%a
echo !testenv!
)

127 :
こーゆー感じのことやりたいのか?
cat .\testfile.txt | %{ $env:testenv = $_; $env:testenv }

128 :
>>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 :
>>128
上の方の感じでできました!ありがとうございます

グローバルな環境変数とはなんですか?

130 :
あ、システム環境変数のことですか
シェルスクリプト内の一時環境変数?で良いのです

131 :
javawみたいな感じで、スクリプト実行時にコマンドプロンプトを出さない方法はありませんか?1ファイルで。
ショートカットやvbs等の2ファイル使う方法なら解ってます。

132 :
まだ開発中

WIP: Add pwshw for console-less PowerShell on Windows
https://github.com/PowerShell/PowerShell/pull/10962

133 :
↑そのpwshwが取り込まれるまでは、↓を自前でビルドして自作pwshwなり、powershellwなりを作ることもできるよ
https://github.com/SeidChr/RunHiddenConsole
ビルドしてできたhiddenw.exeをリネームして使うだけ

134 :
>>131
1,まず、.ps1 で動作するスクリプトを作る
2,1を BASE64 でエンコード
3,powershell.exe にオプション -EncodedCommand と 2をつないで実行
4,3を .cmd (.bat) に書く

詳細は「powershell EncodedCommand」みたいな感じでググればいいでしょう。

135 :
>>131
すまん、コマンドプロンプトを出さずに、か。勘違いしてました。
>>134 は取り下げます。

136 :
exe化するやつにそんなオプションがあったと思う

137 :
Windows PowerShell in Action、900ページあるけど面白かった
次はPowerShell fo Sysadmins読もうかな

138 :
python.exe / pythonw.exe や ruby.exe / rubyw.exe の違いでよく悩むのでまとめておく

https://blog.shibayan.jp/entry/20141221/1419171414

139 :
>>133
さいこー。ありがとう

140 :
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}]}}}'
https://photoslibrary.googleapis.com/v1/mediaItems:search
これだと取得出来るんだけど
powershellで
$header = @{"Authorization" = "Bearer "};
$body = '{"filters":{"dateFilter": {"dates":[{"year":2019,"month":11,"day":15}]}}}';
Invoke-RestMethod -Uri https://photoslibrary.googleapis.com/v1/mediaItems:search
-Method Post -Headers $header -Body $body ;
(400) 要求が不適切ですでエラーになる
たぶんbodyの入れ方が悪いだと思うんだけど
アルバムIDの絞り込みだったら
$body=@{
"albumId"="id"
}
で取得出来た

141 :
-ContentType "application/json" を付けるか
もしくは全部ヘッダに入れる
$accessToken = "your access token"
$uri = "https://photoslibrary.googleapis.com/v1/mediaItems:search"
$response = Invoke-RestMethod $uri -Method Post -Headers @{
  Authorization = "Bearer $accessToken"
  Filters = @{
    DateFilter = @{
      Dates = @{ Year = 2016; Month = 3; Day = 1 }
    }
  }
}

142 :
ごめんやっぱ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 :
>>141
>>142
なるほど、curlの"Content-type: application/json"の部分を指定してやらんといかんかったのか。
そしてちょっとあきらめてた連想配列も提示してもらっちゃって
超ありがとうございました。
ばっちり動いたっす

144 :
PowerShell 7.0 の新機能
https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-70

145 :
VSCode の拡張機能、REST Client が簡単!
POST http://localhost:8888/abc HTTP/1.1
content-type: application/json
{
"name": "abc",
"time": "時刻"
}

146 :
>>144
・パイプラインの並列化 (ForEach-Object -Parallel を使用)
これいいな

147 :
Windows PowerShell in Actionの改3版、日本語訳してくれないかなぁ…

148 :
パイプラインを繋げる先を条件で分岐って可能ですか?
イメージとしては

Get-Nantoka |
Switch ($_.Name)
Case ('A') | Get-NantokaA
Case ('B') | Get-NantokaB
Case ('C') | Get-NantokaC

な感じです

149 :
さすがにそんなシンタックスはないが同じような動作はできる
$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 :
結局処理を別々に書かなきゃいけないなら書いてる通りswitch文でいいんじゃねって気はする

151 :
switch文だと毎回新規にGetNantokaAとかが呼ばれてしまうため例えばGetNantokaAがMeasure-Objectだと意味がなくなる

152 :
>>149
ありがとうございます
やっぱり分岐先を埋めたオブジェクトや関数を作らなきゃいけない感じですね

いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな

153 :
>>152
> いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな
同じルーチンが複数同時に走るってことだとと思う
排他制御とか順序の保証とかがどうなってるのかが気になる

154 :
>>153
オブジェクトをパイプライン上に並列で走らせるって事?
非同期通信的な・・・

155 :
>>151
あーそれでわざわざGetSteppablePipeline使ってるのね

156 :
>>149が何やってるのかサッパリ
GetSteppablePipelineでぐぐっても日本人はほとんど存在士らないのかなって具合

157 :
ScriptBlock.GetSteppablePipeline Method
https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.scriptblock.getsteppablepipeline

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

159 :
.ForEachはメソッド形式のForeach-Objectで、要するにC#のLINQをPowerShell風にアレンジした何か
どっちかというと.ForEach({ ..... }) みたいにスクリプトブロックを渡す使い方が主流だと思うけど、メソッド名を文字列で渡してオブジェクトのメソッドを呼び出すこともできる
ステッパブルパイプラインは任意のパイプライン(文)をメソッド形式で呼び出せるようにするための何か
渡された引数を先頭のコマンドにパイプして実行させることができる

160 :
powershellで2つのファイルの差分のみを抜き出して追加や削除されたものは別ファイルに出力したいです
例えば

fileA.txt
aaa
uuu
iii

fileB.txt
iii
uuu
eee

とあった場合にfileBをマスタとしてaaaの文字列をdelete.txtにeeeの文字列をadd.txt出力したいです。
やり方教えてください!

161 :
素人ですまんけど、
$test0 = "a", "b", "c"
$test1 = $test0[1]
こういった時に、$test0のbを同時に削除する書き方はありますか?別途処理を書く必要あり?

162 :
>>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 :
>>161
bを削除という条件なら
$test0 = "a", "b", "c"
$test1 = ($test0 -ne "b")[1]
-ne演算子は左オペランドがコレクションの場合、差分を返す

164 :
-ne演算子の場合は大小比較をしないので注意
もし比較する場合は>>162のように-notin演算子とWhere関数でフィルタする

165 :
>>162
ありがとうございます
Mergeって関数の中で処理している感じですね
詳細な処理の内容は理解していないので調べつつやってみます!

166 :
scoop の魅力

167 :
> $a = try{get-content data.txt}catch{@()}
> $a = if(3 -ne 4){11}else{22}
ダメ元で試してみたらこんな書き方出来たのかよ

168 :
うん、だから三項演算子入れないでほしかった
なんでわざわざ評判微妙な記法を取り入れたんだろ

169 :
三項演算子は俺の大好物

170 :
C#8.0のswitch式見ててあれってなったけど、そういえば右辺に文を持ってこれるのってPowerShellくらいなんだっけ

171 :
goto を禁止して
今度は if then else を禁止しようってか?

172 :
# RSSの内容を取得
$url="https://rss.itmedia.co.jp/rss/2.0/ait.xml"
$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 :
>>172
$rss.rss.channel.item で一覧表示される(もちろんGridViewで見てもよい)けど、そういうことではなくて?

174 :
>>172
JSONとXMLじゃ表現できる範囲が違うから「正確に」と言うなら$rss.OuterXmlとかで見るしかないと思うよ
インデントとか付けて見易くしたいならXmlWriter使って整形すればいい
https://imihito.hatenablog.jp/entry/2018/01/20/225513

175 :
ISEからVSCodeに変えてデバッグ&インスペクトしたら大体望み通りの表示が得られました
https://i.imgur.com/HRVgQP3.png

[xml]な$rssも細部まで階層表示が出来ました
余計なプロパティがあまりにもごちゃごちゃしていて目視で$rssの把握は無理気味でしたが…

ありがとうございました

176 :
VSCode に、XML のお勧め拡張機能はないの?

177 :
>>176
スレタイ1024回読み直せ

178 :
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 :
pushd popd

180 :
. "$PSScriptRoot\class1.ps1"

と絶対パスでやるのが一般的
カレントディレクトリの移動はやらんほうがいい

181 :
なる程その手があったか
どうもありがとう

182 :
連想配列をカンマ区切りに置換してファイル出力する方法教えてください
配列の場合はわかるんですが連想配列の場合がわかりません

@{id=001;name=hoge}

みたいなやつを↓

001,hoge

みたいな感じにしたいんです

183 :
@{id="001";name="hoge"}.Values -join ","

184 :
>>183
なるほど!!

185 :
powershellのエラー発生時のログ出力って皆さんどうやってますか?
単純にpowershellの画面上に出力されてるエラーをログに吐き出したいだけなのですがイマイチやり方が分かりません!

186 :
$error

187 :
シフト右クリックからpowershellウインドウをここで開くでウインドウ立ち上げた時にアクティブな状態で立ち上がらないから一回クリックしたりして選択し直さないかんのが地味にストレス

188 :
>>187
おま環

189 :
シフト右クリックするとメニューが出る
このとき先にシフトを離してから開く操作をするといい
シフトを押した状態でアプリを起動すると非アクティブで開くのはWindowsの昔からの機能

190 :
Windows95の頃からこの機能は変わっていないと思う

191 :
>>187
シフト押さないで出すようにしたら?
http://suyamasoft.blue.coocan.jp/Windows/Windows10/PowerShell/index.html

192 :
なるほど、勉強になった
ありがとう

193 :
>>137
結構古い本だけど今でも読み応えある感じですか?

194 :
日本語に翻訳された初版じゃなくて第3版でしょ
Windows PowerShell in Action, Third Edition
https://www.manning.com/books/windows-powershell-in-action-third-edition

195 :
メンバを呼ぶ.(ドット)の演算子を逆参照演算子と呼ぶらしいんだけど、どこら辺が逆なんだろう

196 :
Cとかでは * で値を得ることをdereferenceということがあるよ。

197 :
逆参照演算子もdereferenceの直訳っぽいね
参照の反対の行動という意味で逆なのかな

198 :
参照先のオブジェクト実体を見る、参照じゃなくなるからdereference(逆参照)

199 :
普通、参照外しって訳すけどな。「逆」じゃ意味が通じない。

200 :
Powershellに逆参照演算子なんてないでしょ
ドットはMember access operatorとDot sourcing operatorの二種類のはず
ほかの言語との混同があるのでは
C言語の & と * を参照演算子、逆参照演算子と訳すなら分かるし、-> を逆参照演算子と呼ぶのもまあ分かる

201 :
日本語版Windows PowerShell in Actionにそう書いてあった気がするんだが、
確かにMSDN見るとMember access operatorだ

202 :
vscode上だと高度な関数のbeginブロックで定義した変数が、
processブロック中で使ってるにも関わらず未参照の警告が出るんだけど良い解決方法ないでしょうか
未参照確認自体は便利なので黙らせたくはないです

203 :
>>199
逆参照と訳す人が現実にいるんだから仕方がない
https://www.google.com/search?q=dereference+%E9%80%86%E5%8F%82%E7%85%A7

204 :
>>200-201
古い about_Operators には property dereferences operator とあるので、改名されたのかも。
https://docs.microsoft.com/en-us/previous-versions/powershell/module/microsoft.powershell.core/about/about_operators

205 :
https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847732(v=wps.640)
. プロパティ逆参照演算子
オブジェクトのプロパティとメソッドにアクセスします。
$myProcess.peakWorkingSet
(get-process PowerShell).kill()

206 :
一般的には
参照 アドレスを取り出す
逆参照 アドレスに入っている値を取り出す
だけど値を取り出すことを「逆」と訳した経緯がわからん

207 :
変な翻訳だな
値参照でいい

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

209 :
いずれにしてもPowershellでdereferenceなんて概念を持ち込む必要がないからメンバアクセス演算子って名前に改善されたんでしょう

210 :
C系は逆参照じゃないの
むしろ参照外しのほうがわからんかったが

211 :
どっちがデファクトスタンダードかって話とどっちが正しいかって話は別だから
確信犯とか姑息みたいに誤用の方が普及して定義が揺らいでる言葉はいろいろあるけどどう使うかは話者次第

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

213 :
Powershell好きだけどファイル名の [ ] の扱いは失策だと思う

214 :
?や*すらファイル名に使えるUNIXの世界へようこそ!

215 :
>>213
やっぱりそうですよね・・・
比較演算子も、-matchで[ ]があるとエラーになって困りました
これもいろいろ調べてようやく-match [regex]::escape() にすれば良いと分かりましたが・・・
PowerShellって参考書もあまりなくて古いし、ネットの情報もあまりなくてなかなか学習が進みません・・・
そもそもPowerShell ISEのヘルプで -pathは「ワイルドカード文字を許可する false」って嘘書いてあるのが・・・

216 :
ファイル名はともかくmatch が正規表現で比較ってのは割と知られているような気もするけど

217 :
対になるlike演算子があるからなんとなくわかる
ところでreplaceの正規表現じゃない版が欲しい・・・

218 :
たしかに-matchの話に限っては単なる勘違いだな
match(一致)と言われて部分一致だと思うかといえば、普通はpattern matchでしょう
参考にしたサイトが悪かったのかもしれない
正規表現を使わないなら "a[b]c".Contains("[b]") でいい

219 :
>>217
上のレスで気付いたかもしれないけど
"a[b]c".Replace("[b]", "[d]") で置換できるよ

220 :
なるほどね
そういや -replace [regex]::escape()でもOKか

221 :
>>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 :
パスの角括弧の扱いはpsの一番いけてないとこだからね
角括弧のみをエスケープする場合は次のようにする

move "C:\test\$hoge.*".Replace('[', '``[') "C:\test2"

もしくは-Filterパラメータが角括弧をワイルドカード扱いしないことを利用して

move "C:\test\*" "C:\test2" -Filter "$hoge.*"

223 :
>>222
なるほど。 [  だけエスケープすれば大丈夫なんですね

ようやく引っかかってた所から脱出できそうです
皆さん大変ありがとうございました

224 :
これってクラス多めのオブジェクト指向でやるべきなのか、
高度な関数多めのパイプライン志向(?)でやるべきなのか、
どっちがいいのかな

225 :
オブジェクト使い回す設計のほうが読みやすそうならそうする

高度な関数ってどんなんやねん

226 :
高度な関数ってずいぶん懐かしい単語だな、普通に関数でいいと思うよ
全ては無理に和訳しようとしたMSが悪い

227 :
>>224
本来のシェル的な使い方がメインなら
関数でパイプライン多用した方が使いやすい
普通のアプリに近いものを作る場合には
クラスでOOPした方が使いやすい

228 :
PSのクラスって判らんからコード量増えたらC#埋め込むわ

229 :
PSのクラスって機能が足りないとかはあるけど特に難しい所はないと思うが…

230 :
教えてください。
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 :
Select-Object name で name プロパティしか抽出できてないとか?

232 :
>>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 :
GetNewClosureで作ったクロージャからトップレベルに定義した関数にアクセスできんのだがスコープどうなってんだ?
function Hoge () {}
{ Hoge }.Invoke() #うごく
{ Hoge }.GetNewClosure().Invoke() #うごかん

234 :
またキチガイが湧いてきたか
NG しやすいように、コテハン付けて欲しいわ

235 :
>>233
トップレベルと呼んでいるのは、(仮に) Hoge.ps1 の Script スコープでいいよね?

PowerShell のクロージャは、動的モジュールにバインドされたスクリプトブロック。
モジュールの Script スコープは、常に Global スコープの直接の子なので、
クロージャの Local スコープは、Hoge.ps1 の Script スコープの子孫にならない。

スコープの親子関係:
[Global] - [Script(Hoge.ps1)] <== Hoge 関数の定義されているスコープ
[Global] - [Script(動的モジュール)] - [Local] <== 問題のクロージャ内のスコープ

236 :
Ruby で作った!

237 :
>>235
なるほど
PowerShellって便利で面白いけど時々変な癖あるよな

238 :
Closures in PowerShell
https://devblogs.microsoft.com/scripting/closures-in-powershell/
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 :
v6.2.5
https://github.com/PowerShell/PowerShell/releases/tag/v6.2.5
v7.0.1
https://github.com/PowerShell/PowerShell/releases/tag/v7.0.1

240 :
昔ながらのPowerShellとPowerShell Coreって共存できんの?
PowerShell CoreってクロスプラットフォームだけどWindowsの管理コマンドとか旧PowerShell資産とかとどれぐらい互換性あるのかな

241 :
>>240
共存できる。Core をインストールしても、PowerShell 5.1 を置き換えない。
インストールされるパスが違うし、そもそも実行ファイルのファイル名も違うので。

242 :
Windows PowerShell 5.1 から PowerShell 7 への移行
https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7

243 :
むしろCore版を上書きしてほしんだが
Powershellで検索すると大量に出てきてうざいし、
Win+Xのショートカットから起動したいし

244 :
逆、Core版で、ね

245 :
>>243
タスクバーにピン留めでは駄目なの?

246 :
C#クラスFooをAdd-Typeして
Fooを継承するpowershell class Barを定義しようとするとVSCodeの静的解析に型Fooが無いって言われる
実行時には問題なく動作するんだけど鬱陶しい
どうにかならんのかこれ

247 :
>>246
現状では継承クラスを別ファイルにして読み込み元で先にadd-typeしてから遅延読み込みするしかない
core系統ではusing assemblyの実装が保留されてるから
将来的にはおそらくそこをクリアしたusing assemblyが実装されると思うけど
>実行時には問題なく動作するんだけど
それはどこかしらで自分で先にadd-typeしてるからだと思う。そうじゃないとエラーで止まる
今の段階で最善と思われる方法はマニフェストモジュールにして
psd1内でRequiredAssembliesに継承元のアセンブリを設定すること
それをusing moduleで読み込むようにすれば最も自然に使える

248 :
>>246
ごめんよく読んだら的外れなレスだったわ
C#のコードをadd-typeするってことね
.NETのクラスを継承すると勘違いした

249 :
Suppressing Rules
https://github.com/PowerShell/PSScriptAnalyzer#introduction

250 :
urlおかしかったからやり直し
https://github.com/PowerShell/PSScriptAnalyzer#suppressing-rules

251 :
教えてください。Windows10です。
クリップボードに次の文字をコピーします。
Get-ChildItem -Path "c:\doc★"
これをPowershellに貼り付けると、勝手に★が削除されて
Get-ChildItem -Path "c:\doc"
になってしまいます。正常に貼り付けるには、
どのようにすればよろしいでしょうか?

252 :
Powershellコンソールのバグらしいよ

253 :
そうですか。バグなのですか。ありがとうございました。

254 :
コンソールじゃなくてPSReadLineのバグでしょ
Remove-Module PSReadLine を実行した後なら普通に貼り付けできる

255 :
>>251
知らんかった、こんなバグが有ったのか。ウチの環境でも再現した。

echo '★★★★'
echo '☆☆☆☆'

これを貼り付けると、

echo ''
echo ''

こうなったわ。

256 :
>>254
ホントだ、治った

257 :
なん…だと…

258 :
スクリプトならok?

259 :
スクリプトならOKだよ
画面を色分けする処理がバグってたはず

260 :
echo 'yatta-man★ko-hi-★raita-'
いやー、もう少しで社会的に抹殺されるところだったよ

261 :
htmlのdiffでまともな方法ない?

262 :
Get-ADPrincipalGroupMembership -identity testuser1 | Select-Object name | ・・・

というshellを2つ続けて流すと、ログファイルに記載されたとき、
1つ目のshellの結果と2つ目のshellの結果に3行の空白が生まれます。

なぜでしょうか・・・?

263 :
>>262
shell ってどういう意味ですか?

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

265 :
>>263
すみません。
PowerShellスクリプト、です。

266 :
ログファイルはフィルターして見るから、どうでも良くね?

サーバー運用部門しか見ないし。
一般社員が見ないだろ

数年保存して捨てるだけの、ログファイルの書式にこだわっても、仕方ない

267 :
なぜそうなるかを知りたいってことだろ
>>262がどういうスクリプトを流してるのかさっぱり要領を得ないから原因は全くわからんけど

268 :
>>265
(1)1回目と2回目は、パラメータが違うのですか?それとも、全く同じ内容で実行のタイミングが違うだけですか?
(2)何度も尋ねるのは煩雑なので、可能であれば端折らずに記述内容を全て記載してもらえませんか?

269 :
まあでも、センスは出るよね

270 :
>>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 :
たぶん、1つ目のアプリが、3行の改行コードを出力してるからだろ

例えば、HTML みたいに、データ内の区切りに、CR・LF の改行コードを使っているものもある。
それらを出力すると、空行ができる

それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか

272 :
>>262 > というshellを2つ続けて流すと
>>270 > 以下二つを、同時に流しました。
相手を混乱させて遊んでるっていう理解でいい?

273 :
>>271
 バグですか・・・
 必要なデータは取得できているんですが、
 その下に不必要な空行が発生するのは、もう、仕方ないんですかね・・・

>>272
 混乱させるつもりはなかったのですが、
 >>270のスクリプトは、エクセルで作成をしました。
 (A1に1つ目のスクリプト、A2に2つ目のスクリプト・・・という感じです)
 作成したスクリプトの全てをコピーし、PowerShellに貼り付ける、
 という作業をしました。

274 :
そもそも Get-ADPrincipalGroupMembership が何個の要素をパイプラインに流してるか見てみたら?

275 :
>>270
ユーザが所属しているグループをファイルに吐きたいわけですよね。
1ユーザごとに1ファイル、グループは横に並べて出力、という条件は必須ですか?

276 :
>>273
力技だけど、これでどうですかね。うちの環境ではうまく行ってます。
(Get-ADPrincipalGroupMembership -identity testuser111 ).name | %{"$_`t"| Out-File -NoNewline -Encoding ascii -Append -FilePath "C:\a.txt"}

277 :
>>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 :
>>276
 -NoNewline でエラーになります・・・
 Out-FileのパラメーターとしてNoNewLineというものが無いと表示されます。
 276さんはうまくいったとのことなので、
 環境が違うのでしょうか・・・?

279 :
>>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 :
>>279
 ありがとうございます。
 すでに私に理解できる範囲を超えているのですが、、、
 データを取得したい対象ユーザーは”特定のコンテナ内”です。
 その場合であれば、どこを変更するようになるでしょうか?
 すみません。ご教示ください。

281 :
>>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 :
>>280
追伸。まず、
Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
だけ実行して希望通りのユーザオブジェクトが出力されることを確認してください。
"OU=Newusers,DC=example,DC=local"の記述方法がキモになりますが、
よくわからない場合は「distinguished name」でググってください。

283 :
>>281
>>282
 本当にありがとうございます!
 今は検証環境に繋げないので、明日、試してみます!
 また結果を明日の夜します!

284 :
ふーむcsvde使った方が楽そうだな

285 :
PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある

286 :
結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど

287 :
>>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ

288 :
余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?

289 :
>>288
会社によるだろう、としか

290 :
合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない

291 :
ちなみにレジストリをいじるのは認められているの?

292 :
うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。

293 :
管理者権限アカウントの申請は必要てのはあるよね

294 :
部のPC担当じゃなければせいぜいパワーユーザーだと思うけど

295 :
>>281
報告が遅くなりました・・・。
検証環境で実行した結果、
A列にログオンID、B列に所属するグループ1、が表示されました。
ここまではかなりいい感じだったのですが、
所属するグループの2つ目以降が出力できませんでした・・・。
2つ目以降を出力できるよう考えてみましたが、
取ってつけた知識では太刀打ちできませんでした。
すみません。2つ目以降を出す方法を教えていただけますでしょうか。

csvdeも考えたのですが、
先に形になったのがGet-ADPrincipalGroupMembershipだったので、
そちらを主軸に考えていました。
理想形が出力されればcsvdeでも全く問題ありません!

レジストリはいじれますが、あくまでもシステム管理部であるから、
という感じですね。

あー、PowerShellを使うこと、が目的になってしまってる感はありました。
理想の出力結果が出れば、フリーのツールでもOKなんですが、、、

296 :
余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}

297 :
>>295
説明がしにくいので、pastebin に貼りました。
https://pastebin.com/g40VkBXe

こちらで試している限り、所属グループが複数でも正しく出力されています。
現象的に、12行目の
$line += '"{0}",' -f $grp
が、「+」が抜けて
$line = '"{0}",' -f $grp
になっているように思えます。

確認1:
コードはコピペされてますか?それとも、画面を見ながら手打ちで転記でしょうか。
もし後者の場合はコピペで試してみてください。
また、仮にコピペだったとしても、2ちゃんからではなく上記 URL の pastebin からコピペしなおしてみてもらえますか。

確認2:
ファイルに書き出すものと同じ内容を画面にも出力するようにしています。
グループ名が一つだけ、というのは画面上でもでしょうか?

298 :
>>296
 ありがとうございます。
>>270に記載のスクリプトを編集して、
 Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()} >> C:\work\logtest0528.csv
 という感じになるでしょうか?
>>297
 ありがとうございます。
 確認1:2ちゃんをコピペしてました。
     明日検証環境を使えるので、URLのpastebinからやってみます。
 確認2: グループ名が一つだけ、というのは画面上でもそうなってます。
     (実際には所属するグループが3つあるユーザーを作りテストしています)
「+」は確かに抜けているところがありますね・・・。
修正して、もう一度検証してみます。
ありがとうございます!

299 :
「慶應卒の学歴なんていらない」10代起業で成功する子の共通点
https://www.excite.co.jp/news/article/President_35457/
起業で成功するキャリア形成の仕方とは? 元プロサッカー選手で起業家の鈴木啓祐氏に聞いた
https://sogyotecho.jp/career-development/
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
https://www.dreamgate.gr.jp/contents/column/application-development
学生起業家が開発、「人を軸に本を探すアプリ」とは?読書通じて「考える力」養って
https://newswitch.jp/p/20168
島田商高生がアプリ考案、発表 ICT起業家育成プログラム
https://www.at-s.com/news/article/local/central/730010.html
医師コンビが「治療用アプリ」で起業、禁煙に続き高血圧治療アプリを開発
https://diamond.jp/articles/-/229375
好きが高じて“カレー起業”、キャッシュレス決済アプリ「TOKYO MIX CURRY」の挑戦
https://diamond.jp/articles/-/215868

300 :
>>297
 pastebinに記載いただいたスクリプトをマルっとコピペで、
 理想形として出力することができました!!
 本当にありがとうございました!!

 一文で作成しようと考えていましたが、
 こんなに長いスクリプトが必要とは思いませんでした・・・。

301 :
>>300
うまく動いたようで良かったです。

あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。
また、記述する際も省略表記はなるべく避けるようにしましたので、
ググって意味を調べるのも容易かと思います。

Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。

302 :
csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね

303 :
>>301
 本当にありがとうございました。
 次にこの出力したデータを加工して、今度はインポートする作業が待っていますが、
 調べて頑張ってみます。
>>302
 はい。家庭で検証ができないのでテストが大変でした。
 csvdeも今後使うことがありそうですので、注意してみておきます。

304 :
すみません。頑張り切れませんでした。
>>297 の出力結果に加え、
そのアカウントの有効/無効の情報を同時に取得したいと思い、
Enabledを加えてみましたが、うまく出力できませんでした。

Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?

305 :
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 :
>>305
$line = '"{0}",' -f $user.SamAccountName
の下に、
$line += '"{0}",' -f $user.Enabled
を追加してみてください。
あと、
if($user -eq ''){
break
}
は、対象のユーザ名をファイルから読み取っていたバージョン (>>279) の名残ですので、バッサリ削除しても良いですね。
まとめるとこうです。
https://pastebin.com/8iFFBCA5
念のため解説しておくと、$line は、最終的にファイルに書き込むことになる文字列を格納しています。
で、代入時に「=」ではなく「+=」を使ってますので、代入の都度「置き換え」ではなく「追記」になります(文字列の場合。数値の場合は加算)。
つまり、
$line += '"{0}",' -f $user.Enabled
を冗長な書き方に直すと、
$line = $line + ('"{0}",' -f $user.Enabled)
ということになります。
文字列の「-f」については以下を参照してください。
https://www.google.com/search?q=powershell+string+%27-f%27
オブジェクトのプロパティを指定したものを文字列に直接記述できないのでこうしています。
(こうは書けない $line += '"$user.Enabled",')

307 :
>>306
解説までいただきましてありがとうございます!
ご提案のスクリプトで無事、第1段階のデータを出力することができました。

次の作業がまた待っていますが、教えていただいたことを参考に
作ってみます。

本当にありがとうございます。

308 :
powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?

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

310 :
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 :
ttps://heetnote.com/semi-auto-ps/#more-2973
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、
FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。
以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。
処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?

312 :
コマンドラインに その@ を張り付けると その だけになるの困る
なぜか @ 単独で張り付けると @ が入るのが謎

@あ@あ だと @ああ だったりもう……

313 :
>>311
外部コマンド(*.exe)の出力が起因する問題なのであれば、
「& 〜〜」で同一のコンソール内で実行するのではなく、
「Start-Process 〜〜〜」で実行してみてはどうでしょう。
Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、
そこで実行されます。

314 :
>>313
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません…
Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む)
…で書式は合ってますよね?

315 :
>>314
CLI の外部コマンドは ※ 上で実行しますので、Start-Process で起動するのは
あくまでも ※ です。ですので、引数として CLI の外部コマンドを指定するといいと思います。

こんなかんじですかね。
https://pastebin.com/NFDDXARP

※ コード内の文字列が2ちゃんの NG ワードになっていて書き込めないので、Pastebin にしました

316 :
初心者です。
あるlogフアイルの1行目を新しいlogファイルに書き出し、
続けて同じlogファイルから特定の文字列で検索した結果を上書きしたいのですが、
具体的には

Get-Content C:\test\stdout.log -totalcount 1 > C:\test\stdout_bk.log
Select-String -Path C:\test\stdout.log -Pattern 2020/0 -Encoding default >> C:\test\stdout_bk.log

こう書いてしまうとstdout_bk.log ファイルの2行目が改行してしまいます。
(3行目からSelect-String の結果がかき出される)
stdout_bk.log ファイルの2行目からSelect-String の結果をかき出したいのですが
どうすればいいでしょうか。また処理全体を2行に分けるのではなく
できたら1行にまとめたいのですが、可能でしょうか。

317 :
>>316
これであってる?
Get-Content C:\test\stdout.log | & { Begin { $header = $true } Process { if ($header) { $_; $header = $false } elseif ($_ -match '2020/0') { $_ } } > C:\test\stdout_bk.log

318 :
>>315
丁寧な解説ありがとうございます。しかしうまくいかない…。
ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")

319 :
>>318
$AacItem.FullName を「"」で囲っても、$AacItem のプロパティ FullName は取り出せないです。
いろんなやり方があると思いますけど、私は「-f」を使うやり方が好みです。
Start-Process "一部省略" -ArgumentList ("/c","freacのパス",("-e sndfile-wave -d $OutputDir {0}" -f $AacItem.FullName))
でもこっちのほうが良さそうですね。
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e","sndfile-wave","-d",$OutputDir,$AacItem.FullName)

320 :
>>318
$OutputDir や $AacItem.FullName にスペースが含まれてると失敗するかもしれませんので、その場合はこうでしょうか。
Start-Process "一部省略" -ArgumentList ("/c freacのパス -e sndfile-wave -d '{0}' '{1}'" -f $OutputDir,$AacItem.FullName)

321 :
>>317
}を1個つけると意図する結果が出力されました
ありがとうございました。
復習します。

322 :
>>317
すみません、よろしければ少し解説いただけないでしょうか
$_の使い方がいまいち理解できません。

323 :
>>319
3つとも試してみましたが、どれも正常に動きませんでした…。
一番上は何も処理せずpowershellが終了してしまい、2番めと3番めは黒いウインドウが一瞬表示されるものの
freacは何も処理せず次に進んでしまいました。
{0}と-fは
ttps://yanor.net/wiki/?PowerShell/%E6%96%87%E6%B3%95/%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97%E5%AD%90
ここの一番上で解説されているものでしょうか。

324 :
>>322
Processブロックでは $_ に各行が入ってくるので必要な時だけ出力しました
$_の扱いはForEach-Objectと同じなので、そちらでたくさん例が見つかるでしょう

>>323
Windows限定かもしれませんが、コマンドラインで

prog arg1 arg2 arg3

と起動するプログラムならこれでいい気がします

Start-Process "prog" -ArgumentList @('arg1 arg2 arg3')

325 :
例をつけ忘れました。こんな感じ。

Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')

326 :
Start-Process "freacのパス" -ArgumentList @('-e sndfile-wave -d $OutputDir $AacItem.FullName')
単純にこれではダメでした。

327 :
そりゃもちろんこうしないと

$args = '-e sndfile-wave -d {0} {1}' -f $OutputDir, $AacItem.FullName
Start-Process "freacのパス" -ArgumentList @($args)

328 :
ってこれ >>320 に空白考慮版があるね

329 :
と思ったけど >>320 は必要ないcmd(?)経由に失敗してる?

330 :
>>324
もう一つご教示ください。
header変数はどこで定義されている(という表現が適切か判りませんが)か教えていただけないでしょうか

331 :
>>317
の、Begin { $header = $true }

Begin 節で、header という変数を定義して、初期値をtrue にしてるのでは?

332 :
ありがとうございます。
理解できてない。無知をさらけ出してしまいました。

333 :
>>312
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
UTF-8 で使えるのかどうか、不明

ひょっとして、ファイル名に、半角英数字以外を使っているのか?
ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!

334 :
>>372
すみません、それも結果は同じでした。
ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。
プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、
このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。

335 :
Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
「powershell 文字コード 変換」で検索!
本当は、込み入った処理は、Ruby でやって、
Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき!
こういうシェルで、ややこしいプログラミングは無理

336 :
>>312
>>251-254 のバグとは別かな?

337 :
>>334
ようするに
$OutputDir = どこそこ
foreach ($InputItem in $Args) {
というループの中に
$AacItemList = Get-ChildItem 以下略
foreach ($AacItem in $AacItemList) {
というループがあって
& $fawclPath $AacItem.FullName
を書き換えて >>318 のようにしたいって理解であってますか?
なら $args を書き換えて使っちゃだめですし、
Start-Process も -Wait を付けた方が良さそうなんで
Start-Process 'freacのパス' -ArgumentList @('-e sndfile-wave -d "{0}" "{1}"' -f $OutputDir, $AacItem.FullName) -Wait
じゃないかな

338 :
>>336
それだ!
でもPSReadLineなしでは不便過ぎる……

339 :
PowerShellで多重ループが許されるのは小学生までだよね

340 :
>>323
こちらでも freac を入手して試したところ、>>319 のとおりで動作してます。
私は以下のようにして実行してみました。freac は ZIP で配布されていたものです。

※2ちゃんのNGワードに引っかかりまくって全く書き込みが出来ないため、コードは全て以下の Pastebin に記載しています
https://pastebin.com/M5hD1HXj

# パラメータ
# 例1

実際に試したところ、freac は ※ 経由でなくても動作しますね。
# 例2

【切り分け】
Start-Process で外部の CLI コマンドを実行した場合、終了後にウィンドウが
閉じられるので切り分けが難しくなります。

そこで、「-NoNewWindow」オプションを付けて実行してみてください。
freac (又は※) が出力するエラーが、PowerShell のコンソールに表示されるはずです。
# 例3
# 例4

【-f について】
{0} と -f に関してはご指摘のとおりです。

341 :
>>333
横レスだが、
> ?、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
> UTF-8 で使えるのかどうか、不明
UTF-8というか、Unicodeには、一般的に使われている全ての
文字コードの全ての文字が含まれている。だから、Unicodeと呼ばれる。
> ひょっとして、ファイル名に、半角英数字以外を使っているのか?
> ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
それはNEETの発想だ。職場の共有ファイル、取引先とやりとりする
ファイル等、一般社会では、ガチガチにファイル名のルールが規定
されていて自分勝手に決められない場合が多いのだよ。

342 :
>>340
端末設定を変えられて文字化けするから Start-Process させるんでしょ
-NoNewWindow で端末共有させたらエラーメッセージも化けてるんじゃ……
Start-Process のパラメーターを画面出力して Start-Process せずに exit
出力されたパラメーターが正しいか確認……かな
それをスレに貼ってもらえれば即解決な気がする

343 :
>>323
すみません、これまでの Start-Process の例では「-Wait」オプションが抜けていました。
そのうえで、>>342 の指摘も考慮して以下の通り3パターンでテストしてみました。
https://pastebin.com/yG2WUtPP

test1.ps1
Start-Process を使用するバージョン(-NoNewWindow 無し)

test2.ps1
Start-Process を使用するバージョン(-NoNewWindow 有り)

test3.ps1
オリジナルに近いバージョン(外部コマンドを「&」で実行)'

結果は以下の通りです。
https://i.imgur.com/b2tNZgy.png

test1.ps1、test2.ps1 が動作するのは想定どおりなのですが、test3.ps1 でも文字化けしてないんですよね・・・。
これまで「外部コマンドを Start-Process で別ウィンドウで実行すれば文字化けしない」という前提で
話を進めてきましたが、まったく関係なかったかも知れません。

344 :
外部コマンドの出力をpowershell側で触ったら文字化けするって話してるなら
最初にコンソール出力時のエンコーディング設定変えて
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
最後に戻してやればいいんじゃない
[console]::OutputEncoding = $defaultEncoding

345 :
ちょっと話が脇にそれるんだけど……
あれ?
>>311 を読んで「表示済みの文字まで化ける」謎現象だと思ってたけど
「正常表示できてた文字を、新しく出力すると化ける」だけなの?
化けるのがコンソールアプリの出力だけで、PowerShellのその後の出力は正常なら
端末の受け入れるエンコーディングが変更されただけかも
出力関係のエンコーディングは
(a) コンソールアプリの出力を PowerShell がパイプなり代入なりで受け取る場合のエンコーディング (PowerShellが持ってる)
(b) 端末が受け入れるエンコーディング (端末が持ってる)
があって、PowerShell自身は勝手に(b)に合わせて出力するから化けない
コンソールアプリの出力は、PowerShellに食われる時は、(a)なら正常、違えば化ける
食われず直接端末に出力する時は、(b)なら正常、違えば化ける
コンソールアプリに(b)だけ変更されたのなら(a)に再設定すればいい
[console]::OutputEncoding を設定すると(a)と(b)の両方が設定される
(a)は [console]::OutputEncoding だから
[console]::OutputEncoding = [console]::OutputEncoding
すれば十分な気がする

346 :
色々ありがとうございます。
まず結論ですが、>>344さんの方法で文字化けは一応治りました。
ただ、最初の行に
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
を記述すると
[console]::OutputEncoding = $defaultEncoding
が実行されるまで日本語が全て文字化けします。
なのでfreacが実行される行の上下をこれで挟むのが一応の解決方法でしょうか。
他の方々の書き込みですが、まずStart-Processに-waitをを付ける方法では完全に動作が停止して次の処理に進みませんでした。
>>340さんの例3、4を試してみると、File Not Foundになります。
原因が気になるところではありますが、本末転倒なので>>344さんの方法でとりあえず解決したことにします。ありがとうございました。

347 :
[console]::OutputEncodingの退避・復元で解決できるなら
退避なんかせずに freac(?) の実行直後に
[console]::OutputEncoding = [console]::OutputEncoding
入れるだけでいい気がするけど、もういいや

348 :
書き込み禁止ワードは、何かのコマンドだろ
cmd.@exe, ls @-l

外人のアプリだから、アプリ内部で、文字コードをASCII に決め打ちしてるのかも。
でも、そのアプリは、起動したPowerShellが親だとすると、子プロセスになるから、
子プロセス内で環境を変えたとしても、親プロセスに伝播しないだろ

親プロセスで環境を指定したら、子プロセスにその環境は引き継がれるけど

それかそのアプリは、文字コードをバイナリにしてるとかで、
データを受け取る方がテキストで受け取ると、文字化けするとか

349 :
>>344
それ良いですね、勉強になります。
「俺専用ナレッジベース」にメモしときました。

350 :
rem ff.cmd
@echo off
setlocal
cmd /k "pwsh -File ".\firefox-shutdown.ps1""
# firefox-shutdown.ps1
Start-Sleep -Seconds 10;
Get-Command;
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;

351 :
Start-Sleep -Seconds 10;
mspaint "010371104.gif";
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;

352 :
教えてください。
ADユーザーの最新ログオン日時を取得したいです。
記述としては、
$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) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.LastLogon)
と思いましたが、最終ログオン日時を取得するのは
LastLogonであっているでしょうか?
また、最終ログイン日時の後にフルネームを取得したいときは、
$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) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.LastLogon)
$line = $line + ('"{0}",' -f $user.Fullname)
となるでしょうか?

353 :
v6.2.6
https://github.com/PowerShell/PowerShell/releases/tag/v6.2.6
v7.0.2
https://github.com/PowerShell/PowerShell/releases/tag/v7.0.2

354 :
>>352
Get-ADUser は、デフォルトでは一部のプロパティしか取得しません。"LastLogon" が必要な場合は -Properties で指定する必要があります。
$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local"

$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local" -Properties 'LastLogon'

さらに、LastLogon で取得される日時データはシリアル化されたものですのでヒューマンリーダブルに変換する必要があります。
$line = $line + ('"{0}",' -f $user.LastLogon)

$date = [DateTime]::FromFileTime($user.LastLogon)
$line = $line + ('"{0}",' -f $date.ToString("yyyy/MM/dd HH:mm:ss"))

「フルネーム」ですが、プロパティとしては Name が該当するものになります。
$line = $line + ('"{0}",' -f $user.Fullname)

$line = $line + ('"{0}",' -f $user.Name)

355 :
まとめるとこうです(ファイル書き出しの部分は省略)。
$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local" -Properties 'LastLogon'
foreach ($user in $users) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.Name)
$date = [DateTime]::FromFileTime($user.LastLogon)
$line = $line + ('"{0}",' -f $date.ToString("yyyy/MM/dd HH:mm:ss"))
Write-Host $line
}

356 :
ただし、私自身も 10 年くらい前に AD の情報から LastLogon を取得することを検証したのですが、以下の理由から断念しました。

・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
(各クライアントが認証要求を行ったドメコンでしか更新されず、各ドメコン間で同期されない)
・ユーザが PC でログオンしたタイミング以外でも、LastLogon は更新される (ログオフや長時間離席していた場合など)

正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。
私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。

357 :
追伸。

>・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる

全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。
それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。

358 :
Power Shellってアプリケーション作れんですか?

359 :
アプリケーションって何?

360 :
>>358
普通に作れるよ
GUIもWPF使えるし

361 :
window表示するイベントドリブンなexeのことじゃないかな

362 :
もうそれ最初からC#でやれば良くね?っていう

363 :
大部分C#で書いてパワシェで書きやすい部分だけデリゲートでインジェクションするパターンなら多用しとるわ

364 :
ただのコマンドプロンプトだと思ってた
スゲーワケわからん

365 :
オブジェクト指向シェル言語だからな

366 :2020/06/14
>>354
ありがとうございます!
検証環境で無事出力確認できました!
しかし最終ログイン日時の取得は難しいんですね。
今回はそれほど精密な値は求められないので良かったですが、
ドメコンには注意なんですね。

Excel VBA 質問スレ Part65
【独学】一人で勉強する奴らのスレ【自習】
Qiita
シェルスクリプト総合 その32
+ JavaScript の質問用スレッド vol.125 +
javaとpythonってどっちが初学に向いてる?
Visual Studio 2015 Part8
プログラミングのお題スレ Part17
.Net Core / Net ASP Core
サウンドプログラミング5
--------------------
レジン初心者スレ 4 [無断転載禁止](c)3ch.net
実質10966
■■住宅ローン総合スレ 137■■
Panasonic Let'snote -レッツノート- Part250
スッキリで丸山議員「おっぱい」特集、局が同行した官僚に裏取った模様
【韓国各紙/テレビ媒体】日本の「対韓輸出規制」発表を韓国メディアはどのように報じたのか?[7/2]
【岐阜】「粉末の水素水」発売 水素が持続的に発生
【緊急自慰】亜季にゃ♪406【自慰要請】
GE製 F404-GE-400低バイパス比ターボファンエンジン × 1
≒≒≒≒≒≒≒≒≒   脱税 31
【なんでもあり】介護職の雑談・相談・質問スレ 106
◆【AT-X】ヘカトンケイルの選択 2ヘカトン
【AISIN】アイシンAW 47速
うまいラーメンショップうまい 58杯目
フライトシム厨房です。アドバイス下さい!
夏川椎菜 part7
不真面目な生活保護者の残金スレ546
プーさんのあなぐら★6けつめ
【レシピ】犬の手作りごはん【簡単】 15杯目
【バーチャル】hololiveアンチスレ#6797【youtuber】
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼