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/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個つけると意図する結果が出力されました
ありがとうございました。
復習します。
322デフォルトの名無しさん
垢版 |
2020/06/05(金) 18:52:19.70ID:O//h2yE5
>>317
すみません、よろしければ少し解説いただけないでしょうか
$_の使い方がいまいち理解できません。
323デフォルトの名無しさん
垢版 |
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
ここの一番上で解説されているものでしょうか。
324デフォルトの名無しさん
垢版 |
2020/06/05(金) 20:50:39.26ID:Trob9zBU
>>322
Processブロックでは $_ に各行が入ってくるので必要な時だけ出力しました
$_の扱いはForEach-Objectと同じなので、そちらでたくさん例が見つかるでしょう

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

prog arg1 arg2 arg3

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

Start-Process "prog" -ArgumentList @('arg1 arg2 arg3')
325デフォルトの名無しさん
垢版 |
2020/06/05(金) 21:15:18.94ID:Trob9zBU
例をつけ忘れました。こんな感じ。

Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')
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)
328デフォルトの名無しさん
垢版 |
2020/06/05(金) 22:12:15.54ID:Trob9zBU
ってこれ >>320 に空白考慮版があるね
329デフォルトの名無しさん
垢版 |
2020/06/05(金) 22:17:17.85ID:Trob9zBU
と思ったけど >>320 は必要ないcmd(?)経由に失敗してる?
2020/06/05(金) 23:21:02.62ID:C2qeZTUp
>>324
もう一つご教示ください。
header変数はどこで定義されている(という表現が適切か判りませんが)か教えていただけないでしょうか
2020/06/05(金) 23:41:51.74ID:e4Todh9J
>>317
の、Begin { $header = $true }

Begin 節で、header という変数を定義して、初期値をtrue にしてるのでは?
2020/06/05(金) 23:44:42.07ID:C2qeZTUp
ありがとうございます。
理解できてない。無知をさらけ出してしまいました。
2020/06/06(土) 00:12:58.72ID:7YMZq5d4
>>312
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
UTF-8 で使えるのかどうか、不明

ひょっとして、ファイル名に、半角英数字以外を使っているのか?
ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
334326
垢版 |
2020/06/06(土) 00:36:27.86ID:YeDbVwYY
>>372
すみません、それも結果は同じでした。
ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。

プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、
このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。
2020/06/06(土) 01:43:36.18ID:7YMZq5d4
Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm

「powershell 文字コード 変換」で検索!

本当は、込み入った処理は、Ruby でやって、
Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき!

こういうシェルで、ややこしいプログラミングは無理
2020/06/06(土) 07:05:00.74ID:+ifRGkAL
>>312
>>251-254 のバグとは別かな?
337デフォルトの名無しさん
垢版 |
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

じゃないかな
338デフォルトの名無しさん
垢版 |
2020/06/06(土) 07:08:59.48ID:3KBpE/OI
>>336
それだ!
でもPSReadLineなしでは不便過ぎる……
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 に関してはご指摘のとおりです。
2020/06/06(土) 10:08:38.99ID:B/uunGh7
>>333
横レスだが、
> @、つまり丸囲みの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
出力されたパラメーターが正しいか確認……かな
それをスレに貼ってもらえれば即解決な気がする
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 で別ウィンドウで実行すれば文字化けしない」という前提で
話を進めてきましたが、まったく関係なかったかも知れません。
2020/06/06(土) 11:30:16.97ID:7wZTkIMZ
外部コマンドの出力をpowershell側で触ったら文字化けするって話してるなら

最初にコンソール出力時のエンコーディング設定変えて

$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

すれば十分な気がする
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さんの方法でとりあえず解決したことにします。ありがとうございました。
347デフォルトの名無しさん
垢版 |
2020/06/06(土) 16:15:55.11ID:3KBpE/OI
[console]::OutputEncodingの退避・復元で解決できるなら
退避なんかせずに freac(?) の実行直後に

[console]::OutputEncoding = [console]::OutputEncoding

入れるだけでいい気がするけど、もういいや
2020/06/06(土) 17:37:53.88ID:7YMZq5d4
書き込み禁止ワードは、何かのコマンドだろ
cmd.@exe, ls @-l

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

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

