- 1 名前:デフォルトの名無しさん mailto:sage [2020/01/01(水) 16:08:31.66 ID:4oQ1Kxot.net]
- 前スレ
PowerShell -Part 3 https://mevius.5ch.net/test/read.cgi/tech/1539074808/ 次スレは>>980が立ててね!!
- 352 名前:デフォルトの名無しさん mailto:sage [2020/06/09(火) 16:01:29.47 ID:DriXa/wG.net]
- 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;
- 353 名前:デフォルトの名無しさん mailto:sage [2020/06/09(火) 16:26:23 ID:DriXa/wG.net]
- Start-Sleep -Seconds 10;
mspaint "010371104.gif"; Start-Sleep -Seconds 3; Get-Process firefox* | Stop-Process;
- 354 名前:300 [2020/06/11(木) 17:55:09 ID:fJWIdGby.net]
- 教えてください。
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) となるでしょうか?
- 355 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 09:35:33.43 ID:IRe5SA+Y.net]
- 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
- 356 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 10:07:01.73 ID:tUTXhBxn.net]
- >>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)
- 357 名前:354 mailto:sage [2020/06/12(金) 10:07:36.18 ID:tUTXhBxn.net]
- まとめるとこうです(ファイル書き出しの部分は省略)。
$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 }
- 358 名前:354 mailto:sage [2020/06/12(金) 10:09:03.73 ID:tUTXhBxn.net]
- ただし、私自身も 10 年くらい前に AD の情報から LastLogon を取得することを検証したのですが、以下の理由から断念しました。
・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる (各クライアントが認証要求を行ったドメコンでしか更新されず、各ドメコン間で同期されない) ・ユーザが PC でログオンしたタイミング以外でも、LastLogon は更新される (ログオフや長時間離席していた場合など) 正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。 私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。
- 359 名前:354 mailto:sage [2020/06/12(金) 10:22:05.71 ID:tUTXhBxn.net]
- 追伸。
>・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる 全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。 それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。
- 360 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 16:10:21.89 ID:6Yfh5mGy.net]
- Power Shellってアプリケーション作れんですか?
- 361 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 18:18:25.00 ID:Jkz+gOtE.net]
- アプリケーションって何?
- 362 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 18:44:27.27 ID:/dqGhWwV.net]
- >>358
普通に作れるよ GUIもWPF使えるし
- 363 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 18:45:58.91 ID:gCbNSmDh.net]
- window表示するイベントドリブンなexeのことじゃないかな
- 364 名前:デフォルトの名無しさん [2020/06/12(金) 18:55:49.90 ID:tr06rVi2.net]
- もうそれ最初からC#でやれば良くね?っていう
- 365 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 19:42:03.65 ID:sTuFS1ZK.net]
- 大部分C#で書いてパワシェで書きやすい部分だけデリゲートでインジェクションするパターンなら多用しとるわ
- 366 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 20:21:21.09 ID:6LTYSgwt.net]
- ただのコマンドプロンプトだと思ってた
スゲーワケわからん
- 367 名前:デフォルトの名無しさん mailto:sage [2020/06/12(金) 20:53:03.96 ID:tSkvENox.net]
- オブジェクト指向シェル言語だからな
- 368 名前:300 [2020/06/14(日) 00:11:44.27 ID:JXZUsp2d.net]
- >>354
ありがとうございます! 検証環境で無事出力確認できました! しかし最終ログイン日時の取得は難しいんですね。 今回はそれほど精密な値は求められないので良かったですが、 ドメコンには注意なんですね。
- 369 名前:デフォルトの名無しさん mailto:sage [2020/06/15(月) 19:20:43.36 ID:KO8t20+1.net]
- ドメコンにリアルタイム性は期待できないと思ったがやっぱそうだよな
- 370 名前:デフォルトの名無しさん [2020/06/16(火) 08:27:08.93 ID:flP7FZNr.net]
- LastLogin を各DCから拾って最新値を取り出すスクリプトあったよ
https://gallery.technet.microsoft.com/scriptcenter/Get-Last-Logon-for-Users-c8e3eab2
- 371 名前:デフォルトの名無しさん [2020/06/16(火) 11:32:29.65 ID:r0rBA9XG.net]
- コマンドプロンプトでecho a b cを実行すると出力結果は
a b c PowerShellでecho a b cを実行すると a b c なのはなんで? エラーにもならずにbやcはどう扱われてるの?
- 372 名前:デフォルトの名無しさん [2020/06/16(火) 11:55:26.03 ID:dJYiaODe.net]
- echo a b c
とかやってみれば、以下にcmdがクソかよくわかると思うよ。
- 373 名前:デフォルトの名無しさん [2020/06/16(火) 11:56:36.32 ID:dJYiaODe.net]
- あ、間のスペースも消えてなくなるのか。
echo___a_____b____c _をスペースに。
- 374 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 12:32:39 ID:0Yfa1k+l.net]
- いやいやいや
引数なんだから当然だろ あとは出力で改行するかどうかだけじゃん
- 375 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 12:44:08.30 ID:zfRgO9so.net]
- echo "a b c"
" " で囲えば、a b c と表示される
- 376 名前:デフォルトの名無しさん [2020/06/16(火) 12:53:01.50 ID:r0rBA9XG.net]
- 聞きたいのはそういう類じゃないんだな
echo (=Write-Output) のSyntaxが Write-Output [-InputObject] <PSObject> [-NoEnumerate] [<CommonParameters>] だからa が-InputObjectの<PSObject>になるのはわかる bやcはどういう理屈で処理されるの?
- 377 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 14:16:42.05 ID:PL2rwu//.net]
- >>374
echo a b c は echo @('a', 'b', 'c') と同じ扱いとするように実装されてるんでしょ
- 378 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 14:40:34.28 ID:p9YvTGLE.net]
- まあ調べた374がpowershellの引数展開についてまとめて分かりやすく報告してくれるでしょ
- 379 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 14:48:49.11 ID:C/0BZ8DU.net]
- MSの説明では、正確には
[-InputObject] <PSObject[]> となってる
- 380 名前:デフォルトの名無しさん [2020/06/16(火) 16:42:16.77 ID:r0rBA9XG.net]
- del a b cはちゃんとエラーになる
さっぱりわからん😩
- 381 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 17:12:01.69 ID:MVe0R048.net]
- Write-Outputの-InputObjectパラメータにはValueFromRemainingArguments属性がついてるから
その場合はパラメータ名が明示されてないものはすべてInputObjectにバインドされるんよ 確認はしずらいけど以下で確認できる (Get-Command Write-Output).ParameterSets[0].Parameters | where name -eq InputObject まああんまりこの属性ついてるのはないからecho とかWrite-Hostあたりはこうなってるくらいの認識でいいよ PowerShell7だとJoin-Pathもこの属性がついてる
- 382 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 17:24:04.82 ID:8ZMUuPb8.net]
- echoの引数がUNIXとかだとアレだよ
- 383 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 17:25:39.53 ID:MVe0R048.net]
- >>379
訂正:パラメータ名が明示されてないものでポジショナルバインディングもできないもの
- 384 名前:デフォルトの名無しさん [2020/06/16(火) 17:45:58 ID:r0rBA9XG.net]
- なるほど
ありがとう
- 385 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 19:16:29.09 ID:bkoiHKSB.net]
- PowerShellの起動がなんか凄いモタつくんだけどおまかん?
Windows10Home PS7.01 スクリプト書いて渡しても、 何も出ない黒い画面がしばらく出て怖がられたり、何個も起動されたりするし
- 386 名前:デフォルトの名無しさん mailto:sase [2020/06/16(火) 21:23:47.76 ID:aR46ypRq.net]
- >>251,312
右クリックじゃなくてCtrl+Vではどう?
- 387 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 22:43:53.36 ID:Tk9CpyzQ.net]
- cmd -L
9875 shinjyuku Tokyo Japan の1列目を1行で変数に格納したいのですが、方法がわかりません。 $work=(cmd -L | Select-String "shinjyuku" ) $id=$work -split " " Write-Output $work[1] これを1行で書ける方法を教えてください。 よろしくお願いいたします。
- 388 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 23:40:23 ID:n71ojSL1.net]
- cmd -Lが何なのか判らないのでcmd /c echoの例で
(cmd /c echo 9875 shinjyuku Tokyo Japan | %{ $_ -split " " })[0]
- 389 名前:デフォルトの名無しさん mailto:sage [2020/06/16(火) 23:41:31 ID:n71ojSL1.net]
- 忘れてた頭に$id=付けてね
- 390 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 07:40:39.83 ID:0yXiYm7U.net]
- >>386
ありがとうございます 特に隠すようなコマンドでもなかったのですが、 インターネット速度の自動計測スクリプトを作ってみようとしてます .>\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)' 15047 OPEN Project (via 20G SINET) Tokyo Japan > $i=(.\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)' | %{$_ -split ' '}[0]) > Write-Output $i[1] 15047
- 391 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 07:50:00.92 ID:PujUJ59z.net]
- cmd .exeに-Lオプションがあるのかと思った人は俺以外にもたくさんいるはず
- 392 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 08:00:55.98 ID:H0Dcbe9T.net]
- VSCode で、PowerShell の拡張機能を入れると、構文チェックで、
Write-Host を、Write-Output か、Write-Verbose に変えろって警告される PowerShell/PSScriptAnalyzer https://github.com/PowerShell/PSScriptAnalyzer/blob/master/RuleDocumentation/AvoidUsingWriteHost.md
- 393 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 08:04:57.13 ID:H0Dcbe9T.net]
- 漏れは回線速度を、NETFLIX で測っている
https://fast.com/ja/
- 394 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 10:09:26.78 ID:U7B7s7qz.net]
- >>388
(.\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)' | %{$_ -split ' '}[0])[1]
- 395 名前:392 mailto:sage [2020/06/17(水) 10:13:28.30 ID:U7B7s7qz.net]
- >>388
あれ、speedtest.exe の「-L」って、ネットワーク的に近い場所のサーバを 表示するだけで、実際の計測はしてないようですけど、これで良いんですか? >>388 の続きがある、ってことですかね。
- 396 名前:392 mailto:sage [2020/06/17(水) 10:21:19.19 ID:U7B7s7qz.net]
- >>388
タスクスケジューラで回すことを考えてるのかも知れませんが、単に .\speedtest.exe -s 6766 とか .\speedtest.exe -s 15047 といった感じにしないのはなぜですか? speedtest.exe -L を実行する意図がよく分かりません。
- 397 名前:392 mailto:sage [2020/06/17(水) 10:29:32.27 ID:U7B7s7qz.net]
- >>388
連投ごめんなさい、speedtest.exe は出力形式を CSV とか JSON とか色々 選べますので、ヒューマンリーダブルのものを加工するよりもそっちのほうが 簡単だと思います。 実行例:近隣サーバの列挙 PS > .\speedtest.exe -L -f csv "ID","Name","Location","Country","Host" "24333","Rakuten Mobile , Inc","Tokyo","Japan","ookla.mbspeed.net" "15047","OPEN Project (via 20G SINET)","Tokyo","Japan","speed.open.ad.jp" "28910","fdcservers.net","Tokyo","Japan","lg-tok.fdcservers.net" 〜以下略〜 実行例:サーバを指定した計測 PS > .\speedtest.exe -s 15047 -f csv "OPEN Project (via 20G SINET) - Tokyo","15047","4.43","0.605","0","72540509","45781634","871440390","582254568","https://www.speedtest.net/result/c/e998102d-d04a-4258-9aae-6dd3afbbf323"
- 398 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 15:45:25.40 ID:UcA8Gcsf.net]
- ジョブをパイプの途中で使いたいと考えています
1 .. 3 | % { $_; sleep 1 } | & { process { ">$_" }} これは1秒間隔で結果が出ます Start-Job { 1 .. 3 | % { $_; sleep 1} } | Receive-Job -wait これも1秒間隔で結果が出ます 1 .. 3 | % { $_; sleep 1 } | Start-Job { process { ">$_" }} | Receive-Job -wait これは結果がまとめて出ます 1秒間隔で結果を得るにはどうすれば良いのでしょうか # パイプラインで入出力がsjisのコマンドとutf8のコマンドを通すのが最終目的です # データ生成 | sjis入出力 | utf8入出力 みたいなイメージ # パイプラインでエンコーディングを混在させるのに$OutputEncodingの方は # スコープで分ければすみますが、[console]::OutputEncodingはスコープ無関係 # なのでジョブで分けようかと
- 399 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 16:28:19.33 ID:pLBooGKC.net]
- なんでワンライナーでやる必要があるのかね、こういうの
保守とか考えないのかね
- 400 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 16:55:10.36 ID:/58stVp5.net]
- パイプの弊害か
- 401 名前:デフォルトの名無しさん mailto:sage [2020/06/17(水) 17:44:32.75 ID:UcA8Gcsf.net]
- >>397
コマンドラインで結果をすぐに見たいからですね ページャーにつないで欲しい結果が出てきたら確認して終了 ステップごとに完了待ちしてたら時間がもったいない
- 402 名前:デフォルトの名無しさん [2020/06/17(水) 23:59:11.03 ID:H0Dcbe9T.net]
- >>396
>1 .. 3 | % { $_; sleep 1 } | Start-Job { process { ">$_" }} | Receive-Job -wait 1 .. 3 | % { $_; sleep 1 } この部分を、Start-Job の中に入れたら?
- 403 名前:デフォルトの名無しさん mailto:sage [2020/06/18(木) 05:52:46 ID:7bz/apiR.net]
- $ary_names = @('太郎','次郎','三郎','四朗','五郎')
write-output $ary_name[@] #bashの記法 太郎,次郎,三郎,四朗,五郎 的なことをしたい。※区切り文字はなんでも可。 現状、配列に文字列をくっつけると1行で出るので write-output ("a"+$aaa).trim("a") という強引な方法をとっております。もっとPowershell的にスマートな方法があれば お教えくださいませ。
- 404 名前:デフォルトの名無しさん mailto:sage [2020/06/18(木) 06:58:53 ID:3wPjj0xg.net]
- $ary_names -join ','
- 405 名前:デフォルトの名無しさん mailto:sage [2020/06/18(木) 07:18:11.97 ID:7bz/apiR.net]
- >>402
ありがとうございます!
- 406 名前:デフォルトの名無しさん mailto:sage [2020/06/18(木) 09:01:24.17 ID:hwvpLd3O.net]
- >>400
それだと最終目的のためにはStart-Jobの入れ子が必要になるなあ 制御不能になりそうだし面倒なので避けたい cmd.exeを使うことにします
- 407 名前:デフォルトの名無しさん [2020/06/19(金) 06:41:17 ID:RNyMoV2a.net]
- $s=[datetime]::Now; 1 .. 5 | ForEach-Object { Start-Sleep 1; ">{0}" -f $_ } | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}
2秒間隔、トータル10秒という結果に困惑している
- 408 名前:デフォルトの名無しさん mailto:sage [2020/06/19(金) 07:30:31.94 ID:JIIBGf6G.net]
- >>405
二重ループを期待してたってこと?
- 409 名前:405 [2020/06/19(金) 08:42:12.76 ID:RNyMoV2a.net]
- 最初は2秒、それから1秒間隔でトータル6秒だと思ってた
1秒待ちをStart-Sleepでなく別のプロセスで待たせても変わらなかった
- 410 名前:デフォルトの名無しさん [2020/06/19(金) 08:51:47 ID:GhHOGZr1.net]
- パイプつなぎはいわゆるgenerator(PowerShellでの呼び方は知らない)になるってことかな?
- 411 名前:デフォルトの名無しさん mailto:sage [2020/06/19(金) 08:52:39 ID:JIIBGf6G.net]
- 1に対して最初のfor-eachの中身処理した後に次のfor-eachの中身処理。
2に対して... 3に対して... 4に対して... 5に対して... ふたつのfor-eachの中身がどういう順に処理されてるか確認できるように表示を工夫してみたら?
- 412 名前:405 [2020/06/19(金) 09:08:23.61 ID:RNyMoV2a.net]
- そこはなんとなくイメージできたんでもういい
パイプラインの各段を別のプロセスにすると6秒で終了する 同じように6秒で終了すると思ってたら違ったんで戸惑ったというお話
- 413 名前:405 [2020/06/19(金) 11:12:17.79 ID:RNyMoV2a.net]
- $s=[datetime]::Now; 1 .. 5 | Start-ThreadJob { process { Start-Sleep 1; ">${0}" -f $_ }} | Receive-Job -Wait -AutoRemoveJob | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}
別スレッドを指定したらトータル6秒になった 一人研究発表会になっちまったな。すまぬ。
- 414 名前:405 [2020/06/19(金) 11:40:12.67 ID:RNyMoV2a.net]
- よく見たら結果がおかしい。お手上げだ。諦めた。
- 415 名前:デフォルトの名無しさん mailto:sage [2020/06/19(金) 17:20:54 ID:qQd5c1Zr.net]
- >>397
おまえはpythonでもつかってろ
- 416 名前:デフォルトの名無しさん mailto:sage [2020/06/19(金) 18:23:41.02 ID:OOcqKGQK.net]
- ラクダが笑ってんぞ
- 417 名前:405 [2020/06/19(金) 21:01:31.39 ID:RNyMoV2a.net]
- できたーーーー
$s=[datetime]::Now; 1 .. 5 | ForEach-Object { Start-Sleep 1; ">{0}" -f $_ } | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds} にちょい足しして $s=[datetime]::Now; 1 .. 5 | ForEach-Object -Parallel { Start-Sleep 1; ">{0}" -f $_ } -ThrottleLimit 1 | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds} にしたらStart-ThreadJobを使った時より遅いけど簡単に予想してた結果になった お騒がせしました
- 418 名前:405 [2020/06/19(金) 21:15:58.78 ID:RNyMoV2a.net]
- こ、今度こそできたー
$s=[datetime]::Now; 1 .. 5 | Start-ThreadJob { $input | ForEach-Object {Start-Sleep 1; ">{0}" -f $_ }} | Receive-Job -Wait -AutoRemoveJob | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds} やっぱりこれが最終版ということにしたい お邪魔しました
- 419 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 00:50:50.12 ID:na6pkPqz.net]
- はいつぎ
- 420 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 08:11:14.95 ID:wKnheY+E.net]
- Powershellを使いこなすにはcomを知らなければならないと聞いたのですが、
comについてはどうやって学ぶのがオススメですか? ググラビリティの悪い単語なので、 思うように検索できません Excellの機能を使ってあれこれしたいです
- 421 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 09:03:13.32 ID:5oXecify.net]
- COM の使い方
https://docs.microsoft.com/ja-jp/previous-versions/direct-x/cc351700(v=msdn.10)
- 422 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 11:29:31 ID:XppcwtFP.net]
- Powershellを使い始めました
皆さん、こんなの全部覚えてるんですか? どうやって覚えました? ファイル開いて書き込むだけで こんなにもたくさん覚えないといけないって 大変だったんじゃないですか? $output_file = "C:\bin\hoge.txt" $sw = New-Object System.IO.StreamWriter($output_file, $false, [Text.Encoding]::GetEncoding("UTF-8")) $sw.WriteLine("aaa") $sw.WriteLine("あああ") $sw.Close() $sw.WriteLine("あああ") $sw.Close() この辺はまだ、覚えられるのですが、 New-Object System.IO.StreamWriter←InputOutputを、ストリームにライトするんだろうな $output_file, $false, ←ファイル名と、追記、上書を指定するんだろうな。 [Text.Encoding]:: ←なんで[]包むんだ、:: ←このダブルのコロンは何だ、 GetEncoding("UTF-8")) ←何でファイル作ってるのにGetなんだ、 単純に $mojiko-do="UTF-8"で New-Object System.IO.StreamWriter($output_file, $false,$mojiko-do)じゃないんだと、 覚えることや、なぜこうなってるんだに少々ビビってます。 皆さんが、どうやってこんなに複雑で面倒なものを覚えたか、コツがあったら教えてください。
- 423 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 11:33:23 ID:XppcwtFP.net]
- ほかにも、メソッド、プロパティ?クラス?で書き方がものすごいたくさんあるようで、めまいがします。
覚えれば仕事が楽になることは分かっているので、頑張りたいところなんですが あまりの複雑さに、皆さんがどうやって覚えたのか、コツがあればぜひともお教えください。
- 424 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 11:46:07.33 ID:6HpZ1NhN.net]
- 良くも悪くも.NETが前提だから
先にC#を覚えるのがコツかな
- 425 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 12:28:41.13 ID:sltMp+ny.net]
- コード量が多いってことと覚えなきゃいけない知識量は必ずしも一致しないからな
Perlみたいに省略できまくるワンライナーのほうがスパゲティったときわけ分からなくなる
- 426 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 12:29:17.17 ID:dcvMDCGE.net]
- とにかく書いて動かす
やってみる、作ってみる 国語力、英語力は少しつけようとする
- 427 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 12:31:14.10 ID:E6EedD+K.net]
- .NETなんて前提にしなくてもマルチプラットフォームで使える文法を身につけるのが先
- 428 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 13:13:11.69 ID:w0A+CU3q.net]
- >>420
ファイルに書き込むだけならコマンドレットで足りる 痒い所に手が届かない時にググりながら.NETをボチボチ使って行けば良い
- 429 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 13:13:46.53 ID:F3e6GYXo.net]
- 正直言ってPowerShellは覚える必要ない
スクリプトファイルを作って使うならC#を使うのと大差ない それならC#を覚えて使う方がいい コマンドラインシェルとして使うなら.NETやらCOMやら取り込む使い方は 何かあった時にシェルが巻きぞえになって、シェルを殺すしかなくなる そうならない程度に言語自体の機能だけで使うなら、とりたて覚えるほどでもない
- 430 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 13:42:16.03 ID:dcvMDCGE.net]
- 本番環境その場で場当たり的にコマンド打つのはあり得ないしな
まあすごくユルい会社なら知らんが
- 431 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 13:50:27.59 ID:zwBEwaPL.net]
- >>420
その書き方は.NETライブラリを使っているのでPowershellの初歩の枠を越えてる 追記するだけならこう $output_file = "C:\bin\hoge.txt" "aaa" | Out-File $output_file -Append -Encoding UTF8 "あああ" | Out-File $output_file -Append -Encoding UTF8 こうしてもいい "aaa", "あああ" | Out-File $output_file -Append -Encoding UTF8 UTF16でいいならこれ "aaa", "あああ" >> $output_file Powershell 5以前には欠陥があって、BOMなしUTF8を新規作成する簡単な手段がなかった だからStreamWriterを持ち出すようなサンプルが普及していて、初歩のはずなのに難しいと感じる要因になってる
- 432 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 14:13:22.51 ID:Xz+FX1Oy.net]
- 必要はないけど覚えたら便利
- 433 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 14:35:58.75 ID:YZMPfrl8.net]
- 最初から暗記する必要はなくて、機能を一覧表にしておいて
必要に応じてそれを参照、コピペすればいい 出現頻度の高いものは自然と覚える いずれにしても手打ちするのは時間の無駄なので コピペ推奨
- 434 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 16:51:19.56 ID:KBDfWM5t.net]
- 習得してない人達のアドバイスは聞く必要がない
あっだからできないんだっていう見本にはなるけど
- 435 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 16:58:42.46 ID:py+iqQxS.net]
- 俺以外のアドバイスは聞く必要がない
- 436 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 17:35:07.43 ID:6sC7z1nS.net]
- >>420
>コツがあったら教えてください。 PowerShell に限った話じゃないけど、学校の授業みたいに「勉強ありき」で 努力するよりも、「これをやるためには PowerShell を使うしか無い」という 状況に追い込まれると覚えやすいですね。 あと、積極的に英語のフォーラムなどから情報を得るようにしたほうが良いと思います。 やはり、日本語と英語では情報量が雲泥の差ですので。 Google 翻訳を使えば何とかなります。
- 437 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 20:10:35.90 ID:WPfafdOl.net]
- >>434
> 「これをやるためには PowerShell を使うしか無い」という状況 そんな状況は、普通は無い。 あるとすれば、>>428が言った > 本番環境その場で場当たり的にコマンド打つ ぐらい。
- 438 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 23:24:31.04 ID:tXS4Zxv6.net]
- PowerShell(PS)で、ビジネスロジック・複雑なものを書いたら、ダメ!
基本的に、CSV・JSON などは、Ruby で書いて、 起動部分だけを、コマンドプロンプト・PS・VBS などで作る
- 439 名前:デフォルトの名無しさん mailto:sage [2020/06/20(土) 23:38:30.06 ID:sltMp+ny.net]
- Pythonにしてくれ頼む
- 440 名前:デフォルトの名無しさん mailto:sage [2020/06/21(日) 08:39:56.92 ID:PKUYu7rs.net]
- >>435
>そんな状況は、普通は無い。 仕事で MS のエンタープライズ系製品を扱ってると、嫌というほど そういう状況に遭遇しますね。 Windows Server, Exchange, SQL Server, Office 365 あたりの 設計、構築、運用に携わってれば日常茶飯事です。 そういう仕事に携わるようになってから PowerShell を覚えた、って人が 多いと思ったけど、そうでもないのかな?プログラム板だから違うのかな?
- 441 名前:デフォルトの名無しさん mailto:sage [2020/06/22(月) 18:21:34.75 ID:njZ7JPCW.net]
- >>0438
君は正常。
- 442 名前:デフォルトの名無しさん [2020/06/24(水) 07:34:20.49 ID:9MFoHisW.net]
- コマンドプロンプトでバッチを作るとちょっとした自動化に便利というのを最近知って調べたら
今はPowerShellCoreが現行とたどり着いたが やっぱり移行するしないで揉めてる
- 443 名前:436 mailto:sage [2020/06/24(水) 08:08:25.26 ID:rM4tv+8j.net]
- さすがに、バッチでプログラミングしてはいけない!
可読性が低すぎる Ruby スクリプトなどを起動するだけにしておくべき
- 444 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 08:40:10 ID:L+v/qVAN.net]
- >>440
用途・要件次第。 業務利用という前提だけど、自分だったらこういうポリシーで緩やかに移行する。 ・既存の cmd バッチや WSF、VBS → 基本的には移行(移植)しない ※例外:改修が必要になった場合は個別対応 ・新規 → 基本的には PowerShell で作るべき ※例外:極々単純なもの、自分だけが使い捨てするもの
- 445 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 08:44:24 ID:/txx2vwO.net]
- 可読性w
可読性に煩いやつ程低レベルだよね 三項演算子とか
- 446 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 09:05:28.99 ID:W7e3ICMc.net]
- >>441
お前はRuby禁止のスレでRubyでは〜Rubyでは〜とやるのをやめろ。ノイズにしかならない糞レスはスレの可読性を下げるだけだ。
- 447 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 09:51:09 ID:LpqCs0qI.net]
- 440で思い出したけど、powershell coreって今どうなってるんや
自分は実行環境としては5.1をメインで使ってるけど、みんなどこら辺なんや
- 448 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 10:09:13.32 ID:wIzfCOgT.net]
- win10プレインストールしか使っとらんわ
というかツール勝手に入れられない客先環境で戦うためのツールって認識
- 449 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 10:48:39.06 ID:oYgVDO6A.net]
- >>446
> ツール勝手に入れられない客先環境で戦うためのツール ほんそれ。 いまメインでやってる案件だと、お客さんから貸与されてる作業用 PC があって、 お客さんの環境にはそのマシンしか繋げられない。もちろん、世に数多とある便利ツールを 好き勝手に入れることは出来ない。 でも PowerCLI などの PowerShell モジュールのインストールは純正管理ツール扱いで 許可されてるので、構築とか保守作業では PowerShell スクリプトを使いまくってる。 いちいちマウスでカッチンカッチンやってたら、日が暮れちゃうからね・・・。
- 450 名前:デフォルトの名無しさん [2020/06/24(水) 12:17:32.10 ID:9MFoHisW.net]
- >>442
なるほど。 どうも。
- 451 名前:デフォルトの名無しさん [2020/06/24(水) 21:01:47.98 ID:jVaXlMW4.net]
- scriptblock[] を受け取って、scriptblockをそれぞれスレッドで動かして
パイプでつないで実行するfunctionを書きたいんだがうまく書けない ようするに $s = [datetime]::Now 1 .. 10 | % { sleep 1; ">$_" } | % { sleep 1; ">$_" } | % { sleep 1; ">{0} {1} " -f $_, ([datetime]::Now - $s).TotalSeconds } を実行すると >>>1 3.1179897 >>>2 6.1354357 >>>3 9.1403334 >>>4 12.1434852 と3秒間隔で結果が出るんで $s = [datetime]::Now threadedpipe @( { 1 .. 10 }, { % { sleep 1; ">$_" } }, { % { sleep 1; ">$_" } }, { % { sleep 1; ">{0} {1} " -f $_, ([datetime]::Now - $using:s).TotalSeconds }}) みたいに書いて、最初が3秒目で1秒間隔で結果出力したい いろいろ試して諦めたんだが、そもそもPowerShellではこういうfunctionは書けないの?
- 452 名前:デフォルトの名無しさん mailto:sage [2020/06/24(水) 22:06:24.12 ID:VGKuFIs7.net]
- powershellのコマンドはプロセス作らないから無理じゃね
マルチスレッドをそんなお手軽に制御できたら夢みたいだけど
|

|