PowerShell -Part 4

■ このスレッドは過去ログ倉庫に格納されています
2020/01/01(水) 16:08:31.66ID:4oQ1Kxot
前スレ
PowerShell -Part 3
https://mevius.5ch.net/test/read.cgi/tech/1539074808/

次スレは>>980が立ててね!!
2020/05/04(月) 17:06:49.01ID:LlR+aKwZ
パスの角括弧の扱いはpsの一番いけてないとこだからね
角括弧のみをエスケープする場合は次のようにする

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

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

move "C:\test\*" "C:\test2" -Filter "$hoge.*"
2020/05/04(月) 18:54:18.78ID:hArtKUaR
>>222
なるほど。 [  だけエスケープすれば大丈夫なんですね

ようやく引っかかってた所から脱出できそうです
皆さん大変ありがとうございました
2020/05/06(水) 21:11:41.78ID:prm5gj7H
これってクラス多めのオブジェクト指向でやるべきなのか、
高度な関数多めのパイプライン志向(?)でやるべきなのか、
どっちがいいのかな
2020/05/07(木) 01:36:33.14ID:k5uIH00p
オブジェクト使い回す設計のほうが読みやすそうならそうする

高度な関数ってどんなんやねん
2020/05/07(木) 02:22:01.91ID:GVyLSOna
高度な関数ってずいぶん懐かしい単語だな、普通に関数でいいと思うよ
全ては無理に和訳しようとしたMSが悪い
2020/05/07(木) 08:07:17.17ID:O8jL8wQb
>>224
本来のシェル的な使い方がメインなら
関数でパイプライン多用した方が使いやすい

普通のアプリに近いものを作る場合には
クラスでOOPした方が使いやすい
2020/05/07(木) 08:26:30.42ID:H2g0PsUL
PSのクラスって判らんからコード量増えたらC#埋め込むわ
229843
垢版 |
2020/05/07(木) 09:38:19.28ID:1Drf/TcZ
PSのクラスって機能が足りないとかはあるけど特に難しい所はないと思うが…
230デフォルトの名無しさん
垢版 |
2020/05/07(木) 23:47:47.43ID:cnY/r+Lf
教えてください。
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を使うのが良さそう
とは思ったのですが、うまく抽出できませんでした。
2020/05/08(金) 01:23:43.35ID:GBARQ9Uf
Select-Object name で name プロパティしか抽出できてないとか?
2020/05/08(金) 12:22:27.69ID:Fn4yfVbS
>>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
2020/05/08(金) 13:46:42.62ID:fxtS7XW6
GetNewClosureで作ったクロージャからトップレベルに定義した関数にアクセスできんのだがスコープどうなってんだ?

function Hoge () {}

{ Hoge }.Invoke() #うごく
{ Hoge }.GetNewClosure().Invoke() #うごかん
2020/05/08(金) 15:09:04.88ID:eZ8FT/L5
またキチガイが湧いてきたか
NG しやすいように、コテハン付けて欲しいわ
2020/05/10(日) 09:05:34.07ID:oQrk4XHl
>>233
トップレベルと呼んでいるのは、(仮に) Hoge.ps1 の Script スコープでいいよね?

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

スコープの親子関係:
[Global] - [Script(Hoge.ps1)] <== Hoge 関数の定義されているスコープ
[Global] - [Script(動的モジュール)] - [Local] <== 問題のクロージャ内のスコープ
2020/05/10(日) 15:23:52.95ID:JjPR8mXC
Ruby で作った!
2020/05/11(月) 21:37:49.46ID:41JmE2xy
>>235
なるほど
PowerShellって便利で面白いけど時々変な癖あるよな
2020/05/12(火) 21:11:03.62ID:2xTEfvW8
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.
2020/05/15(金) 09:02:37.24ID:B71gCNON
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
2020/05/15(金) 09:54:10.26ID:JVqn6ak1
昔ながらのPowerShellとPowerShell Coreって共存できんの?
PowerShell CoreってクロスプラットフォームだけどWindowsの管理コマンドとか旧PowerShell資産とかとどれぐらい互換性あるのかな
2020/05/15(金) 12:11:51.23ID:spGK6l8f
>>240
共存できる。Core をインストールしても、PowerShell 5.1 を置き換えない。
インストールされるパスが違うし、そもそも実行ファイルのファイル名も違うので。
2020/05/15(金) 21:26:49.08ID:OwQtRj4C
Windows PowerShell 5.1 から PowerShell 7 への移行
https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/migrating-from-windows-powershell-51-to-powershell-7
2020/05/16(土) 02:28:51.69ID:LVL/9uGV
むしろCore版を上書きしてほしんだが

Powershellで検索すると大量に出てきてうざいし、
Win+Xのショートカットから起動したいし
2020/05/16(土) 02:29:08.79ID:LVL/9uGV
逆、Core版で、ね
2020/05/16(土) 21:17:04.74ID:I3dvVBqE
>>243
タスクバーにピン留めでは駄目なの?
2020/05/19(火) 11:55:42.51ID:1h+Pwucu
C#クラスFooをAdd-Typeして
Fooを継承するpowershell class Barを定義しようとするとVSCodeの静的解析に型Fooが無いって言われる
実行時には問題なく動作するんだけど鬱陶しい
どうにかならんのかこれ
2020/05/19(火) 16:52:18.17ID:JYrNQD+Z
>>246
現状では継承クラスを別ファイルにして読み込み元で先にadd-typeしてから遅延読み込みするしかない
core系統ではusing assemblyの実装が保留されてるから
将来的にはおそらくそこをクリアしたusing assemblyが実装されると思うけど

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

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

今の段階で最善と思われる方法はマニフェストモジュールにして
psd1内でRequiredAssembliesに継承元のアセンブリを設定すること
それをusing moduleで読み込むようにすれば最も自然に使える
2020/05/19(火) 20:59:56.70ID:JYrNQD+Z
>>246
ごめんよく読んだら的外れなレスだったわ
C#のコードをadd-typeするってことね
.NETのクラスを継承すると勘違いした
2020/05/19(火) 21:17:33.27ID:qw+UaCoQ
Suppressing Rules
https://github.com/PowerShell/PSScriptAnalyzer#introduction
2020/05/19(火) 21:19:20.10ID:qw+UaCoQ
urlおかしかったからやり直し

https://github.com/PowerShell/PSScriptAnalyzer#suppressing-rules
2020/05/25(月) 18:56:03.39ID:1KC3re4i
教えてください。Windows10です。
クリップボードに次の文字をコピーします。
Get-ChildItem -Path "c:\doc★"
これをPowershellに貼り付けると、勝手に★が削除されて
Get-ChildItem -Path "c:\doc"
になってしまいます。正常に貼り付けるには、
どのようにすればよろしいでしょうか?
2020/05/25(月) 20:12:08.85ID:zwsFaYDZ
Powershellコンソールのバグらしいよ
2020/05/26(火) 00:18:53.47ID:oj/EjNC2
そうですか。バグなのですか。ありがとうございました。
2020/05/26(火) 08:41:22.73ID:Ay3ltgvo
コンソールじゃなくてPSReadLineのバグでしょ
Remove-Module PSReadLine を実行した後なら普通に貼り付けできる
2020/05/26(火) 08:45:00.47ID:TWTiQG7J
>>251
知らんかった、こんなバグが有ったのか。ウチの環境でも再現した。

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

これを貼り付けると、

echo ''
echo ''

こうなったわ。
2020/05/26(火) 08:56:54.86ID:lYnWhySi
>>254
ホントだ、治った
2020/05/26(火) 10:38:39.59ID:DUXfe990
なん…だと…
2020/05/26(火) 11:36:52.76ID:fIo6Jhad
スクリプトならok?
2020/05/26(火) 15:52:47.39ID:q+hnim2U
スクリプトならOKだよ
画面を色分けする処理がバグってたはず
2020/05/26(火) 19:42:26.62ID:wDroaLCo
echo 'yatta-man★ko-hi-★raita-'
いやー、もう少しで社会的に抹殺されるところだったよ
2020/05/27(水) 18:03:22.45ID:8S2S1tlw
htmlのdiffでまともな方法ない?
262デフォルトの名無しさん
垢版 |
2020/05/28(木) 16:49:06.82ID:NkjBuM4x
Get-ADPrincipalGroupMembership -identity testuser1 | Select-Object name | ・・・

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

なぜでしょうか・・・?
2020/05/29(金) 08:40:18.33ID:GJdaxgw0
>>262
shell ってどういう意味ですか?
2020/05/29(金) 09:24:43.84ID:AL+gVKfO
https://ejje.weblio.jp/content/shell

shellとは
貝殻、(カキの)殻、(カメ・エビ・カニなどの)甲羅、(カブトムシなどの)硬い外皮、(鳥の卵の)殻、(果実・種子などの)殻、(豆類の)さや、(建物・乗り物などの)骨組み、外郭、船体
265デフォルトの名無しさん
垢版 |
2020/05/29(金) 09:26:47.27ID:d1uEOplb
>>263
すみません。
PowerShellスクリプト、です。
2020/05/29(金) 12:54:04.01ID:1C1s9P85
ログファイルはフィルターして見るから、どうでも良くね?

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

数年保存して捨てるだけの、ログファイルの書式にこだわっても、仕方ない
2020/05/29(金) 14:16:17.31ID:8xO19nFy
なぜそうなるかを知りたいってことだろ
>>262がどういうスクリプトを流してるのかさっぱり要領を得ないから原因は全くわからんけど
2020/05/29(金) 15:24:58.90ID:GJdaxgw0
>>265
(1)1回目と2回目は、パラメータが違うのですか?それとも、全く同じ内容で実行のタイミングが違うだけですか?
(2)何度も尋ねるのは煩雑なので、可能であれば端折らずに記述内容を全て記載してもらえませんか?
2020/05/29(金) 15:38:08.24ID:QVnkNeSg
まあでも、センスは出るよね
270デフォルトの名無しさん
垢版 |
2020/05/29(金) 15:53:45.83ID:d1uEOplb
>>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

よろしくお願いします。
2020/05/29(金) 16:13:12.46ID:1C1s9P85
たぶん、1つ目のアプリが、3行の改行コードを出力してるからだろ

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

それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか
2020/05/29(金) 16:16:40.36ID:yQdVc2qs
>>262 > というshellを2つ続けて流すと
>>270 > 以下二つを、同時に流しました。

相手を混乱させて遊んでるっていう理解でいい?
273デフォルトの名無しさん
垢版 |
2020/05/29(金) 16:45:48.92ID:d1uEOplb
>>271
 バグですか・・・
 必要なデータは取得できているんですが、
 その下に不必要な空行が発生するのは、もう、仕方ないんですかね・・・

>>272
 混乱させるつもりはなかったのですが、
 >>270のスクリプトは、エクセルで作成をしました。
 (A1に1つ目のスクリプト、A2に2つ目のスクリプト・・・という感じです)
 作成したスクリプトの全てをコピーし、PowerShellに貼り付ける、
 という作業をしました。
2020/05/29(金) 16:56:48.51ID:xfksWnzq
そもそも Get-ADPrincipalGroupMembership が何個の要素をパイプラインに流してるか見てみたら?
2020/05/29(金) 17:01:45.38ID:GJdaxgw0
>>270
ユーザが所属しているグループをファイルに吐きたいわけですよね。
1ユーザごとに1ファイル、グループは横に並べて出力、という条件は必須ですか?
2020/05/29(金) 17:11:08.51ID:GJdaxgw0
>>273
力技だけど、これでどうですかね。うちの環境ではうまく行ってます。
(Get-ADPrincipalGroupMembership -identity testuser111 ).name | %{"$_`t"| Out-File -NoNewline -Encoding ascii -Append -FilePath "C:\a.txt"}
277デフォルトの名無しさん
垢版 |
2020/05/29(金) 17:38:52.98ID:d1uEOplb
>>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デフォルトの名無しさん
垢版 |
2020/05/29(金) 18:01:42.95ID:d1uEOplb
>>276
 -NoNewline でエラーになります・・・
 Out-FileのパラメーターとしてNoNewLineというものが無いと表示されます。

 276さんはうまくいったとのことなので、
 環境が違うのでしょうか・・・?
2020/05/29(金) 18:11:11.49ID:GJdaxgw0
>>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デフォルトの名無しさん
垢版 |
2020/05/29(金) 18:22:56.82ID:d1uEOplb
>>279
 ありがとうございます。
 すでに私に理解できる範囲を超えているのですが、、、

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

 その場合であれば、どこを変更するようになるでしょうか?
 すみません。ご教示ください。
2020/05/29(金) 18:44:52.24ID:GJdaxgw0
>>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
}
2020/05/29(金) 18:48:35.39ID:GJdaxgw0
>>280
追伸。まず、
Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
だけ実行して希望通りのユーザオブジェクトが出力されることを確認してください。
"OU=Newusers,DC=example,DC=local"の記述方法がキモになりますが、
よくわからない場合は「distinguished name」でググってください。
283デフォルトの名無しさん
垢版 |
2020/05/29(金) 23:38:38.95ID:d1uEOplb
>>281
>>282
 本当にありがとうございます!
 今は検証環境に繋げないので、明日、試してみます!
 また結果を明日の夜します!