それかそのアプリは、文字コードをバイナリにしてるとかで、
データを受け取る方がテキストで受け取ると、文字化けするとか
2020/06/06(土) 18:47:57.73ID:2MzuylRm
>>344
それ良いですね、勉強になります。
「俺専用ナレッジベース」にメモしときました。
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;
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;
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)

となるでしょうか?
2020/06/12(金) 09:35:33.43ID:IRe5SA+Y
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
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)
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
}
356354
垢版 |
2020/06/12(金) 10:09:03.73ID:tUTXhBxn
ただし、私自身も 10 年くらい前に AD の情報から LastLogon を取得することを検証したのですが、以下の理由から断念しました。

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

正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。
私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。
357354
垢版 |
2020/06/12(金) 10:22:05.71ID:tUTXhBxn
追伸。

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

全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。
それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。
2020/06/12(金) 16:10:21.89ID:6Yfh5mGy
Power Shellってアプリケーション作れんですか?
2020/06/12(金) 18:18:25.00ID:Jkz+gOtE
アプリケーションって何?
2020/06/12(金) 18:44:27.27ID:/dqGhWwV
>>358
普通に作れるよ
GUIもWPF使えるし
2020/06/12(金) 18:45:58.91ID:gCbNSmDh
window表示するイベントドリブンなexeのことじゃないかな
362デフォルトの名無しさん
垢版 |
2020/06/12(金) 18:55:49.90ID:tr06rVi2
もうそれ最初からC#でやれば良くね?っていう
2020/06/12(金) 19:42:03.65ID:sTuFS1ZK
大部分C#で書いてパワシェで書きやすい部分だけデリゲートでインジェクションするパターンなら多用しとるわ
2020/06/12(金) 20:21:21.09ID:6LTYSgwt
ただのコマンドプロンプトだと思ってた
スゲーワケわからん
2020/06/12(金) 20:53:03.96ID:tSkvENox
オブジェクト指向シェル言語だからな
366300
垢版 |
2020/06/14(日) 00:11:44.27ID:JXZUsp2d
>>354
ありがとうございます!
検証環境で無事出力確認できました!
しかし最終ログイン日時の取得は難しいんですね。
今回はそれほど精密な値は求められないので良かったですが、
ドメコンには注意なんですね。
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
369デフォルトの名無しさん
垢版 |
2020/06/16(火) 11:32:29.65ID:r0rBA9XG
コマンドプロンプトでecho a b cを実行すると出力結果は
a b c
PowerShellでecho a b cを実行すると
a
b
c
なのはなんで?
エラーにもならずにbやcはどう扱われてるの?
370デフォルトの名無しさん
垢版 |
2020/06/16(火) 11:55:26.03ID:dJYiaODe
echo a b c
とかやってみれば、以下にcmdがクソかよくわかると思うよ。
371デフォルトの名無しさん
垢版 |
2020/06/16(火) 11:56:36.32ID:dJYiaODe
あ、間のスペースも消えてなくなるのか。
echo___a_____b____c
_をスペースに。
2020/06/16(火) 12:32:39.69ID:0Yfa1k+l
いやいやいや
引数なんだから当然だろ
あとは出力で改行するかどうかだけじゃん
2020/06/16(火) 12:44:08.30ID:zfRgO9so
echo "a b c"

" " で囲えば、a b c
と表示される
374デフォルトの名無しさん
垢版 |
2020/06/16(火) 12:53:01.50ID:r0rBA9XG
聞きたいのはそういう類じゃないんだな
echo (=Write-Output) のSyntaxが

Write-Output [-InputObject] <PSObject> [-NoEnumerate] [<CommonParameters>]

だからa が-InputObjectの<PSObject>になるのはわかる
bやcはどういう理屈で処理されるの?
2020/06/16(火) 14:16:42.05ID:PL2rwu//
>>374
echo a b c

echo @('a', 'b', 'c')
と同じ扱いとするように実装されてるんでしょ
2020/06/16(火) 14:40:34.28ID:p9YvTGLE
まあ調べた374がpowershellの引数展開についてまとめて分かりやすく報告してくれるでしょ
2020/06/16(火) 14:48:49.11ID:C/0BZ8DU
MSの説明では、正確には
[-InputObject] <PSObject[]>
となってる
378デフォルトの名無しさん
垢版 |
2020/06/16(火) 16:42:16.77ID:r0rBA9XG
del a b cはちゃんとエラーになる
さっぱりわからん😩
2020/06/16(火) 17:12:01.69ID:MVe0R048
Write-Outputの-InputObjectパラメータにはValueFromRemainingArguments属性がついてるから
その場合はパラメータ名が明示されてないものはすべてInputObjectにバインドされるんよ

