- 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が立ててね!!
- 281 名前:デフォルトの名無しさん [2020/05/29(金) 18:22:56 ID:d1uEOplb.net]
- >>279
ありがとうございます。 すでに私に理解できる範囲を超えているのですが、、、 データを取得したい対象ユーザーは”特定のコンテナ内”です。 その場合であれば、どこを変更するようになるでしょうか? すみません。ご教示ください。
- 282 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 18:44:52.24 ID: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 }
- 283 名前:デフォルトの名無しさん mailto:sage [2020/05/29(金) 18:48:35.39 ID:GJdaxgw0.net]
- >>280
追伸。まず、 Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local" だけ実行して希望通りのユーザオブジェクトが出力されることを確認してください。 "OU=Newusers,DC=example,DC=local"の記述方法がキモになりますが、 よくわからない場合は「distinguished name」でググってください。
- 284 名前:デフォルトの名無しさん [2020/05/29(金) 23:38:38 ID:d1uEOplb.net]
- >>281
>>282 本当にありがとうございます! 今は検証環境に繋げないので、明日、試してみます! また結果を明日の夜します!
- 285 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 00:38:50 ID:AsxV9jzU.net]
- ふーむcsvde使った方が楽そうだな
- 286 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 07:47:46.25 ID:Z2NT1d95.net]
- PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある
- 287 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 08:49:02.75 ID:d859mrLa.net]
- 結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど
- 288 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 10:31:28 ID:KjUAf8QQ.net]
- >>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ
- 289 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 13:24:05 ID:9sn/rA++.net]
- 余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?
- 290 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 16:10:14.39 ID:KjUAf8QQ.net]
- >>288
会社によるだろう、としか
- 291 名前:デフォルトの名無しさん mailto:sage [2020/05/30(土) 23:54:06.76 ID:iu9cBMrA.net]
- 合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない
- 292 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 00:40:12 ID:+AbQWtDJ.net]
- ちなみにレジストリをいじるのは認められているの?
- 293 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 01:57:51 ID:81hmFEht.net]
- うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。
- 294 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 12:20:40 ID:b/Zu62PW.net]
- 管理者権限アカウントの申請は必要てのはあるよね
- 295 名前:デフォルトの名無しさん mailto:sage [2020/05/31(日) 17:04:24.67 ID:rtfQfZlf.net]
- 部のPC担当じゃなければせいぜいパワーユーザーだと思うけど
- 296 名前:デフォルトの名無しさん [2020/05/31(日) 23:56:26.74 ID:iB7Renkw.net]
- >>281
報告が遅くなりました・・・。 検証環境で実行した結果、 A列にログオンID、B列に所属するグループ1、が表示されました。 ここまではかなりいい感じだったのですが、 所属するグループの2つ目以降が出力できませんでした・・・。 2つ目以降を出力できるよう考えてみましたが、 取ってつけた知識では太刀打ちできませんでした。 すみません。2つ目以降を出す方法を教えていただけますでしょうか。 csvdeも考えたのですが、 先に形になったのがGet-ADPrincipalGroupMembershipだったので、 そちらを主軸に考えていました。 理想形が出力されればcsvdeでも全く問題ありません! レジストリはいじれますが、あくまでもシステム管理部であるから、 という感じですね。 あー、PowerShellを使うこと、が目的になってしまってる感はありました。 理想の出力結果が出れば、フリーのツールでもOKなんですが、、、
- 297 名前:デフォルトの名無しさん mailto:sage [2020/06/01(月) 00:21:41 ID:vdF2NbM2.net]
- 余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}
- 298 名前:281 mailto:sage [2020/06/01(月) 08:58:32.48 ID:Pn8bHbMj.net]
- >>295
説明がしにくいので、pastebin に貼りました。 https://pastebin.com/g40VkBXe こちらで試している限り、所属グループが複数でも正しく出力されています。 現象的に、12行目の $line += '"{0}",' -f $grp が、「+」が抜けて $line = '"{0}",' -f $grp になっているように思えます。 確認1: コードはコピペされてますか?それとも、画面を見ながら手打ちで転記でしょうか。 もし後者の場合はコピペで試してみてください。 また、仮にコピペだったとしても、5ちゃんからではなく上記 URL の pastebin からコピペしなおしてみてもらえますか。 確認2: ファイルに書き出すものと同じ内容を画面にも出力するようにしています。 グループ名が一つだけ、というのは画面上でもでしょうか?
- 299 名前:デフォルトの名無しさん [2020/06/01(月) 20:38:24 ID: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つあるユーザーを作りテストしています) 「+」は確かに抜けているところがありますね・・・。 修正して、もう一度検証してみます。 ありがとうございます!
- 300 名前:デフォルトの名無しさん [2020/06/01(月) 23:33:53 ID:5NIHbXOS.net]
- 「慶應卒の学歴なんていらない」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
- 301 名前:デフォルトの名無しさん [2020/06/02(火) 12:00:25.43 ID:TaVu0Z+0.net]
- >>297
pastebinに記載いただいたスクリプトをマルっとコピペで、 理想形として出力することができました!! 本当にありがとうございました!! 一文で作成しようと考えていましたが、 こんなに長いスクリプトが必要とは思いませんでした・・・。
- 302 名前:297 mailto:sage [2020/06/02(火) 13:51:33.65 ID:4gU+uBDd.net]
- >>300
うまく動いたようで良かったです。 あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。 また、記述する際も省略表記はなるべく避けるようにしましたので、 ググって意味を調べるのも容易かと思います。 Windows 系インフラの構築/運用では PowerShell を活かせる場面が 多くありますので、この機会に覚えておくと強力なスキルになると思います。
- 303 名前:デフォルトの名無しさん mailto:sage [2020/06/02(火) 16:16:22.57 ID:e5f6kXC+.net]
- csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね
- 304 名前:デフォルトの名無しさん [2020/06/02(火) 18:35:36 ID:TaVu0Z+0.net]
- >>301
本当にありがとうございました。 次にこの出力したデータを加工して、今度はインポートする作業が待っていますが、 調べて頑張ってみます。 >>302 はい。家庭で検証ができないのでテストが大変でした。 csvdeも今後使うことがありそうですので、注意してみておきます。
- 305 名前:300 [2020/06/03(水) 17:19:22.25 ID:OSlS0ZCr.net]
- すみません。頑張り切れませんでした。
>>297 の出力結果に加え、 そのアカウントの有効/無効の情報を同時に取得したいと思い、 Enabledを加えてみましたが、うまく出力できませんでした。 Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?
- 306 名前:300 [2020/06/03(水) 18:10:05 ID: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 } これで画面には出るようになりました。 出力するファイルにも出るようにするには、、、
- 307 名前:297 mailto:sage [2020/06/04(木) 11:06:18 ID:TeZKrupD.net]
- >>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",')
- 308 名前:300 [2020/06/04(木) 21:01:19.40 ID:7LqTXEt1.net]
- >>306
解説までいただきましてありがとうございます! ご提案のスクリプトで無事、第1段階のデータを出力することができました。 次の作業がまた待っていますが、教えていただいたことを参考に 作ってみます。 本当にありがとうございます。
- 309 名前:デフォルトの名無しさん mailto:sage [2020/06/04(木) 22:31:22.80 ID:sBE+PUel.net]
- powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが いかがでしょうか?
- 310 名前:デフォルトの名無しさん mailto:sage [2020/06/04(木) 22:43:28 ID:7Yb6fwZR.net]
- 自分で書いたバッチファイルを置き換えるのは効果的な学習だと思う
ただ対応するコマンドを置き換えていくだけだと オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな
- 311 名前:デフォルトの名無しさん mailto:sage [2020/06/04(木) 23:21:46.10 ID: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
- 312 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 01:16:33.38 ID:amrr7gLk.net]
- ttps://heetnote.com/semi-auto-ps/#more-2973
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、 FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。 以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。 処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて 全ての日本語が「□□□」に置き換わるようになります。 多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?
- 313 名前:デフォルトの名無しさん [2020/06/05(金) 06:07:06.84 ID:Trob9zBU.net]
- コマンドラインに その@ を張り付けると その だけになるの困る
なぜか @ 単独で張り付けると @ が入るのが謎 @あ@あ だと @ああ だったりもう……
- 314 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 08:46:16.13 ID:S6jGROW/.net]
- >>311
外部コマンド(*.exe)の出力が起因する問題なのであれば、 「& 〜〜」で同一のコンソール内で実行するのではなく、 「Start-Process 〜〜〜」で実行してみてはどうでしょう。 Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、 そこで実行されます。
- 315 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 15:49:55 ID:amrr7gLk.net]
- >>313
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません… Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む) …で書式は合ってますよね?
- 316 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 16:56:17.03 ID:S6jGROW/.net]
- >>314
CLI の外部コマンドは ※ 上で実行しますので、Start-Process で起動するのは あくまでも ※ です。ですので、引数として CLI の外部コマンドを指定するといいと思います。 こんなかんじですかね。 https://pastebin.com/NFDDXARP ※ コード内の文字列が5ちゃんの NG ワードになっていて書き込めないので、Pastebin にしました
- 317 名前:デフォルトの名無しさん [2020/06/05(金) 17:15:12.53 ID:O//h2yE5.net]
- 初心者です。
ある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行にまとめたいのですが、可能でしょうか。
- 318 名前:デフォルトの名無しさん [2020/06/05(金) 17:50:49.18 ID:Trob9zBU.net]
- >>316
これであってる? Get-Content C:\test\stdout.log | & { Begin { $header = $true } Process { if ($header) { $_; $header = $false } elseif ($_ -match '2020/0') { $_ } } > C:\test\stdout_bk.log
- 319 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 17:53:48.63 ID:amrr7gLk.net]
- >>315
丁寧な解説ありがとうございます。しかしうまくいかない…。 ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓ Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")
- 320 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 18:06:39 ID:S6jGROW/.net]
- >>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)
- 321 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 18:11:37 ID:S6jGROW/.net]
- >>318
$OutputDir や $AacItem.FullName にスペースが含まれてると失敗するかもしれませんので、その場合はこうでしょうか。 Start-Process "一部省略" -ArgumentList ("/c freacのパス -e sndfile-wave -d '{0}' '{1}'" -f $OutputDir,$AacItem.FullName)
- 322 名前:デフォルトの名無しさん [2020/06/05(金) 18:22:39 ID:O//h2yE5.net]
- >>317
}を1個つけると意図する結果が出力されました ありがとうございました。 復習します。
- 323 名前:デフォルトの名無しさん [2020/06/05(金) 18:52:19 ID:O//h2yE5.net]
- >>317
すみません、よろしければ少し解説いただけないでしょうか $_の使い方がいまいち理解できません。
- 324 名前:デフォルトの名無しさん [2020/06/05(金) 19:56:13.96 ID:amrr7gLk.net]
- >>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 ここの一番上で解説されているものでしょうか。
- 325 名前:デフォルトの名無しさん [2020/06/05(金) 20:50:39.26 ID:Trob9zBU.net]
- >>322
Processブロックでは $_ に各行が入ってくるので必要な時だけ出力しました $_の扱いはForEach-Objectと同じなので、そちらでたくさん例が見つかるでしょう >>323 Windows限定かもしれませんが、コマンドラインで prog arg1 arg2 arg3 と起動するプログラムならこれでいい気がします Start-Process "prog" -ArgumentList @('arg1 arg2 arg3')
- 326 名前:デフォルトの名無しさん [2020/06/05(金) 21:15:18.94 ID:Trob9zBU.net]
- 例をつけ忘れました。こんな感じ。
Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')
- 327 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 21:44:06.19 ID:amrr7gLk.net]
- Start-Process "freacのパス" -ArgumentList @('-e sndfile-wave -d $OutputDir $AacItem.FullName')
単純にこれではダメでした。
- 328 名前:デフォルトの名無しさん [2020/06/05(金) 22:10:21.57 ID:Trob9zBU.net]
- そりゃもちろんこうしないと
$args = '-e sndfile-wave -d {0} {1}' -f $OutputDir, $AacItem.FullName Start-Process "freacのパス" -ArgumentList @($args)
- 329 名前:デフォルトの名無しさん [2020/06/05(金) 22:12:15.54 ID:Trob9zBU.net]
- ってこれ >>320 に空白考慮版があるね
- 330 名前:デフォルトの名無しさん [2020/06/05(金) 22:17:17.85 ID:Trob9zBU.net]
- と思ったけど >>320 は必要ないcmd(?)経由に失敗してる?
- 331 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 23:21:02.62 ID:C2qeZTUp.net]
- >>324
もう一つご教示ください。 header変数はどこで定義されている(という表現が適切か判りませんが)か教えていただけないでしょうか
- 332 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 23:41:51.74 ID:e4Todh9J.net]
- >>317
の、Begin { $header = $true } Begin 節で、header という変数を定義して、初期値をtrue にしてるのでは?
- 333 名前:デフォルトの名無しさん mailto:sage [2020/06/05(金) 23:44:42.07 ID:C2qeZTUp.net]
- ありがとうございます。
理解できてない。無知をさらけ出してしまいました。
- 334 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 00:12:58.72 ID:7YMZq5d4.net]
- >>312
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。 UTF-8 で使えるのかどうか、不明 ひょっとして、ファイル名に、半角英数字以外を使っているのか? ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
- 335 名前:326 mailto:sage [2020/06/06(土) 00:36:27.86 ID:YeDbVwYY.net]
- >>372
すみません、それも結果は同じでした。 ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。 プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、 このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。
- 336 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 01:43:36 ID:7YMZq5d4.net]
- Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm 「powershell 文字コード 変換」で検索! 本当は、込み入った処理は、Ruby でやって、 Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき! こういうシェルで、ややこしいプログラミングは無理
- 337 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 07:05:00.74 ID:+ifRGkAL.net]
- >>312
>>251-254 のバグとは別かな?
- 338 名前:デフォルトの名無しさん [2020/06/06(土) 07:07:30 ID:3KBpE/OI.net]
- >>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 じゃないかな
- 339 名前:デフォルトの名無しさん [2020/06/06(土) 07:08:59 ID:3KBpE/OI.net]
- >>336
それだ! でもPSReadLineなしでは不便過ぎる……
- 340 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 09:15:40.96 ID:hmicP46W.net]
- PowerShellで多重ループが許されるのは小学生までだよね
- 341 名前:319 mailto:sage [2020/06/06(土) 09:23:51.93 ID:2MzuylRm.net]
- >>323
こちらでも freac を入手して試したところ、>>319 のとおりで動作してます。 私は以下のようにして実行してみました。freac は ZIP で配布されていたものです。 ※5ちゃんのNGワードに引っかかりまくって全く書き込みが出来ないため、コードは全て以下の Pastebin に記載しています https://pastebin.com/M5hD1HXj # パラメータ # 例1 実際に試したところ、freac は ※ 経由でなくても動作しますね。 # 例2 【切り分け】 Start-Process で外部
- 342 名前:の CLI コマンドを実行した場合、終了後にウィンドウが
閉じられるので切り分けが難しくなります。 そこで、「-NoNewWindow」オプションを付けて実行してみてください。 freac (又は※) が出力するエラーが、PowerShell のコンソールに表示されるはずです。 # 例3 # 例4 【-f について】 {0} と -f に関してはご指摘のとおりです。 [] - [ここ壊れてます]
- 343 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 10:08:38 ID:B/uunGh7.net]
- >>333
横レスだが、 > ?、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。 > UTF-8 で使えるのかどうか、不明 UTF-8というか、Unicodeには、一般的に使われている全ての 文字コードの全ての文字が含まれている。だから、Unicodeと呼ばれる。 > ひょっとして、ファイル名に、半角英数字以外を使っているのか? > ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ! それはNEETの発想だ。職場の共有ファイル、取引先とやりとりする ファイル等、一般社会では、ガチガチにファイル名のルールが規定 されていて自分勝手に決められない場合が多いのだよ。
- 344 名前:デフォルトの名無しさん [2020/06/06(土) 10:17:39.94 ID:3KBpE/OI.net]
- >>340
端末設定を変えられて文字化けするから Start-Process させるんでしょ -NoNewWindow で端末共有させたらエラーメッセージも化けてるんじゃ…… Start-Process のパラメーターを画面出力して Start-Process せずに exit 出力されたパラメーターが正しいか確認……かな それをスレに貼ってもらえれば即解決な気がする
- 345 名前:319 mailto:sage [2020/06/06(土) 10:55:21.17 ID:2MzuylRm.net]
- >>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 で別ウィンドウで実行すれば文字化けしない」という前提で 話を進めてきましたが、まったく関係なかったかも知れません。
- 346 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 11:30:16 ID:7wZTkIMZ.net]
- 外部コマンドの出力をpowershell側で触ったら文字化けするって話してるなら
最初にコンソール出力時のエンコーディング設定変えて $defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8 最後に戻してやればいいんじゃない [console]::OutputEncoding = $defaultEncoding
- 347 名前:デフォルトの名無しさん [2020/06/06(土) 13:53:01 ID:3KBpE/OI.net]
- ちょっと話が脇にそれるんだけど……
あれ? >>311 を読んで「表示済みの文字まで化ける」謎現象だと思ってたけど 「正常表示できてた文字を、新しく出力すると化ける」だけなの? 化けるのがコンソールアプリの出力だけで、PowerShellのその後の出力は正常なら 端末の受け入れるエンコーディングが変更されただけかも 出力関係のエンコーディングは (a) コンソールアプリの出力を PowerShell がパイプなり代入なりで受け取る場合のエンコーディング (PowerShellが持ってる) (b) 端末が受け入れるエンコーディング (端末が持ってる) があって、PowerShell自身は勝手に(b)に合わせて出力するから化けない コンソールアプリの出力は、PowerShellに食われる時は、(a)なら正常、違えば化ける 食われず直接端末に出力する時は、(b)なら正常、違えば化ける コンソールアプリに(b)だけ変更されたのなら(a)に再設定すればいい [console]::OutputEncoding を設定すると(a)と(b)の両方が設定される (a)は [console]::OutputEncoding だから [console]::OutputEncoding = [console]::OutputEncoding すれば十分な気がする
- 348 名前:326 mailto:sage [2020/06/06(土) 13:53:57 ID:YeDbVwYY.net]
- 色々ありがとうございます。
まず結論ですが、>>344さんの方法で文字化けは一応治りました。 ただ、最初の行に $defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8 を記述すると [console]::OutputEncoding = $defaultEncoding が実行されるまで日本語が全て文字化けします。 なのでfreacが実行される行の上下をこれで挟むのが一応の解決方法でしょうか。 他の方々の書き込みですが、まずStart-Processに-waitをを付ける方法では完全に動作が停止して次の処理に進みませんでした。 >>340さんの例3、4を試してみると、File Not Foundになります。 原因が気になるところではありますが、本末転倒なので>>344さんの方法でとりあえず解決したことにします。ありがとうございました。
- 349 名前:デフォルトの名無しさん [2020/06/06(土) 16:15:55 ID:3KBpE/OI.net]
- [console]::OutputEncodingの退避・復元で解決できるなら
退避なんかせずに freac(?) の実行直後に [console]::OutputEncoding = [console]::OutputEncoding 入れるだけでいい気がするけど、もういいや
- 350 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 17:37:53.88 ID:7YMZq5d4.net]
- 書き込み禁止ワードは、何かのコマンドだろ
cmd.@exe, ls @-l 外人のアプリだから、アプリ内部で、文字コードをASCII に決め打ちしてるのかも。 でも、そのアプリは、起動したPowerShellが親だとすると、子プロセスになるから、 子プロセス内で環境を変えたとしても、親プロセスに伝播しないだろ 親プロセスで環境を指定したら、子プロセスにその環境は引き継がれるけど それかそのアプリは、文字コードをバイナリにしてるとかで、 データを受け取る方がテキストで受け取ると、文字化けするとか
- 351 名前:デフォルトの名無しさん mailto:sage [2020/06/06(土) 18:47:57.73 ID:2MzuylRm.net]
- >>344
それ良いですね、勉強になります。 「俺専用ナレッジベース」にメモしときました。
- 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もこの属性がついてる
|

|