2020/05/30(土) 00:38:50.73ID:AsxV9jzU
ふーむcsvde使った方が楽そうだな
2020/05/30(土) 07:47:46.25ID:Z2NT1d95
PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある
2020/05/30(土) 08:49:02.75ID:d859mrLa
結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど
2020/05/30(土) 10:31:28.21ID:KjUAf8QQ
>>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ
2020/05/30(土) 13:24:05.40ID:9sn/rA++
余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?
2020/05/30(土) 16:10:14.39ID:KjUAf8QQ
>>288
会社によるだろう、としか
2020/05/30(土) 23:54:06.76ID:iu9cBMrA
合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない
2020/05/31(日) 00:40:12.13ID:+AbQWtDJ
ちなみにレジストリをいじるのは認められているの?
2020/05/31(日) 01:57:51.20ID:81hmFEht
うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。
2020/05/31(日) 12:20:40.53ID:b/Zu62PW
管理者権限アカウントの申請は必要てのはあるよね
2020/05/31(日) 17:04:24.67ID:rtfQfZlf
部のPC担当じゃなければせいぜいパワーユーザーだと思うけど
295デフォルトの名無しさん
垢版 |
2020/05/31(日) 23:56:26.74ID:iB7Renkw
>>281
報告が遅くなりました・・・。
検証環境で実行した結果、
A列にログオンID、B列に所属するグループ1、が表示されました。
ここまではかなりいい感じだったのですが、
所属するグループの2つ目以降が出力できませんでした・・・。
2つ目以降を出力できるよう考えてみましたが、
取ってつけた知識では太刀打ちできませんでした。
すみません。2つ目以降を出す方法を教えていただけますでしょうか。

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

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