確認はしずらいけど以下で確認できる
(Get-Command Write-Output).ParameterSets[0].Parameters | where name -eq InputObject

まああんまりこの属性ついてるのはないからecho とかWrite-Hostあたりはこうなってるくらいの認識でいいよ
PowerShell7だとJoin-Pathもこの属性がついてる
2020/06/16(火) 17:24:04.82ID:8ZMUuPb8
echoの引数がUNIXとかだとアレだよ
2020/06/16(火) 17:25:39.53ID:MVe0R048
>>379
訂正:パラメータ名が明示されてないものでポジショナルバインディングもできないもの
382デフォルトの名無しさん
垢版 |
2020/06/16(火) 17:45:58.38ID:r0rBA9XG
なるほど
ありがとう
2020/06/16(火) 19:16:29.09ID:bkoiHKSB
PowerShellの起動がなんか凄いモタつくんだけどおまかん?
Windows10Home PS7.01

スクリプト書いて渡しても、
何も出ない黒い画面がしばらく出て怖がられたり、何個も起動されたりするし
2020/06/16(火) 21:23:47.76ID:aR46ypRq
>>251,312
右クリックじゃなくてCtrl+Vではどう?
2020/06/16(火) 22:43:53.36ID:Tk9CpyzQ
cmd -L
9875   shinjyuku  Tokyo   Japan

の1列目を1行で変数に格納したいのですが、方法がわかりません。

$work=(cmd -L | Select-String "shinjyuku" )
$id=$work -split " "
Write-Output $work[1]

これを1行で書ける方法を教えてください。

よろしくお願いいたします。
2020/06/16(火) 23:40:23.19ID:n71ojSL1
cmd -Lが何なのか判らないのでcmd /c echoの例で
(cmd /c echo 9875   shinjyuku  Tokyo   Japan | %{ $_ -split " " })[0]
2020/06/16(火) 23:41:31.04ID:n71ojSL1
忘れてた頭に$id=付けてね
2020/06/17(水) 07:40:39.83ID:0yXiYm7U
>>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
2020/06/17(水) 07:50:00.92ID:PujUJ59z
cmd .exeに-Lオプションがあるのかと思った人は俺以外にもたくさんいるはず
2020/06/17(水) 08:00:55.98ID:H0Dcbe9T
VSCode で、PowerShell の拡張機能を入れると、構文チェックで、
Write-Host を、Write-Output か、Write-Verbose に変えろって警告される

PowerShell/PSScriptAnalyzer
https://github.com/PowerShell/PSScriptAnalyzer/blob/master/RuleDocumentation/AvoidUsingWriteHost.md
2020/06/17(水) 08:04:57.13ID:H0Dcbe9T
漏れは回線速度を、NETFLIX で測っている

https://fast.com/ja/
2020/06/17(水) 10:09:26.78ID:U7B7s7qz
>>388
(.\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)' | %{$_ -split ' '}[0])[1]
393392
垢版 |
2020/06/17(水) 10:13:28.30ID:U7B7s7qz
>>388
あれ、speedtest.exe の「-L」って、ネットワーク的に近い場所のサーバを
表示するだけで、実際の計測はしてないようですけど、これで良いんですか?
>>388 の続きがある、ってことですかね。
394392
垢版 |
2020/06/17(水) 10:21:19.19ID:U7B7s7qz
>>388
タスクスケジューラで回すことを考えてるのかも知れませんが、単に
.\speedtest.exe -s 6766
とか
.\speedtest.exe -s 15047
といった感じにしないのはなぜですか?
speedtest.exe -L を実行する意図がよく分かりません。
395392
垢版 |
2020/06/17(水) 10:29:32.27ID:U7B7s7qz
>>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";
2020/06/17(水) 15:45:25.40ID:UcA8Gcsf
ジョブをパイプの途中で使いたいと考えています

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はスコープ無関係
# なのでジョブで分けようかと
2020/06/17(水) 16:28:19.33ID:pLBooGKC
なんでワンライナーでやる必要があるのかね、こういうの
保守とか考えないのかね
2020/06/17(水) 16:55:10.36ID:/58stVp5
パイプの弊害か
2020/06/17(水) 17:44:32.75ID:UcA8Gcsf
>>397
コマンドラインで結果をすぐに見たいからですね
ページャーにつないで欲しい結果が出てきたら確認して終了
ステップごとに完了待ちしてたら時間がもったいない
400デフォルトの名無しさん
垢版 |
2020/06/17(水) 23:59:11.03ID:H0Dcbe9T
>>396
>1 .. 3 | % { $_; sleep 1 } | Start-Job { process { ">$_" }} | Receive-Job -wait

