X



【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0929デフォルトの名無しさん
垢版 |
2018/09/08(土) 17:33:30.08ID:oTozgSe4
例えば、Active Directory 管理用モジュール「ActiveDirectory」は、現状
powershell.exe でしか動かず、pwsh.exe ではインポートできないわけ。

--------
参考
https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/breaking-changes-ps6?view=powershell-6
PowerShell スナップインは、PowerShell モジュールの前身ですが、PowerShell コミュニティではあまり使用されていません。
-- snip --
現時点では、Windows および Windows Server 内の ActiveDirectory および DnsClient モジュールに影響します。
--------

というわけで、今俺が作ってるものだと、以下のものが混在してる。
イ)powershell.exe でしか動かない
ロ)pwsh.exe でしか動かない
ハ)どっちでも動く

で、〜.ps1 ファイルを実行する際に、右クリックして「PowerShell で実行」とすると、何もしなければ powershell.exe で
実行される。自分が作ったものはほとんどが(ハ)なんだけど、時々(ロ)もあって、それを実行するときは右クリックして「PowerShell で実行」が出来ないんで面倒。

今検討してるのは、
a) pwsh.exe でしか動かないものは拡張子を .ps6 でにして、Windows に ps6 を pwsh.exe に関連付ける
b) sendto フォルダに pwsh.exe で実行させるバッチファイルを置く
c) バッチファイル (〜.cmd) に、実行環境ごと書いてしまう (参考 http://d.hatena.ne.jp/hake/20180218/p1 )

なんだけど、ほかにやりよう無いかね。
0931デフォルトの名無しさん
垢版 |
2018/09/08(土) 18:26:03.12ID:HSx0xrFN
そんだけならコンテキストメニューを拡張して
「PSV5で実行」を追加すれば良くね
0932デフォルトの名無しさん
垢版 |
2018/09/08(土) 19:09:29.22ID:nMBTba9u
右クリックなら選べるからコンテキストメニューをどうにかすべきだな。

ダブルクリックの話かと思ってた。
0934デフォルトの名無しさん
垢版 |
2018/09/08(土) 21:00:30.80ID:oTozgSe4
>>928
イメージとしてはこんな感じかな。たしかにうまくいきそう。
ありがとう、明日試してみる。
-----------
<# ps1 の関連付けが powershell.exe の状態 (デフォルト) で、pwsh.exe で実行させたいものの場合 #>
# 実行環境が ver 5 以下の場合
if ($PSVersionTable.PSVersion.Major -le 5) {
pwsh.exe $MyInvocation.MyCommand.Path
exit
}
# 以下、ver 6 以上で実行させたい内容
0935デフォルトの名無しさん
垢版 |
2018/09/08(土) 21:11:46.23ID:oTozgSe4
>>931 >>932
もちろんそれでも十分可能なんだけど、以下の理由でできればカスタマイズは避けたいんです。スクリプト内だけで完結させたい。

・マシンがたくさん、OS も複数種類、ユーザプロファイルもたくさんあるので、標準構成からあまりいじりたくない
・お客さんに納品する可能性も考慮
0937デフォルトの名無しさん
垢版 |
2018/09/09(日) 12:54:55.70ID:PZb39582
運用マニュアルなしで議論してもしょうがないでしょ
このスクリプトはver5環境で実行してくださいと一言書いとけば済む話
0938デフォルトの名無しさん
垢版 |
2018/09/09(日) 13:48:43.10ID:b90Mhdwq
そういう能書きが書いてあっても何のこっちゃ分からんという人に配布しなきゃいけない場合もあるからなぁ
お客さんに運用対応を要求するのも大変なことだし
0939デフォルトの名無しさん
垢版 |
2018/09/09(日) 14:14:36.64ID:R8hBsgvF
>>937はこの手の仕事したことないんだろ
マニュアル書いても
「ver5環境ってなんだ?」
とか、そもそも説明なんて読んでなくて
「うまく動かないので至急なんとかしてください」
って言われるだけのこと
0940デフォルトの名無しさん
垢版 |
2018/09/09(日) 14:39:06.98ID:DLS5Iddq
これで十分
#Requires -Version 5
if ($PSVersionTable.PSEdition -eq 'Core') {
throw 'Powershell Coreでは動作しません。'
}
0943デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:19:04.80ID:DLS5Iddq
「対応するなら○○万円(鬱陶しい顧客リスク分を上乗せして)頂戴します。」
断るならブラック顧客だから切るべし。
断れないならブラック企業だから転職。
0944デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:28:45.97ID:D8J39mU4
>>943
突っぱねるだけじゃなく、妥協点を見出す、Fail safe, Fool proof ってのも重要なことだよ。
まあ個人のポリシーだから好きにすればいいけど。
0946デフォルトの名無しさん
垢版 |
2018/09/09(日) 15:47:36.82ID:jqHbfRUC
マニュアル書くにしたって、「エラーメッセージが出ます」と一言で説明するだけじゃ不十分
「『ver5環境では動作しません』というメッセージが表示されます。この場合...」と一字一句再現してやらないとわけわからなくなる人が山のようにいるのでね
ウィンドウの背景色やフレームの色まで画像付きで説明されてないと理解できない人もいるし
舐めてると死ぬぞ
0947デフォルトの名無しさん
垢版 |
2018/09/09(日) 20:12:23.17ID:0ym3cmgA
会計ソフトを出したら、それを買った客が、簿記・会計処理のことを聞いてくるw
女が電話に出ると、何時間でも粘るw

そういう客もいる
0949デフォルトの名無しさん
垢版 |
2018/09/09(日) 20:59:40.12ID://bKOaXP
>>947
全然関係ないけど昔生理用品メーカーに納入した機器の入れ替えに行った時に聞いた話だと、お客さんからの問い合わせ(多分クレーム)で長い時は3時間とかかかるって言ってた
0950934
垢版 |
2018/09/10(月) 17:56:21.73ID:0jDkILQ9
結局こんなふうにしたよ
https://pastebin.com/9RWLpSC7

>>928
ありがとうごさいました!
ほかの皆さんもありがとうございました!
0957デフォルトの名無しさん
垢版 |
2018/09/14(金) 14:27:05.47ID:60Mnn9Dg
>>956
自分の場合だけど、Windows の EC2 インスタンスと連携するプログラムを Lambda 上で
作る案件がちょくちょくあって、これまでは Windows 上は PowerShell、Lambda のほうは
P{ython で作ることが多かった。
だけど自分のスキルのせいもあって、PowerShell と Python のコーディングを同時並行で進めると
色々と混乱することが少なくなかったのね。

# 両方 Python で作れば、と思うかもしれんけど、運用の手間を考えると、
# 追加でインストールするものはなるべく少なくしたい

それが、Lambda で PowerShell Core が使えるなら PowerShell で統一できるので、
個人的にすごく捗るな、と。
0958デフォルトの名無しさん
垢版 |
2018/09/16(日) 13:14:02.90ID:16Y59QgZ
class構文じゃなくて本物の型を定義したい場合にはAdd-Typeしかないのかな
GUI作るときにPSObjectがうまくデータバインドできなくて困った
0960デフォルトの名無しさん
垢版 |
2018/09/28(金) 13:35:11.01ID:oUAtTcYe
Macだからかもしれない
Macでの実行環境は最適化する余地が大きく残ってたとかがあり得る
Windowsでどうかは比較してみないとなんとも
0961デフォルトの名無しさん
垢版 |
2018/09/28(金) 15:32:47.04ID:ExWLpVS+
psわざわざ入れるって無理だな
有り物使うだけだからOSアプデで付くのを待つしかない
0962デフォルトの名無しさん
垢版 |
2018/10/05(金) 17:32:43.04ID:LWyIHUF+
PowershellはOSによってプリインストールバージョン違うの地味に面倒だな
MS Updateで5.0までは強制的にアップデートしてくれないかな
客先のサーバでSQLモジュールも入って無くてInstall-moduleも入って無くてスクリプト使えなくて困ったわ
0966デフォルトの名無しさん
垢版 |
2018/10/06(土) 14:33:29.33ID:gea8Zy97
テクニックって程のものって何かある?
使える使えないの差ぐらいじゃないの
0967デフォルトの名無しさん
垢版 |
2018/10/06(土) 16:17:11.73ID:J00E9zwo
再来年1月にはPowershell2.0プリインストール環境が終了するから2.0に合わせた書き方頑張る気力がイマイチ
Windows7とか2008R2は早く死んでくれないかな
0970デフォルトの名無しさん
垢版 |
2018/10/06(土) 23:10:20.08ID:tgEP6apu
>>967
SP1入れずに使ってる環境なんてほぼ無いだろ?なら4.0覚えときゃOK

個人的にはzipクラスがある4.5が望ましい
0973デフォルトの名無しさん
垢版 |
2018/10/07(日) 00:51:14.63ID:KvcjzmFM
3.0以降じゃないとPsCustomObject使えないとか、コマンドレット充実してなくてNETライブラリ使う羽目になって、もうこれC#で書いたほうが良くね?になるあたりかね
0974デフォルトの名無しさん
垢版 |
2018/10/07(日) 02:34:13.34ID:MeohIHbL
coreに移行して大分経ってからGet-ScheduledTaskとかのWindows専用っぽいコマンドレット無くなってるのに気付いた
まあこれはあんまり使わんしpowershell.exeで実行すりゃいいか
0975デフォルトの名無しさん
垢版 |
2018/10/07(日) 06:17:50.14ID:mFTX0OZ0
where-objectでフィルタをかける時、複数条件が必要な場合は
パイプでつなぐしかないですかね?andとかあればいいんですけど
where-object 条件1 | where-object 条件2
0977デフォルトの名無しさん
垢版 |
2018/10/07(日) 10:50:24.18ID:VwaVbKnV
>>975
サンプルだと
? {$arg -eq "test" -or $arg2 -eq "test"}
みたいな感じ
-使う演算子が繋がって違和感あるかもしれんけど
0980デフォルトの名無しさん
垢版 |
2018/10/08(月) 20:48:01.10ID:7Fv0bXJp
パワーシェル内でパワーシェルを呼び出す時、どのパワーシェルの処理が成功してるか失敗してるかわかるようにログ出すのはどうすればいいんでしょうか?
0982デフォルトの名無しさん
垢版 |
2018/10/08(月) 22:04:42.09ID:7Fv0bXJp
ごめん。全然わからん・・・
0984デフォルトの名無しさん
垢版 |
2018/10/08(月) 22:19:23.32ID:7Fv0bXJp
バッチファイルみたいにリダイレクトではログ渡せないのかな?
2>1
みたいなかんじで?
0985デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:19:17.74ID:nFrei6GD
$?で前回のコマンドの実行結果
$lastexitcodeにexitコマンドで返された値が入る(呼び出したスクリプトはexitに戻り値を付けて終了させないとダメ)

$?だとスクリプト内の最後のコマンドの結果が帰るからスクリプトの作りによっては失敗の判定は出来ないのはバッチとかと一緒
0986デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:24:06.69ID:7Fv0bXJp
なるほど
呼び出すスクリプト内にエラーコードで正常か異常か$?で判定させてそれをifかなんかで分岐させてエラーコードを呼び出し元のスクリプトの$lastexitcodeをehcoする感じですかね?
0988デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:41:24.75ID:GVMVzq1c
>>980
成否判定ならこれでよくね

hoge.ps1

$hoge = $true
if($hoge){exit 1}
exit 0
-------------

$ps = Start-Process hoge.ps1 -Wait -PassThru
switch($ps.ExitCode) {
0 {
"失敗"
}
1 {
"成功"
}
}
0990デフォルトの名無しさん
垢版 |
2018/10/08(月) 23:45:52.94ID:7Fv0bXJp
これを呼び出すスクリプト全部に書くってこと?
呼び出し元と先が複数あって、先を全部修正するのが大変なので出来れば元だけで完結させたい
が、無理そうなのでこれを全てに書いていく?
0992デフォルトの名無しさん
垢版 |
2018/10/09(火) 00:01:31.08ID:G4IJkzod
>>990
exitで成否を戻した方がしっかり判定できる
呼び出したスクリプトで何が発生したら失敗とするかをしっかり判定しないの?
結果コードでの判定とか曖昧すぎてトラブルの元と思う
0993デフォルトの名無しさん
垢版 |
2018/10/09(火) 00:57:32.40ID:VXCTyrZC
>>984
実際にやりたいことがわからないけどエラーメッセージをリダイレクトするだけなら同じようにできるよ
powershell ./hoge.ps1 2>>log.txt
0995デフォルトの名無しさん
垢版 |
2018/10/09(火) 05:18:39.42ID:06HomXwK
>>979
-inならいけるけど、まあ違うんだろうな
dir | where { $_.name -in "a1.txt","a2.txt","b1.txt" }
$list = @( "a1.txt","a2.txt","b1.txt" )
dir | where { $_.name -in $list }
0996デフォルトの名無しさん
垢版 |
2018/10/09(火) 08:24:03.86ID:2kAOJdzZ
>>979
適当こいただけじゃないのかな
PSのカンマ演算子は配列を作り、配列の要素が複数なら内容問わず真になる
そもそもカンマでの結合はORなのかANDなのか意図が曖昧
仕様としても微妙だしバッドプラクティスに思える
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 682日 15時間 1分 1秒
レス数が1000を超えています。これ以上書き込みはできません。

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