あー、PowerShellを使うこと、が目的になってしまってる感はありました。
理想の出力結果が出れば、フリーのツールでもOKなんですが、、、
2020/06/01(月) 00:21:41.64ID:vdF2NbM2
余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}
297281
垢版 |
2020/06/01(月) 08:58:32.48ID:Pn8bHbMj
>>295
説明がしにくいので、pastebin に貼りました。
https://pastebin.com/g40VkBXe

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

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

確認2:
ファイルに書き出すものと同じ内容を画面にも出力するようにしています。
グループ名が一つだけ、というのは画面上でもでしょうか?
298デフォルトの名無しさん
垢版 |
2020/06/01(月) 20:38:24.16ID:6WpvIjeC
>>296
 ありがとうございます。
>>270に記載のスクリプトを編集して、
 Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()} >> C:\work\logtest0528.csv
 という感じになるでしょうか?

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

ありがとうございます!
299デフォルトの名無しさん
垢版 |
2020/06/01(月) 23:33:53.68ID:5NIHbXOS
「慶應卒の学歴なんていらない」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デフォルトの名無しさん
垢版 |
2020/06/02(火) 12:00:25.43ID:TaVu0Z+0
>>297
 pastebinに記載いただいたスクリプトをマルっとコピペで、
 理想形として出力することができました!!
 本当にありがとうございました!!

 一文で作成しようと考えていましたが、
 こんなに長いスクリプトが必要とは思いませんでした・・・。
