X



PowerShell -Part 4
レス数が950を超えています。1000を超えると書き込みができなくなります。
0851デフォルトの名無しさん
垢版 |
2021/01/03(日) 12:17:05.18ID:n1qZMfJK
実行文が入っていない

単にコンパイルされる文、型の宣言・定義しか入っていない。
インスタンスを作ったりする、実メモリの割り付けをされる文がない
0852846
垢版 |
2021/01/03(日) 17:02:17.09ID:BT1KEPia
>>851
クラス定義のps1ファイルの中身はそうすべき、ということでしょうか?
>>849
確かにコンソールで全て定義すると動きますね。
クラス周りの動きが難しいです。。。
>>847
ありがとうございます。
下記のように書き直したところうまく動きました。
◆Record.ps1
class Record {
  [string] $Key
  [double] $Data
}

◆MyCollection.ps1
. .\Record.ps1 # ←これは無くても動く…??
class MyCollection : System.Collections.ObjectModel.KeyedCollection[string, Record] {
[string] GetKeyForItem([Record] $item) {
return $item.Key
}
}

◆Test.ps1
. .\Record.ps1
. .\MyCollection.ps1
$r = [Record]@{ Key = "pi"; Data = 3.14 }
$c = [MyCollection]::new()
$c.Add($r)
$c["pi"].Data # 3.14と表示されてほしい
0853851
垢版 |
2021/01/03(日) 18:34:59.83ID:n1qZMfJK
ファイルA の中で、ファイルB を読み込むと、
依存ファイルであるファイルBが、先に実行される事が確定するのだろう

一方、同じファイルに、複数のクラスを書くと、依存関係が分からないのだろう
0854デフォルトの名無しさん
垢版 |
2021/01/07(木) 01:13:26.70ID:MvQgNxU+
すいません、Powershellって、変数が空だった場合の
デフォルト値を設定する方法ってありますか?

bashでいうところの、
${hoge:-fuga}

って方法です。
0855デフォルトの名無しさん
垢版 |
2021/01/07(木) 02:45:37.83ID:CsAW39lY
ねーよ
VBSで言うIsEmpty相当すらない
せいぜい$nullかどうか調べてちっ仕方ねーなってやるしかない
0856デフォルトの名無しさん
垢版 |
2021/01/07(木) 08:03:25.19ID:1A0NtNS9
($nullでなく)空って状態はないと思うから、しいてやるならGet-Variableで変数が存在するか調べるくらいかね
0858デフォルトの名無しさん
垢版 |
2021/01/07(木) 08:28:41.55ID:6ewH2FY0
>>854
変数が空の定義次第だけど$nullでよくてPowerShell 7以降なら$hoge ?? 'fuga' でいける
空の定義に空文字を含むとかPowerShell 6以下とかなら素直に if([string]::IsNullOrEmpty($hoge)){ 'fuga' } else { $hoge } とやればいい
0864デフォルトの名無しさん
垢版 |
2021/01/07(木) 22:50:20.03ID:iqGL0Mlk
ほげふがの語源ってサザエさんだったの!? マジで!
0869デフォルトの名無しさん
垢版 |
2021/01/08(金) 12:25:26.48ID:eXVg8SYp
>>868
詫びろとは言ってない

>>867
誰かがマイナーと言ったとは言ってない

>>865
今週観たとは言ってない

>>861
ご指摘にはあたらない
0870デフォルトの名無しさん
垢版 |
2021/01/08(金) 12:25:53.52ID:eXVg8SYp
これ万能論法ですな
0872デフォルトの名無しさん
垢版 |
2021/01/09(土) 01:01:42.83ID:KQEfE/JM
※すべてのネットワークアダプタを無効にして、
Get-NetConnectionProfileは必ずエラーになる状態で実行しています。

$result=Get-NetConnectionProfile -InterfaceAlias Wi-Fi 2>$null
$?
False


$result=(Get-NetConnectionProfile -InterfaceAlias Wi-Fi 2>$null)
$?
True

この場合、マル括弧がどんな働きをして
結果が変わってしまうのか教えてください。
0873デフォルトの名無しさん
垢版 |
2021/01/09(土) 01:03:45.10ID:KQEfE/JM
ちなみにこうしても

$result=Get-NetConnectionProfile -InterfaceAlias Wi-Fi
エラーメッセージ
$?
False


$result=(Get-NetConnectionProfile -InterfaceAlias Wi-Fi)
エラーメッセージ
$?
True

という状態でした。
0874デフォルトの名無しさん
垢版 |
2021/01/09(土) 08:27:17.19ID:kPw1IBO3
>>872-873
まあバグ(MS的には仕様とも言う)みたいなもんやね

