前スレ
PowerShell -Part 3
https://mevius.5ch.net/test/read.cgi/tech/1539074808/
次スレは>>980が立ててね!!
探検
PowerShell -Part 4
■ このスレッドは過去ログ倉庫に格納されています
2020/01/01(水) 16:08:31.66ID:4oQ1Kxot
269デフォルトの名無しさん
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
よろしくお願いします。
正にその通りなんですが、サーバー運用部門としてみる人数が多いので、
可能な限り整った書式で出力したい次第です。
>>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デフォルトの名無しさん
2020/05/29(金) 16:13:12.46ID:1C1s9P85 たぶん、1つ目のアプリが、3行の改行コードを出力してるからだろ
例えば、HTML みたいに、データ内の区切りに、CR・LF の改行コードを使っているものもある。
それらを出力すると、空行ができる
それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか
例えば、HTML みたいに、データ内の区切りに、CR・LF の改行コードを使っているものもある。
それらを出力すると、空行ができる
それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか
272デフォルトの名無しさん
2020/05/29(金) 16:16:40.36ID:yQdVc2qs273デフォルトの名無しさん
2020/05/29(金) 16:45:48.92ID:d1uEOplb274デフォルトの名無しさん
2020/05/29(金) 16:56:48.51ID:xfksWnzq そもそも Get-ADPrincipalGroupMembership が何個の要素をパイプラインに流してるか見てみたら?
275デフォルトの名無しさん
2020/05/29(金) 17:01:45.38ID:GJdaxgw0276デフォルトの名無しさん
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"}
力技だけど、これでどうですかね。うちの環境ではうまく行ってます。
(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
ありがとうございます!
検証してみます。
その考えは無かったです・・・
調べてみます。
>>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さんはうまくいったとのことなので、
環境が違うのでしょうか・・・?
-NoNewline でエラーになります・・・
Out-FileのパラメーターとしてNoNewLineというものが無いと表示されます。
276さんはうまくいったとのことなので、
環境が違うのでしょうか・・・?
279デフォルトの名無しさん
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"
}
じゃあ、最初の趣旨とは違ってますけどこれでどうでしょう。
"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
ありがとうございます。
すでに私に理解できる範囲を超えているのですが、、、
データを取得したい対象ユーザーは”特定のコンテナ内”です。
その場合であれば、どこを変更するようになるでしょうか?
すみません。ご教示ください。
ありがとうございます。
すでに私に理解できる範囲を超えているのですが、、、
データを取得したい対象ユーザーは”特定のコンテナ内”です。
その場合であれば、どこを変更するようになるでしょうか?
すみません。ご教示ください。
281デフォルトの名無しさん
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
}
じゃあこれが良いと思います。
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デフォルトの名無しさん
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」でググってください。
追伸。まず、
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:d1uEOplb284デフォルトの名無しさん
2020/05/30(土) 00:38:50.73ID:AsxV9jzU ふーむcsvde使った方が楽そうだな
285デフォルトの名無しさん
2020/05/30(土) 07:47:46.25ID:Z2NT1d95 PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある
286デフォルトの名無しさん
2020/05/30(土) 08:49:02.75ID:d859mrLa 結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど
PowerShellを使うことが目的になると言いたいんだろうけど
287デフォルトの名無しさん
2020/05/30(土) 10:31:28.21ID:KjUAf8QQ >>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ
288デフォルトの名無しさん
2020/05/30(土) 13:24:05.40ID:9sn/rA++ 余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?
PowerShellでプログラミングするのは認められているの?
289デフォルトの名無しさん
2020/05/30(土) 16:10:14.39ID:KjUAf8QQ >>288
会社によるだろう、としか
会社によるだろう、としか
290デフォルトの名無しさん
2020/05/30(土) 23:54:06.76ID:iu9cBMrA 合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない
291デフォルトの名無しさん
2020/05/31(日) 00:40:12.13ID:+AbQWtDJ ちなみにレジストリをいじるのは認められているの?
292デフォルトの名無しさん
2020/05/31(日) 01:57:51.20ID:81hmFEht うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。
その担当者がよく解らない人のようで、ダメと言われたことはないな。
293デフォルトの名無しさん
2020/05/31(日) 12:20:40.53ID:b/Zu62PW 管理者権限アカウントの申請は必要てのはあるよね
294デフォルトの名無しさん
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なんですが、、、
報告が遅くなりました・・・。
検証環境で実行した結果、
A列にログオンID、B列に所属するグループ1、が表示されました。
ここまではかなりいい感じだったのですが、
所属するグループの2つ目以降が出力できませんでした・・・。
2つ目以降を出力できるよう考えてみましたが、
取ってつけた知識では太刀打ちできませんでした。
すみません。2つ目以降を出す方法を教えていただけますでしょうか。
csvdeも考えたのですが、
先に形になったのがGet-ADPrincipalGroupMembershipだったので、
そちらを主軸に考えていました。
理想形が出力されればcsvdeでも全く問題ありません!
レジストリはいじれますが、あくまでもシステム管理部であるから、
という感じですね。
あー、PowerShellを使うこと、が目的になってしまってる感はありました。
理想の出力結果が出れば、フリーのツールでもOKなんですが、、、
296デフォルトの名無しさん
2020/06/01(月) 00:21:41.64ID:vdF2NbM2 余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}
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:
ファイルに書き出すものと同じ内容を画面にも出力するようにしています。
グループ名が一つだけ、というのは画面上でもでしょうか?
説明がしにくいので、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つあるユーザーを作りテストしています)
「+」は確かに抜けているところがありますね・・・。
修正して、もう一度検証してみます。
ありがとうございます!
ありがとうございます。
>>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
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に記載いただいたスクリプトをマルっとコピペで、
理想形として出力することができました!!
本当にありがとうございました!!
一文で作成しようと考えていましたが、
こんなに長いスクリプトが必要とは思いませんでした・・・。
pastebinに記載いただいたスクリプトをマルっとコピペで、
理想形として出力することができました!!
本当にありがとうございました!!
一文で作成しようと考えていましたが、
こんなに長いスクリプトが必要とは思いませんでした・・・。
301297
2020/06/02(火) 13:51:33.65ID:4gU+uBDd >>300
うまく動いたようで良かったです。
あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。
また、記述する際も省略表記はなるべく避けるようにしましたので、
ググって意味を調べるのも容易かと思います。
Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。
うまく動いたようで良かったです。
あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。
また、記述する際も省略表記はなるべく避けるようにしましたので、
ググって意味を調べるのも容易かと思います。
Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。
302デフォルトの名無しさん
2020/06/02(火) 16:16:22.57ID:e5f6kXC+ csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね
303デフォルトの名無しさん
2020/06/02(火) 18:35:36.73ID:TaVu0Z+0304300
2020/06/03(水) 17:19:22.25ID:OSlS0ZCr すみません。頑張り切れませんでした。
>>297 の出力結果に加え、
そのアカウントの有効/無効の情報を同時に取得したいと思い、
Enabledを加えてみましたが、うまく出力できませんでした。
Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?
>>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
}
これで画面には出るようになりました。
出力するファイルにも出るようにするには、、、
後ろでした。
これで
$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",')
$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段階のデータを出力することができました。
次の作業がまた待っていますが、教えていただいたことを参考に
作ってみます。
本当にありがとうございます。
解説までいただきましてありがとうございます!
ご提案のスクリプトで無事、第1段階のデータを出力することができました。
次の作業がまた待っていますが、教えていただいたことを参考に
作ってみます。
本当にありがとうございます。
308デフォルトの名無しさん
2020/06/04(木) 22:31:22.80ID:sBE+PUel powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?
309デフォルトの名無しさん
2020/06/04(木) 22:43:28.06ID:7Yb6fwZR 自分で書いたバッチファイルを置き換えるのは効果的な学習だと思う
ただ対応するコマンドを置き換えていくだけだと
オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから
Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな
ただ対応するコマンドを置き換えていくだけだと
オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから
Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな
310デフォルトの名無しさん
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
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デフォルトの名無しさん
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の処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、
FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。
以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。
処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?
312デフォルトの名無しさん
2020/06/05(金) 06:07:06.84ID:Trob9zBU コマンドラインに その@ を張り付けると その だけになるの困る
なぜか @ 単独で張り付けると @ が入るのが謎
@あ@あ だと @ああ だったりもう……
なぜか @ 単独で張り付けると @ が入るのが謎
@あ@あ だと @ああ だったりもう……
313デフォルトの名無しさん
2020/06/05(金) 08:46:16.13ID:S6jGROW/ >>311
外部コマンド(*.exe)の出力が起因する問題なのであれば、
「& 〜〜」で同一のコンソール内で実行するのではなく、
「Start-Process 〜〜〜」で実行してみてはどうでしょう。
Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、
そこで実行されます。
外部コマンド(*.exe)の出力が起因する問題なのであれば、
「& 〜〜」で同一のコンソール内で実行するのではなく、
「Start-Process 〜〜〜」で実行してみてはどうでしょう。
Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、
そこで実行されます。
314デフォルトの名無しさん
2020/06/05(金) 15:49:55.88ID:amrr7gLk >>313
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません…
Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む)
…で書式は合ってますよね?
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません…
Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む)
…で書式は合ってますよね?
315デフォルトの名無しさん
2020/06/05(金) 16:56:17.03ID:S6jGROW/ >>314
CLI の外部コマンドは ※ 上で実行しますので、Start-Process で起動するのは
あくまでも ※ です。ですので、引数として CLI の外部コマンドを指定するといいと思います。
こんなかんじですかね。
https://pastebin.com/NFDDXARP
※ コード内の文字列が5ちゃんの NG ワードになっていて書き込めないので、Pastebin にしました
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行にまとめたいのですが、可能でしょうか。
ある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
これであってる?
Get-Content C:\test\stdout.log | & { Begin { $header = $true } Process { if ($header) { $_; $header = $false } elseif ($_ -match '2020/0') { $_ } } > C:\test\stdout_bk.log
318デフォルトの名無しさん
2020/06/05(金) 17:53:48.63ID:amrr7gLk >>315
丁寧な解説ありがとうございます。しかしうまくいかない…。
ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")
丁寧な解説ありがとうございます。しかしうまくいかない…。
ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")
319デフォルトの名無しさん
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)
$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デフォルトの名無しさん
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)
$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//h2yE5322デフォルトの名無しさん
2020/06/05(金) 18:52:19.70ID:O//h2yE5323デフォルトの名無しさん
2020/06/05(金) 19:56:13.96ID:amrr7gLk >>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
ここの一番上で解説されているものでしょうか。
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デフォルトの名無しさん
2020/06/05(金) 20:50:39.26ID:Trob9zBU325デフォルトの名無しさん
2020/06/05(金) 21:15:18.94ID:Trob9zBU 例をつけ忘れました。こんな感じ。
Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')
Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')
326デフォルトの名無しさん
2020/06/05(金) 21:44:06.19ID:amrr7gLk Start-Process "freacのパス" -ArgumentList @('-e sndfile-wave -d $OutputDir $AacItem.FullName')
単純にこれではダメでした。
単純にこれではダメでした。
327デフォルトの名無しさん
2020/06/05(金) 22:10:21.57ID:Trob9zBU そりゃもちろんこうしないと
$args = '-e sndfile-wave -d {0} {1}' -f $OutputDir, $AacItem.FullName
Start-Process "freacのパス" -ArgumentList @($args)
$args = '-e sndfile-wave -d {0} {1}' -f $OutputDir, $AacItem.FullName
Start-Process "freacのパス" -ArgumentList @($args)
328デフォルトの名無しさん
2020/06/05(金) 22:12:15.54ID:Trob9zBU ってこれ >>320 に空白考慮版があるね
329デフォルトの名無しさん
2020/06/05(金) 22:17:17.85ID:Trob9zBU と思ったけど >>320 は必要ないcmd(?)経由に失敗してる?
330デフォルトの名無しさん
2020/06/05(金) 23:21:02.62ID:C2qeZTUp331デフォルトの名無しさん
2020/06/05(金) 23:41:51.74ID:e4Todh9J332デフォルトの名無しさん
2020/06/05(金) 23:44:42.07ID:C2qeZTUp ありがとうございます。
理解できてない。無知をさらけ出してしまいました。
理解できてない。無知をさらけ出してしまいました。
333デフォルトの名無しさん
2020/06/06(土) 00:12:58.72ID:7YMZq5d4 >>312
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
UTF-8 で使えるのかどうか、不明
ひょっとして、ファイル名に、半角英数字以外を使っているのか?
ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
UTF-8 で使えるのかどうか、不明
ひょっとして、ファイル名に、半角英数字以外を使っているのか?
ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
334326
2020/06/06(土) 00:36:27.86ID:YeDbVwYY >>372
すみません、それも結果は同じでした。
ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。
プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、
このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。
すみません、それも結果は同じでした。
ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。
プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、
このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。
335デフォルトの名無しさん
2020/06/06(土) 01:43:36.18ID:7YMZq5d4 Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
「powershell 文字コード 変換」で検索!
本当は、込み入った処理は、Ruby でやって、
Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき!
こういうシェルで、ややこしいプログラミングは無理
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm
「powershell 文字コード 変換」で検索!
本当は、込み入った処理は、Ruby でやって、
Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき!
こういうシェルで、ややこしいプログラミングは無理
336デフォルトの名無しさん
2020/06/06(土) 07:05:00.74ID:+ifRGkAL337デフォルトの名無しさん
2020/06/06(土) 07:07:30.54ID:3KBpE/OI >>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
じゃないかな
ようするに
$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デフォルトの名無しさん
2020/06/06(土) 07:08:59.48ID:3KBpE/OI339デフォルトの名無しさん
2020/06/06(土) 09:15:40.96ID:hmicP46W PowerShellで多重ループが許されるのは小学生までだよね
340319
2020/06/06(土) 09:23:51.93ID:2MzuylRm >>323
こちらでも freac を入手して試したところ、>>319 のとおりで動作してます。
私は以下のようにして実行してみました。freac は ZIP で配布されていたものです。
※5ちゃんのNGワードに引っかかりまくって全く書き込みが出来ないため、コードは全て以下の Pastebin に記載しています
https://pastebin.com/M5hD1HXj
# パラメータ
# 例1
実際に試したところ、freac は ※ 経由でなくても動作しますね。
# 例2
【切り分け】
Start-Process で外部の CLI コマンドを実行した場合、終了後にウィンドウが
閉じられるので切り分けが難しくなります。
そこで、「-NoNewWindow」オプションを付けて実行してみてください。
freac (又は※) が出力するエラーが、PowerShell のコンソールに表示されるはずです。
# 例3
# 例4
【-f について】
{0} と -f に関してはご指摘のとおりです。
こちらでも freac を入手して試したところ、>>319 のとおりで動作してます。
私は以下のようにして実行してみました。freac は ZIP で配布されていたものです。
※5ちゃんのNGワードに引っかかりまくって全く書き込みが出来ないため、コードは全て以下の Pastebin に記載しています
https://pastebin.com/M5hD1HXj
# パラメータ
# 例1
実際に試したところ、freac は ※ 経由でなくても動作しますね。
# 例2
【切り分け】
Start-Process で外部の CLI コマンドを実行した場合、終了後にウィンドウが
閉じられるので切り分けが難しくなります。
そこで、「-NoNewWindow」オプションを付けて実行してみてください。
freac (又は※) が出力するエラーが、PowerShell のコンソールに表示されるはずです。
# 例3
# 例4
【-f について】
{0} と -f に関してはご指摘のとおりです。
341デフォルトの名無しさん
2020/06/06(土) 10:08:38.99ID:B/uunGh7 >>333
横レスだが、
> @、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
> UTF-8 で使えるのかどうか、不明
UTF-8というか、Unicodeには、一般的に使われている全ての
文字コードの全ての文字が含まれている。だから、Unicodeと呼ばれる。
> ひょっとして、ファイル名に、半角英数字以外を使っているのか?
> ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
それはNEETの発想だ。職場の共有ファイル、取引先とやりとりする
ファイル等、一般社会では、ガチガチにファイル名のルールが規定
されていて自分勝手に決められない場合が多いのだよ。
横レスだが、
> @、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
> UTF-8 で使えるのかどうか、不明
UTF-8というか、Unicodeには、一般的に使われている全ての
文字コードの全ての文字が含まれている。だから、Unicodeと呼ばれる。
> ひょっとして、ファイル名に、半角英数字以外を使っているのか?
> ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
それはNEETの発想だ。職場の共有ファイル、取引先とやりとりする
ファイル等、一般社会では、ガチガチにファイル名のルールが規定
されていて自分勝手に決められない場合が多いのだよ。
342デフォルトの名無しさん
2020/06/06(土) 10:17:39.94ID:3KBpE/OI >>340
端末設定を変えられて文字化けするから Start-Process させるんでしょ
-NoNewWindow で端末共有させたらエラーメッセージも化けてるんじゃ……
Start-Process のパラメーターを画面出力して Start-Process せずに exit
出力されたパラメーターが正しいか確認……かな
それをスレに貼ってもらえれば即解決な気がする
端末設定を変えられて文字化けするから Start-Process させるんでしょ
-NoNewWindow で端末共有させたらエラーメッセージも化けてるんじゃ……
Start-Process のパラメーターを画面出力して Start-Process せずに exit
出力されたパラメーターが正しいか確認……かな
それをスレに貼ってもらえれば即解決な気がする
343319
2020/06/06(土) 10:55:21.17ID:2MzuylRm >>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 で別ウィンドウで実行すれば文字化けしない」という前提で
話を進めてきましたが、まったく関係なかったかも知れません。
すみません、これまでの 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デフォルトの名無しさん
2020/06/06(土) 11:30:16.97ID:7wZTkIMZ 外部コマンドの出力をpowershell側で触ったら文字化けするって話してるなら
最初にコンソール出力時のエンコーディング設定変えて
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
最後に戻してやればいいんじゃない
[console]::OutputEncoding = $defaultEncoding
最初にコンソール出力時のエンコーディング設定変えて
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
最後に戻してやればいいんじゃない
[console]::OutputEncoding = $defaultEncoding
345デフォルトの名無しさん
2020/06/06(土) 13:53:01.40ID:3KBpE/OI ちょっと話が脇にそれるんだけど……
あれ?
>>311 を読んで「表示済みの文字まで化ける」謎現象だと思ってたけど
「正常表示できてた文字を、新しく出力すると化ける」だけなの?
化けるのがコンソールアプリの出力だけで、PowerShellのその後の出力は正常なら
端末の受け入れるエンコーディングが変更されただけかも
出力関係のエンコーディングは
(a) コンソールアプリの出力を PowerShell がパイプなり代入なりで受け取る場合のエンコーディング (PowerShellが持ってる)
(b) 端末が受け入れるエンコーディング (端末が持ってる)
があって、PowerShell自身は勝手に(b)に合わせて出力するから化けない
コンソールアプリの出力は、PowerShellに食われる時は、(a)なら正常、違えば化ける
食われず直接端末に出力する時は、(b)なら正常、違えば化ける
コンソールアプリに(b)だけ変更されたのなら(a)に再設定すればいい
[console]::OutputEncoding を設定すると(a)と(b)の両方が設定される
(a)は [console]::OutputEncoding だから
[console]::OutputEncoding = [console]::OutputEncoding
すれば十分な気がする
あれ?
>>311 を読んで「表示済みの文字まで化ける」謎現象だと思ってたけど
「正常表示できてた文字を、新しく出力すると化ける」だけなの?
化けるのがコンソールアプリの出力だけで、PowerShellのその後の出力は正常なら
端末の受け入れるエンコーディングが変更されただけかも
出力関係のエンコーディングは
(a) コンソールアプリの出力を PowerShell がパイプなり代入なりで受け取る場合のエンコーディング (PowerShellが持ってる)
(b) 端末が受け入れるエンコーディング (端末が持ってる)
があって、PowerShell自身は勝手に(b)に合わせて出力するから化けない
コンソールアプリの出力は、PowerShellに食われる時は、(a)なら正常、違えば化ける
食われず直接端末に出力する時は、(b)なら正常、違えば化ける
コンソールアプリに(b)だけ変更されたのなら(a)に再設定すればいい
[console]::OutputEncoding を設定すると(a)と(b)の両方が設定される
(a)は [console]::OutputEncoding だから
[console]::OutputEncoding = [console]::OutputEncoding
すれば十分な気がする
346326
2020/06/06(土) 13:53:57.50ID:YeDbVwYY 色々ありがとうございます。
まず結論ですが、>>344さんの方法で文字化けは一応治りました。
ただ、最初の行に
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
を記述すると
[console]::OutputEncoding = $defaultEncoding
が実行されるまで日本語が全て文字化けします。
なのでfreacが実行される行の上下をこれで挟むのが一応の解決方法でしょうか。
他の方々の書き込みですが、まずStart-Processに-waitをを付ける方法では完全に動作が停止して次の処理に進みませんでした。
>>340さんの例3、4を試してみると、File Not Foundになります。
原因が気になるところではありますが、本末転倒なので>>344さんの方法でとりあえず解決したことにします。ありがとうございました。
まず結論ですが、>>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デフォルトの名無しさん
2020/06/06(土) 16:15:55.11ID:3KBpE/OI [console]::OutputEncodingの退避・復元で解決できるなら
退避なんかせずに freac(?) の実行直後に
[console]::OutputEncoding = [console]::OutputEncoding
入れるだけでいい気がするけど、もういいや
退避なんかせずに freac(?) の実行直後に
[console]::OutputEncoding = [console]::OutputEncoding
入れるだけでいい気がするけど、もういいや
348デフォルトの名無しさん
2020/06/06(土) 17:37:53.88ID:7YMZq5d4 書き込み禁止ワードは、何かのコマンドだろ
cmd.@exe, ls @-l
外人のアプリだから、アプリ内部で、文字コードをASCII に決め打ちしてるのかも。
でも、そのアプリは、起動したPowerShellが親だとすると、子プロセスになるから、
子プロセス内で環境を変えたとしても、親プロセスに伝播しないだろ
親プロセスで環境を指定したら、子プロセスにその環境は引き継がれるけど
それかそのアプリは、文字コードをバイナリにしてるとかで、
データを受け取る方がテキストで受け取ると、文字化けするとか
cmd.@exe, ls @-l
外人のアプリだから、アプリ内部で、文字コードをASCII に決め打ちしてるのかも。
でも、そのアプリは、起動したPowerShellが親だとすると、子プロセスになるから、
子プロセス内で環境を変えたとしても、親プロセスに伝播しないだろ
親プロセスで環境を指定したら、子プロセスにその環境は引き継がれるけど
それかそのアプリは、文字コードをバイナリにしてるとかで、
データを受け取る方がテキストで受け取ると、文字化けするとか
349デフォルトの名無しさん
2020/06/06(土) 18:47:57.73ID:2MzuylRm350デフォルトの名無しさん
2020/06/09(火) 16:01:29.47ID:DriXa/wG 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;
@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デフォルトの名無しさん
2020/06/09(火) 16:26:23.01ID:DriXa/wG Start-Sleep -Seconds 10;
mspaint "010371104.gif";
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;
mspaint "010371104.gif";
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;
352300
2020/06/11(木) 17:55:09.10ID:fJWIdGby 教えてください。
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)
となるでしょうか?
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デフォルトの名無しさん
2020/06/12(金) 09:35:33.43ID:IRe5SA+Y354デフォルトの名無しさん
2020/06/12(金) 10:07:01.73ID:tUTXhBxn >>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)
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)
355354
2020/06/12(金) 10:07:36.18ID:tUTXhBxn まとめるとこうです(ファイル書き出しの部分は省略)。
$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
}
$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
}
356354
2020/06/12(金) 10:09:03.73ID:tUTXhBxn ただし、私自身も 10 年くらい前に AD の情報から LastLogon を取得することを検証したのですが、以下の理由から断念しました。
・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
(各クライアントが認証要求を行ったドメコンでしか更新されず、各ドメコン間で同期されない)
・ユーザが PC でログオンしたタイミング以外でも、LastLogon は更新される (ログオフや長時間離席していた場合など)
正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。
私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。
・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
(各クライアントが認証要求を行ったドメコンでしか更新されず、各ドメコン間で同期されない)
・ユーザが PC でログオンしたタイミング以外でも、LastLogon は更新される (ログオフや長時間離席していた場合など)
正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。
私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。
357354
2020/06/12(金) 10:22:05.71ID:tUTXhBxn 追伸。
>・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。
それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。
>・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。
それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。
358デフォルトの名無しさん
2020/06/12(金) 16:10:21.89ID:6Yfh5mGy Power Shellってアプリケーション作れんですか?
359デフォルトの名無しさん
2020/06/12(金) 18:18:25.00ID:Jkz+gOtE アプリケーションって何?
360デフォルトの名無しさん
2020/06/12(金) 18:44:27.27ID:/dqGhWwV361デフォルトの名無しさん
2020/06/12(金) 18:45:58.91ID:gCbNSmDh window表示するイベントドリブンなexeのことじゃないかな
362デフォルトの名無しさん
2020/06/12(金) 18:55:49.90ID:tr06rVi2 もうそれ最初からC#でやれば良くね?っていう
363デフォルトの名無しさん
2020/06/12(金) 19:42:03.65ID:sTuFS1ZK 大部分C#で書いてパワシェで書きやすい部分だけデリゲートでインジェクションするパターンなら多用しとるわ
364デフォルトの名無しさん
2020/06/12(金) 20:21:21.09ID:6LTYSgwt ただのコマンドプロンプトだと思ってた
スゲーワケわからん
スゲーワケわからん
365デフォルトの名無しさん
2020/06/12(金) 20:53:03.96ID:tSkvENox オブジェクト指向シェル言語だからな
366300
2020/06/14(日) 00:11:44.27ID:JXZUsp2d >>354
ありがとうございます!
検証環境で無事出力確認できました!
しかし最終ログイン日時の取得は難しいんですね。
今回はそれほど精密な値は求められないので良かったですが、
ドメコンには注意なんですね。
ありがとうございます!
検証環境で無事出力確認できました!
しかし最終ログイン日時の取得は難しいんですね。
今回はそれほど精密な値は求められないので良かったですが、
ドメコンには注意なんですね。
367デフォルトの名無しさん
2020/06/15(月) 19:20:43.36ID:KO8t20+1 ドメコンにリアルタイム性は期待できないと思ったがやっぱそうだよな
368デフォルトの名無しさん
2020/06/16(火) 08:27:08.93ID:flP7FZNr LastLogin を各DCから拾って最新値を取り出すスクリプトあったよ
https://gallery.technet.microsoft.com/scriptcenter/Get-Last-Logon-for-Users-c8e3eab2
https://gallery.technet.microsoft.com/scriptcenter/Get-Last-Logon-for-Users-c8e3eab2
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 日経平均の下落率3%超す、財政懸念で長期金利上昇 ★2 [お断り★]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 【画像】外務省局長「この度はうちの🦎がすみません…」中国「……」 [165981677]
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 外務省局長、よくわからないまま帰国へ [834922174]