301297
垢版 |
2020/06/02(火) 13:51:33.65ID:4gU+uBDd
>>300
うまく動いたようで良かったです。

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

Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。
2020/06/02(火) 16:16:22.57ID:e5f6kXC+
csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね
303デフォルトの名無しさん
垢版 |
2020/06/02(火) 18:35:36.73ID:TaVu0Z+0
>>301
 本当にありがとうございました。
 次にこの出力したデータを加工して、今度はインポートする作業が待っていますが、
 調べて頑張ってみます。

>>302
 はい。家庭で検証ができないのでテストが大変でした。
 csvdeも今後使うことがありそうですので、注意してみておきます。
304300
垢版 |
2020/06/03(水) 17:19:22.25ID:OSlS0ZCr
すみません。頑張り切れませんでした。
>>297 の出力結果に加え、
そのアカウントの有効/無効の情報を同時に取得したいと思い、
Enabledを加えてみましたが、うまく出力できませんでした。

Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?
305300
垢版 |
2020/06/03(水) 18:10:05.65ID:OSlS0ZCr
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
}

これで画面には出るようになりました。
出力するファイルにも出るようにするには、、、
306297
垢版 |
2020/06/04(木) 11:06:18.52ID:TeZKrupD
>>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",')
307300
垢版 |
2020/06/04(木) 21:01:19.40ID:7LqTXEt1
>>306
解説までいただきましてありがとうございます!
ご提案のスクリプトで無事、第1段階のデータを出力することができました。

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