Until PowerShell 7, containing a statement within parentheses (...), subexpression syntax $(...) or array expression @(...) always reset $? to True , so that (Write-Error) shows $? as True.
This has been changed in PowerShell 7, so that $? will always reflect the actual success of the last command run in these expressions.

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.1#short-description

なのでPowerShellを7にすれば解決するかと
0875デフォルトの名無しさん
垢版 |
2021/01/09(土) 09:13:27.43ID:iGxXP/Ic
5.1はメンテしないってことか?
OSにデフォで入ってるバージョンなんだから直せよ
0876デフォルトの名無しさん
垢版 |
2021/01/09(土) 09:49:28.96ID:kPw1IBO3
いきなり直したらユーザースクリプトのバグが顕在化したりするだろ
どうでもいいようなスクリプトなら7に上げろよ
0877デフォルトの名無しさん
垢版 |
2021/01/09(土) 10:38:48.10ID:amtktMoR
どうでもいいスクリプトで問題回避できるなら7に上げなくてもいいんじゃね。
0881デフォルトの名無しさん
垢版 |
2021/01/10(日) 04:54:33.84ID:3v4yt86U
以下の表記の意味を教えてください。
void Queue[TResponse](Google.Apis.Requests.IClientServiceRequest request, Google.Apis.Requests.BatchRequest+OnResponse`1[TResponse] callback)
メソッドに角カッコ?や、型指定に+や`1[TResponse]の意味がわかりませんでした。

$batch = New-Object Google.Apis.Requests.BatchRequst($service)
$batch.Queue
で表示される内容です。
0882デフォルトの名無しさん
垢版 |
2021/01/10(日) 08:11:25.80ID:a907yL+h
クラスのメンバーにクラスがある時は+になるんじゃなかったか
System.Environment+SpecialFolder みたいな

[TResponse]はジェネリックの型引数
`1は型引数を1つ取るって意味
0883881
垢版 |
2021/01/10(日) 21:15:33.29ID:3v4yt86U
>>882
ありがとうございます。ジェネリックというのは知らなかったので調べてみます。
あと、その、Queue[TResponse]、というメソッドに型が付いている?のもジェネリック関連でしょうか。
0884デフォルトの名無しさん
垢版 |
2021/01/12(火) 16:53:39.85ID:0UGYDHaB
pythonに飲み込まれるってマジ?
0890デフォルトの名無しさん
垢版 |
2021/01/18(月) 22:22:09.29ID:6Ncg8pZo
【D:\】の全てのフォルダやファイルに対して、作成日時や最終アクセス日時などを設定したいのですが、
PS D:\> Get-ChildItem -Path "D:\" | Where-Object { $_ -is [System.IO.FileInfo] } | ForEach-Object { Set-ItemProperty $_.FullName -Name CreationTime -Value "2021/01/01 00:00:00" }
ではエラーが出ます。

何がいけないのでしょうか?
0891デフォルトの名無しさん
垢版 |
2021/01/18(月) 22:59:36.90ID:Pb59NPOt
例えば特定の一つのファイルやフォルダなら上手く行くとか
パイプを分解してどこでエラーになってるのかを突き止めるとか
丸投げするにしてもエラーメッセージ位は出してあげると答える人も喜ぶと思いますよ
0892デフォルトの名無しさん
垢版 |
2021/01/19(火) 02:44:39.14ID:m3MeBQ6p
1.D:\が存在していない
2.D:\へのアクセス権がない
3.D:\にあるファイルに読み取り専用属性が設定されてるものが混ざってる
どれかな?

Where-Object { $_ -is [System.IO.FileInfo] }抜き、ファイルに限定しないで実行したときは
フォルダへのアクセス時にエクスプローラー開いてると
”別のプロセスで使用されているためアクセスできません”となった(たとえ操作対象のフォルダを開いていなくても)

変更された日時を確認するためにエクスプローラー開いたまま実行してたりする?
0893デフォルトの名無しさん
垢版 |
2021/01/19(火) 21:02:07.64ID:qrtgnbPs
# set the target folder path
$targetFolder = 'I:\';

# get all files including files in sub folders
$itemList = Get-ChildItem $targetFolder -Recurse;

foreach($item in $itemList){
$item.CreationTime = '2020/12/21 00:00:00'
}
なスクリプトで実行したらエラーなく出来ました。
お騒がせしてすみませんでした。
0894デフォルトの名無しさん
垢版 |
2021/01/19(火) 23:49:36.84ID:XQEllFmW
>>893
>>890
私の環境で実行したら何のエラーもなく、CreationTimeが2021/01/01 00:00:00
になったの。

逆質問だけど、どんなエラーだったのか教えてください。
0895デフォルトの名無しさん
垢版 |
2021/01/20(水) 10:29:40.54ID:sOzWFlEJ
エクスプローラーとか、バックグラウンドで動いているシステムなどが、
フォルダをロックしていたら、失敗する

だから、タイミングによって、成功したり失敗したりする

読み取りロックは、読み取り同士では共有できるけど、
書き込みロックは、その他すべてと共有できないから、失敗する確率が高い
0898デフォルトの名無しさん
垢版 |
2021/01/27(水) 21:16:07.96ID:lPCF/h8Q
テキストストリームの事なのかNTFSの代替データストリームの事なのか
どちらなんだ
0900デフォルトの名無しさん
垢版 |
2021/01/27(水) 22:45:50.85ID:9akTDBYB
テキストに限った話ではないけど、質問者が正確に把握してるともまた限らない
0901デフォルトの名無しさん
垢版 |
2021/01/29(金) 23:59:43.31ID:t1LR5As2
PoweShellのクラスで、C#と同様にインデクサーを定義することはできますか?

例えば、あるクラスのインスタンス$hogeに対して
$hoge[$i] という感じで添字でアクセスしたいです。
0905デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:24:57.96ID:x4IKZ5QX
そのファイルに付属させたい情報を一緒にいれておくということだろう
ソースだったら、開発秘話とか入れとけば?
0908901
垢版 |
2021/01/31(日) 19:31:38.13ID:yFPHlREj
>>902
PowerShellでも.Netの
コレクションクラスを使えますので、
インデクサーを使うこと自体はできますよね?
同様のことをユーザー定義クラスで実現できないかと思ったのですが、
無意味でしょうか…
0909デフォルトの名無しさん
垢版 |
2021/01/31(日) 20:11:33.10ID:IDCaHEld
>>904
それ代替データストリームに見えるけどどの辺がテキストストリームなんだろ
しかも、NTFSに依存する機能で.mdの代替とか悪手でしかない
0911デフォルトの名無しさん
垢版 |
2021/02/05(金) 00:48:27.75ID:a81hUa+F
PowerShellのパイプやリダイレクトは仕様が良くないね。
エンコードせずにバイナリデータのままパイプする従来の方法も選べたほうが良かったね。
0917デフォルトの名無しさん
垢版 |
2021/02/06(土) 23:58:30.54ID:5Ze23T9D
>>912
`| や`>が解説されているマイクロソフト公式ページはどこになりますか?
検索キーワードが記号ばかりなので探し方が分からず困っております。

>>913
私の環境では、以下のエラーが出て動きませんでした。
Get-Content: Cannot process argument transformation on parameter 'Encoding'.
'byte' is not a supported encoding name. For information on defining a custom encoding,
see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
0919デフォルトの名無しさん
垢版 |
2021/02/07(日) 01:34:59.08ID:IiZq+u+t
>>918
具体的なURLはどこになりますか?
0920デフォルトの名無しさん
垢版 |
2021/02/07(日) 01:38:10.26ID:IiZq+u+t
>>918
検索にbashの知識が必要というのは具体的にどういう意味ですか?
0922デフォルトの名無しさん
垢版 |
2021/02/07(日) 07:11:26.49ID:jVPjdJHk
@パターン1
$data = @('red','green','blue')
if ( $data -ne 'green' )
{
'greenはありません'
}

greenはありません

Aパターン2
$data = @('red','green','blue')
if ( $data -ne 'pueple' )
{
'greenはありません'
}
greenはありません


両方とも同じ結果を返してしまいます。
配列と比較して、無かったらtrue、あったらfalseみたいな書き方ってありませんか?
イメージとしては

if ( $data.notContains('green'))

みたいな書き方です。

用としては、if ( $data.Contains('green'))で足りるのですが、
気持ちの問題として、無かったらtrue、あったらfalseという書き方をしたいです。

よろしくお願いいたします。
0923デフォルトの名無しさん
垢版 |
2021/02/07(日) 09:44:27.16ID:jX/y7Db/
>>922
> 両方とも同じ結果を返してしまいます。
まず
$data = @('red','green','blue')
$data -ne 'green'
で何が戻ってくるか確認すればなぜそう言うふうに動くかわかると思う

> 気持ちの問題として、無かったらtrue、あったらfalseという書き方をしたいです。
どうしても-eqとか使いたい場合、俺なら($data -eq 'green').Count == 0って書くかな
どう見ても$data.Contains('green')の方がわかりやすいと思うけど
0924デフォルトの名無しさん
垢版 |
2021/02/07(日) 09:58:10.78ID:fgGFki9a
$data = @('red','green','blue')
if (not ($data -eq 'green')) {}
if (not ($data.Contains('green'))) {}
if (not ($data -contains 'green')) {}
if ($data -notcontains 'green') {}
if ('green' -notin $data) {}

-eq演算子はフィルタとして働くのでここでの用法は微妙
-in系の演算子は配列が大きいとオーバーヘッドが大きいらしい
0925デフォルトの名無しさん
垢版 |
2021/02/07(日) 09:59:45.82ID:fgGFki9a
否定をtrueにするってどういうことだろ
$colors = @('red','green','blue')
$found = $data -contains 'green'
if ($found) {
} else {
}
なら自然に読み下せる
ここで$notFoundという変数を使われると気になる
if (not $found) {
# 先に書いておきたい処理
} else {
# 長々とした本処理
}
としたいという趣旨ならわかる
0927デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:18:17.21ID:jVPjdJHk
>>923-925
レスありがとうございます。

> 否定をtrueにするってどういうことだろ
> どう見ても$data.Contains('green')の方がわかりやすいと思うけど

$exec_shinai_jikan=@('01','02','03')
$imananji=Get-Date -Format HH

if ($exec_shinai_jikan -notcontains $imananji){
"実行するよ"
} else {
"実行しないよ"
}

実際のコード(一部)はこれです。変数名のセンスが独特ですよね・・(By 開発の人、私は開発じゃないです)といわれているので
出すのが恥ずかしかったんです。混乱を生んだようでして申し訳ない。

>で何が戻ってくるか確認すればなぜそう言うふうに動くかわかると思う

 ・0か0を超える値か
 ・nullかnullを除く何らかの値か

でtrue or falseが決まる感じでしょうか?
 
-notって、-notだけじゃ赤傍線引かれるけどなにがだめなんだと思ったら、-not〜って表現があったんですね。
ありがとうございます。
0930デフォルトの名無しさん
垢版 |
2021/02/07(日) 10:26:29.15ID:fgGFki9a
>>923
($data -eq 'green').Count -eq 0
これってgreenが含まれない場合は最初の-eq演算による絞り込み結果が$nullになって
ぬるぽになるかと思いきや$null.Countの呼び出しは特例的に0を返すんやね
またPowershellの妙な癖を覚えてしまった
0931デフォルトの名無しさん
垢版 |
2021/02/07(日) 11:48:29.36ID:jX/y7Db/
>>930
> これってgreenが含まれない場合は最初の-eq演算による絞り込み結果が$nullになって
ならないよ、単に空の配列になるだけ
gm -inputobject ($data -eq 'yellow')
とかやればわかる
0934デフォルトの名無しさん
垢版 |
2021/02/07(日) 20:57:33.01ID:rt2m338a
>>913,917
6.0で仕様変更された

https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/breaking-changes-ps6?view=powershell-7.1#unify-cmdlets-with-parameter--encoding-to-be-of-type-systemtextencoding-5080
-Encoding の値 Byteはファイルシステム プロバイダーのコマンドレットから削除されました。 新しいパラメーター -AsByteStream を使用して、入力としてバイト ストリームが必要なこと、あるいは出力がバイト ストリームであることを指定してください。
0935デフォルトの名無しさん
垢版 |
2021/02/10(水) 10:00:24.88ID:hefdb5Yb
可変長配列数?的なものの実現方法を教えてください。
CSVを以下の通り加工したいのですが、

1554412,A,B,C,D
2176944,D,C,E,F,G,H,I,J
4887447,F,H,J,A,K

こんな感じのカンマ区切りcsvを

1554412,A
1554412,B
1554412,C
1554412,D
以下同じパターン

で成形したいのです。

csv区切り文字は必ずカンマで、
フィールド数は行により異なります。

行を読み込んで、配列に入れて〜、配列の最初のフィールドを入れて〜
とぼんやり想像しているのですが、「個数が定まっていない行を、配列に入れる方法」が想像つきません。
可変長配列数?的なものの実現方法を教えてください。
0936デフォルトの名無しさん
垢版 |
2021/02/10(水) 18:12:00.38ID:hRqw8VTE
2つ目のカンマ or 改行まで読んでから要素数2の固定長配列に入れるのはどうですか。
エレガントな方法ではないと思うので、他の方の意見も参考にしてください
0937デフォルトの名無しさん
垢版 |
2021/02/10(水) 18:19:41.40ID:hRqw8VTE
あ、A, D, FじゃなくてA, B, Cでしたか。
マルチバリューカラムになっているのを正規化したいんですね。
最初の一つ目だけ取るのと勘違いしてました。

1. 一行読んでstring
2. カンマでstring.splitしてstring[]
3. [1]からstring.lengthまでを、[0]とstring.joinして、string[]
4. 全行ループ
これでどうですか
0938デフォルトの名無しさん
垢版 |
2021/02/10(水) 19:17:13.97ID:JrOSOdLx
PowerShell っぽくならこんな感じかな
'1554412,A,B,C,D', '2176944,D,C,E,F,G,H,I,J', '4887447,F,H,J,A,K' | %{
$a, $b = $_ -split ',', 2
$b -split ',' | %{ "$a,$_" }
}
0942デフォルトの名無しさん
垢版 |
2021/02/10(水) 21:58:58.82ID:hefdb5Yb
>>937
とりあえず用は足せました。が、多分ご紹介の内容と全然違うことをやってると思います。
レスの内容が半分分かりませんでした。

>3. [1]からstring.lengthまでを
ここが猛烈にヒントになってこんな感じにしました。

foreach ($l in Get-Content C:\temp\test.txt) {
$l=$l.Split(",")
1..(($l.Length) - 1) | % {write-host ($l[0],$l[$_]) }
}

サンプルのコードをいただけると幸いです。

>>938
これも無事動きました。ありがとうございます。
%ってのを知りませんでした。

Powershell難しすぎです。
勉強してるんですが、正直心折れそうです。
bashはそこそこ使えるので行けるだろと思ってたんですが、ナメてました。
死にそうです。
0943デフォルトの名無しさん
垢版 |
2021/02/10(水) 22:00:44.14ID:hefdb5Yb
>>942
自己レスすいません。

これも結局、

write-host ($l[0],$l[$_]) }
で間をカンマ区切りにしたかったんですけど、
1時間手を変え品を変えで結局ダメでした。

何が悪いんでしょうか。
0944デフォルトの名無しさん
垢版 |
2021/02/10(水) 22:12:55.91ID:hefdb5Yb
何度もすいません。

write-hostで標準で区切り文字が半角スペースになってるという事実がやっとわかりました。
{write-host -Separator "," $l[0]$l[$_]}

で無事に希望の出力を得ることができました。

ありがとうございました。
0945デフォルトの名無しさん
垢版 |
2021/02/11(木) 00:08:14.80ID:lj0aoxL+
すっきり書けなくてもどかしい
$csv -split "\r\n" | % { $a = $_ -split ','; $a[1..($a.Count - 1)] } | % { $a[0], $_ -join ',' }
0947デフォルトの名無しさん
垢版 |
2021/02/12(金) 09:16:23.07ID:q/2+I+Zd
$?で直前のコマンドの実行結果を知ることができますが、
直前に実行したコマンドのPIDを知る方法ってありませんか?

Start-Process -FilePath c:\bin\command.exe -ArgumentList 1
$cmd1pid=get-chokuzenn-pid
$cmd1pid
78968

Start-Process -FilePath c:\bin\command.exe -ArgumentList 2
$cmd1pid=get-chokuzenn-pid
$cmd1pid
4292

実際に動かしたいのは、ttpmacro.exe(Teratermのマクロ)です。
Teratemマクロで外部の機器にsshで接続して、ssh接続のログの内容を見て
そのプロセスを終了させるか判断したいと思っております

書こうとしているスクリプトを動かす時点で、1個もTeratermが動いていないなら、
Get-Processでなんとかなると思うのですが、上記スクリプトを実行する時点で
ほかのTeratermが動いている可能性があり、それを間違って死なすわけにはいかず、
Powershellスクリプト内で、Start-Processなりで動かした、直前のプロセスのIDを知る方法があればと思い相談させていただきます

すいません、よろしくお願いいたします。
0948デフォルトの名無しさん
垢版 |
2021/02/12(金) 09:17:40.74ID:q/2+I+Zd
test.ps1

Start-Process -FilePath c:\bin\command.exe -ArgumentList 1
$cmd1pid=get-chokuzenn-pid
$cmd1pid
78968

Start-Process -FilePath c:\bin\command.exe -ArgumentList 2
$cmd2pid=get-chokuzenn-pid
$cmd2pid
4292


すいません、スクリプトの例に誤りがありました
訂正します
0951デフォルトの名無しさん
垢版 |
2021/02/12(金) 11:17:25.75ID:jxDcSv/l
>>947
プロセスIdなんて取る必要ない(むしろ危険)
>>950が言うように-PassThruオプションつけるとSystem.Diagnostics.Processオブジェクトが返ってくるからKill()メソッド呼ぶだけでいい
レス数が950を超えています。1000を超えると書き込みができなくなります。

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