1 .. 3 | % { $_; sleep 1 }
この部分を、Start-Job の中に入れたら?
2020/06/18(木) 05:52:46.25ID:7bz/apiR
$ary_names = @('太郎','次郎','三郎','四朗','五郎')
write-output $ary_name[@] #bashの記法
太郎,次郎,三郎,四朗,五郎

的なことをしたい。※区切り文字はなんでも可。


現状、配列に文字列をくっつけると1行で出るので
write-output ("a"+$aaa).trim("a")

という強引な方法をとっております。もっとPowershell的にスマートな方法があれば
お教えくださいませ。
2020/06/18(木) 06:58:53.37ID:3wPjj0xg
$ary_names -join ','
2020/06/18(木) 07:18:11.97ID:7bz/apiR
>>402
ありがとうございます!
2020/06/18(木) 09:01:24.17ID:hwvpLd3O
>>400
それだと最終目的のためにはStart-Jobの入れ子が必要になるなあ
制御不能になりそうだし面倒なので避けたい
cmd.exeを使うことにします
405デフォルトの名無しさん
垢版 |
2020/06/19(金) 06:41:17.41ID:RNyMoV2a
$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秒という結果に困惑している
2020/06/19(金) 07:30:31.94ID:JIIBGf6G
>>405
二重ループを期待してたってこと?
407405
垢版 |
2020/06/19(金) 08:42:12.76ID:RNyMoV2a
最初は2秒、それから1秒間隔でトータル6秒だと思ってた
1秒待ちをStart-Sleepでなく別のプロセスで待たせても変わらなかった
408デフォルトの名無しさん
垢版 |
2020/06/19(金) 08:51:47.96ID:GhHOGZr1
パイプつなぎはいわゆるgenerator(PowerShellでの呼び方は知らない)になるってことかな?
2020/06/19(金) 08:52:39.06ID:JIIBGf6G
1に対して最初のfor-eachの中身処理した後に次のfor-eachの中身処理。
2に対して...
3に対して...
4に対して...
5に対して...
ふたつのfor-eachの中身がどういう順に処理されてるか確認できるように表示を工夫してみたら?
410405
垢版 |
2020/06/19(金) 09:08:23.61ID:RNyMoV2a
そこはなんとなくイメージできたんでもういい
パイプラインの各段を別のプロセスにすると6秒で終了する
同じように6秒で終了すると思ってたら違ったんで戸惑ったというお話
411405
垢版 |
2020/06/19(金) 11:12:17.79ID:RNyMoV2a
$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秒になった

一人研究発表会になっちまったな。すまぬ。
412405
垢版 |
2020/06/19(金) 11:40:12.67ID:RNyMoV2a
よく見たら結果がおかしい。お手上げだ。諦めた。
2020/06/19(金) 17:20:54.32ID:qQd5c1Zr
>>397
おまえはpythonでもつかってろ
2020/06/19(金) 18:23:41.02ID:OOcqKGQK
ラクダが笑ってんぞ
415405
垢版 |
2020/06/19(金) 21:01:31.39ID:RNyMoV2a
できたーーーー

$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を使った時より遅いけど簡単に予想してた結果になった
お騒がせしました
416405
垢版 |
2020/06/19(金) 21:15:58.78ID:RNyMoV2a
こ、今度こそできたー

$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}
やっぱりこれが最終版ということにしたい
お邪魔しました
2020/06/20(土) 00:50:50.12ID:na6pkPqz
はいつぎ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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