本当にありがとうございます。
2020/06/04(木) 22:31:22.80ID:sBE+PUel
powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?
2020/06/04(木) 22:43:28.06ID:7Yb6fwZR
自分で書いたバッチファイルを置き換えるのは効果的な学習だと思う
ただ対応するコマンドを置き換えていくだけだと
オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから
Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな
2020/06/04(木) 23:21:46.10ID:hC0MsN2x
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
2020/06/05(金) 01:16:33.38ID:amrr7gLk
ttps://heetnote.com/semi-auto-ps/#more-2973
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、
FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。
以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。
処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?
312デフォルトの名無しさん
垢版 |
2020/06/05(金) 06:07:06.84ID:Trob9zBU
コマンドラインに その@ を張り付けると その だけになるの困る
なぜか @ 単独で張り付けると @ が入るのが謎

@あ@あ だと @ああ だったりもう……
2020/06/05(金) 08:46:16.13ID:S6jGROW/
>>311
外部コマンド(*.exe)の出力が起因する問題なのであれば、
「& 〜〜」で同一のコンソール内で実行するのではなく、
「Start-Process 〜〜〜」で実行してみてはどうでしょう。
Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、
そこで実行されます。
2020/06/05(金) 15:49:55.88ID:amrr7gLk
>>313
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません…
Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む)
…で書式は合ってますよね?
2020/06/05(金) 16:56:17.03ID:S6jGROW/
>>314
CLI の外部コマンドは ※ 上で実行しますので、Start-Process で起動するのは
あくまでも ※ です。ですので、引数として CLI の外部コマンドを指定するといいと思います。

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

※ コード内の文字列が5ちゃんの NG ワードになっていて書き込めないので、Pastebin にしました
316デフォルトの名無しさん
垢版 |
2020/06/05(金) 17:15:12.53ID:O//h2yE5
初心者です。
ある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デフォルトの名無しさん
垢版 |
2020/06/05(金) 17:50:49.18ID:Trob9zBU
>>316
これであってる?
Get-Content C:\test\stdout.log | & { Begin { $header = $true } Process { if ($header) { $_; $header = $false } elseif ($_ -match '2020/0') { $_ } } > C:\test\stdout_bk.log
2020/06/05(金) 17:53:48.63ID:amrr7gLk
>>315
丁寧な解説ありがとうございます。しかしうまくいかない…。
ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")
2020/06/05(金) 18:06:39.45ID:S6jGROW/
>>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)
2020/06/05(金) 18:11:37.96ID:S6jGROW/
>>318
$OutputDir や $AacItem.FullName にスペースが含まれてると失敗するかもしれませんので、その場合はこうでしょうか。
Start-Process "一部省略" -ArgumentList ("/c freacのパス -e sndfile-wave -d '{0}' '{1}'" -f $OutputDir,$AacItem.FullName)
321デフォルトの名無しさん
垢版 |
2020/06/05(金) 18:22:39.72ID:O//h2yE5
>>317

}を1個つけると意図する結果が出力されました
ありがとうございました。
復習します。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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