X



PowerShell -Part 6
レス数が1000を超えています。これ以上書き込みはできません。
0005デフォルトの名無しさん
垢版 |
2022/02/17(木) 00:21:49.24ID:CBYlGRMr
今までコマンドプロンプトを使っていましたが、windows power shellに乗り換えました。

コマンドプロンプトでは、エクスプローラーからドラッグ&ドロップでファイルパスが入力できましたが、
windows power shellではできませんでした。
ファイルパスを楽に入力する方法はないんでしょうか
0007デフォルトの名無しさん
垢版 |
2022/02/17(木) 15:17:37.72ID:1Rki5Xrp
ドラッグ&ドロップを扱うのはコンソールの仕事なんじゃ?

conhostで試してみたけどcmd/pwsh/windows powershellどれでもいけた
あんまり設定弄ってないはずだけど、左上クリックして出てくるメニューのプロパティからコピペ関連の項目があるので触ってみては

wtで試すと何れのシェルでもファイルのD&Dは受け付けなかった、異常に高機能なのに意外
wtのことならwtスレで聞くといいかと
0008デフォルトの名無しさん
垢版 |
2022/02/17(木) 15:25:50.87ID:1Rki5Xrp
追伸
wtはexplorer上でファイルをコピーしてctrl+[shift+]vでペーストするとファイル名が入力される

D&Dにこだわる理由がないなら慣れた方が早そう、労力は大して変わらないだろう
00095
垢版 |
2022/02/17(木) 19:52:12.95ID:CBYlGRMr
>>6-8
power shellはwindowsボタンを右クリックして起動するやつを使いました。
今試したら、D&Dできないのは「管理者として実行」する方で、通常モードならD&Dできました。
管理者モードかどうかで挙動が変わるんですね・・・。
0010デフォルトの名無しさん
垢版 |
2022/02/17(木) 22:56:43.04ID:urCZGbW+
UIPIって仕組みで権限またぎのドラッグアンドドロップは禁止されてるみたいね
0011デフォルトの名無しさん
垢版 |
2022/02/19(土) 09:43:41.33ID:Z9XVFihU
wtスレってどこだよ
勝手が違うから戻してほしいしこんなの作る前に非コンソールのpowershell出せよ
0012デフォルトの名無しさん
垢版 |
2022/02/19(土) 10:18:51.14ID:Klz8S7Ad
まるでスマホの使い方がわからず店頭でキレて周りに介助してもらおうとするおじいちゃんと同じ言動で草
wtにファイル名をドロップできないのは誤解で、cmdと同じ管理者モード間のOSによるセキュリティ機構のUIPIが原因だった
wtはcmdよりよっぽど癖がない良アプリ
Powershellのほうがよほど癖強い
あとwtは普通に元に戻せる
0014デフォルトの名無しさん
垢版 |
2022/02/19(土) 15:57:35.72ID:22rkCkNI
>>13
ドラッグアンドドロップという操作が危険だから狙い撃ちで制限されているというわけではなくて、プロセス間のメッセージ通信に対して制約が掛けられた結果ドラッグアンドドロップも使えなくなった
00168
垢版 |
2022/02/22(火) 02:53:21.18ID:LHZaRsEg
>>14
ああ、conhostをadmin専用にしてて、そこから各シェル立ち上げたと思うわ
俺環でテキトーな検証してごめん
0018デフォルトの名無しさん
垢版 |
2022/02/22(火) 20:22:44.35ID:wkvlg9SU
前スレの質問者に本当に必要だったものは、たぶんこういうのだと思うんだ…
class node {
[node]$val;
[node[]]$children;
}
0020デフォルトの名無しさん
垢版 |
2022/02/22(火) 21:34:19.39ID:5aCEOBVD
昔csvdeのエクスポートデータをVBSで木構造に変換したりしたけどその時はジャグ配列でなんとかなった
powershellだと配列に色々罠があるから大変そう
コマンドレット化されてるデータ構造を扱う事は得意でもテキストを1から解析して階層データとして扱うのには向かない気がする
0021デフォルトの名無しさん
垢版 |
2022/02/22(火) 22:00:01.99ID:LHZaRsEg
木のテキスト表現がカッコや""等ならbalancing groupでパースするのが便利だよ

perl/Pythonよりdotnetのパターン言語の方が強い(丸パクリだから当然だけど)
0022デフォルトの名無しさん
垢版 |
2022/02/22(火) 22:10:34.21ID:LHZaRsEg
組み込み型はスプラッターしちゃうとか罠多いから、内部でキッチリ階層持ちたいなら>>18みたいなロートルな手段が堅牢だったり

仕様覚えるという道もあるけど俺は諦めた
0023デフォルトの名無しさん
垢版 |
2022/02/22(火) 22:27:40.62ID:U3xoo538
逆説的だけど、.NETに詳しくない俺みたいな人ほどテキスト処理は抑えておくべき

なんか良く分からん物が返ってきても、オブジェクトの印字表現をOut-Fileで捕まえてテキスト処理にフォールバックできる()
0024デフォルトの名無しさん
垢版 |
2022/02/22(火) 22:59:38.55ID:LHZaRsEg
-match一発でパースが済まない木の表現は、段落を使って木を表現するyamlみたいなやつ
balancing group+複数行マッチで頑張れるかもしれないけど、地道にインデント数えてるわ
0025デフォルトの名無しさん
垢版 |
2022/02/22(火) 23:31:15.02ID:+zCOrMmD
一見不器用でもインデントレベルは素直に数えるのが正解
例えばpythonインタプリタもカウンタを使って構文をパースしてる

yaml系のシリアル化フォーマットは、インデントを数えるだけでパーサが書ける移植性が売り
0027915
垢版 |
2022/02/25(金) 01:33:26.38ID:wLKzA9jy
変数を文字列の中に入れ込んでしまって、消せないフォルダが出来てしまいました

C:\works\+ $a

削除もリネームもフォルダ移動すら出来ません
どうすれば削除出来ますでしょうか?
お知恵を貸してください
0028デフォルトの名無しさん
垢版 |
2022/02/25(金) 02:07:17.42ID:3hSRN4MI
ファイル名に$が入って、$aが展開されちゃう的な?ならエスケープすればいいだけでは
`$a
意図を汲めてるかちょっと自信ないけど
0029915
垢版 |
2022/02/25(金) 07:49:52.49ID:wLKzA9jy
>>28

1. 変数を使ってフォルダを作ろうとした

2. 変数に値を代入した $a = 0225

3. C:\works\0225 を作りたかったので
“C:\works\ + $a” としたかったが
’C:\works\ + $a‘ としてしまった

4. + $a という名前のフォルダが
C:\works\ 直下に作られた

5. エクスプローラからもPowershellからも
+ $a と名前のついたフォルダは削除、リネーム、
移動が出来ない
C:\works\ + $a\test.txt のように+ $a フォルダ内に
ファイルを作る事は可能

Win10 Windows powershell 5.1 VSCODEで作成
細かい所はあまり覚えてませんがこんな感じです
0030デフォルトの名無しさん
垢版 |
2022/02/25(金) 08:55:58.66ID:Ex9z+jLY
うちの環境では削除できた
なんかのプロセスにロックされてるんじゃないの?
0032915
垢版 |
2022/02/25(金) 11:29:32.26ID:omaqMYjV
>>31
これは失礼しました
エラーは下記です。普通の名前のフォルダは削除出来ます

Remove-Item : 引数 '$null' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:1
+ Remove-Item + $a
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
0033915
垢版 |
2022/02/25(金) 11:32:06.01ID:omaqMYjV
ちなみにフォルダを右クリックして出てくるプロパティ→セキュリティのタブには
「要求されたセキュリティ権限は利用できないか、または表示されません。」
とのエラーも出てます
0035915
垢版 |
2022/02/25(金) 12:06:55.57ID:omaqMYjV
>>34
すみません。。
やってみました

Remove-Item : パス 'C:\works\ + $a ' が存在しないため検出できません。
発生場所 行:1 文字:1
+ Remove-Item 'C:\works\ + $a '
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\works\ + $a :String) [Remove-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
0036デフォルトの名無しさん
垢版 |
2022/02/25(金) 12:16:43.02ID:SH4WT7RG
コマンドプロンプトを管理者権限で起動
rd /s /q エクスプローラーから対象フォルダをD&D

これで無理なら排他制御キャンセルするソフト使うかPCを一旦再起動
0038915
垢版 |
2022/02/25(金) 12:30:35.39ID:omaqMYjV
>>36
ありがとう御座います

「指定されたファイルが見つかりません」
と返されました。再起動も状況変わらず

Dirコマンドでは+ $a は表示されておりエクスプローラでも見えてるのですが何故か認識されないです
0039デフォルトの名無しさん
垢版 |
2022/02/25(金) 12:36:38.88ID:yKl3/QUV
コマンドで消したいだけならワイルドカードやタブ補完で選択すればいいじゃない

再起動後エクスプローラーから消せないか試したの?

何がしたいのか分からん
0040915
垢版 |
2022/02/25(金) 12:42:21.42ID:omaqMYjV
>>37
空白で思い出しました
試行錯誤してて
'"C:\works\' + $a + '\"'
のような事もやってました

なので(なのかどうかも分かりませんが)フォルダの名前には + $a と後ろにも空白が入っています
0041915
垢版 |
2022/02/25(金) 12:44:41.55ID:omaqMYjV
>>39
エクスプローラからの削除だと削除後も+ $a フォルダが残り続けます

やりたい事: + $a フォルダを削除したい
0042915
垢版 |
2022/02/25(金) 12:48:15.22ID:omaqMYjV
追記正確なフルパス名
[]は半角スペースです

C:\works\[]+[]$a[]
0043デフォルトの名無しさん
垢版 |
2022/02/25(金) 12:55:42.52ID:SH4WT7RG
その親フォルダにカレントディレクトリを移動して他に$付くフォルダが無い、或いは削除してしまって良いなら
for /d %a in (*$*) do rd /s /q "%~a"
0046915
垢版 |
2022/02/25(金) 13:06:19.04ID:omaqMYjV
>>43
やはり指定されたファイルが見つかりませんと返されました

一旦整理します

目的︰ + $a フォルダを削除したい
環境:Win10, Win PS ver 5.1, Vscode 1.64.2

記述:'"C:\works\"[]+[]$y[]+[]"\"' (かなり記憶が曖昧)
フルパス C:\works\[]+[]$y[]
※[]は半角スペース

1. エクスプローラ
1.1 右クリック削除→削除後もフォルダが残り続ける
1.2 リネーム→「この項目は見つかりません。次の場所にはありません。」
1.3 移動→同上

2. PS
2.1 Remove-Item(\works直下)→「引数 '$null' を受け入れる位置指定パラメーターが見つかりません。」
2.2 Remove-Item(フルパス)→「 パス 'C:\works\ + $a ' が存在しないため検出できません。」

3. CMD
3.1 rd /s /q→「指定されたファイルが見つかりません」
0047915
垢版 |
2022/02/25(金) 13:07:15.53ID:omaqMYjV
上記 $y → $a です
すみません
0048915
垢版 |
2022/02/25(金) 13:10:23.66ID:omaqMYjV
>>44
saでも変わらずでした

>>45
>>46の1.1と同じでした
0051デフォルトの名無しさん
垢版 |
2022/02/25(金) 15:04:10.02ID:gazry23L
>>47
> 上記 $y → $a です
> すみません
だからさあ、入力した内容とエラーメッセージをそのまま貼ってくれよ…
0054デフォルトの名無しさん
垢版 |
2022/02/25(金) 21:06:53.72ID:zbdaU1gm
dir /x
で8.3形式のファイル名があるなら、それで消してみる
だめなら、>>50の形式でフルパスを指定する
0055915
垢版 |
2022/02/26(土) 12:47:40.66ID:AL/cEm3C
ありがとうございます。
レス遅くなりました。以下のように返ってきました。
>>53で出てきたフォルダ名+[]$aと末尾に半角スペースが見えません。
見えない文字が埋め込まれている可能性はありますでしょうか?

>>52
dir : 項目 C:\works\ + $a が見つかりませんでした。
発生場所 行:1 文字:1
+ dir "*a*"
+ ~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\works\ + $a :String) [Get-ChildItem], IOException
+ FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

>>53
dir : 項目 C:\works\ + $a が見つかりませんでした。
発生場所 行:1 文字:1
+ dir "*a*" | %{remove-item -LiteralPath $_.name}
+ ~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\works\ + $a :String) [Get-ChildItem], IOException
+ FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
0056915
垢版 |
2022/02/26(土) 12:47:51.62ID:AL/cEm3C
>>54
ドライブ C のボリューム ラベルは Windows です
ボリューム シリアル番号は AE2C-1EB8 です

C:\works\ のディレクトリ

2022/02/23 16:50 <DIR> + $a
2022/02/25 10:55 <DIR> .
2022/02/25 10:55 <DIR> ..
0 個のファイル 0 バイト
3 個のディレクトリ 1,144,323,043,328 バイトの空き領域

>>50
使い方が分からず試せてません
0057デフォルトの名無しさん
垢版 |
2022/02/26(土) 13:19:35.91ID:zbGeAZZp
Win10の質問スレ行けって言ったのに何故行かないのかな?
powershellに拘る理由がわからないよ

仕方ないのでこっちで回答するわ
Poweshell関係ないけど

https://itojisan.xyz/パソコンのトラブル/windows10でフォルダ・ファイルを削除できない/

これ全部試せ
0058デフォルトの名無しさん
垢版 |
2022/02/26(土) 13:34:00.21ID:DA2+bsLA
これ本来含まれないはずの+が含まれてるから消さないんでしょ

ディスクエディタかなんかで強制的に消せる名前にリネームするしかないのでは?
(FAT時代にしかやったことないからNTFSでできるかは知らん)

曖昧な記憶のスクリプトを正確に思い出せればなんとかなるやもしれんが
普通の方法では+がファイル名かフォルダ名の一部と解釈されないから消すのは無理だと思う
なかなかコーナーケースのバグ見つけたなw

多分PSでどうこうできる領域じゃない
再インストールが一番早いかもw
0059デフォルトの名無しさん
垢版 |
2022/02/26(土) 13:36:55.01ID:+OtunY2h
当てずっぽうで試す前に、まずabout_Quoting_Rulesを読んでくれ
何かおかしい文字が入ってるのかは、[byte[]]にキャストすれば分かるから
それ見て正しくクオートして入力してくれ
0060デフォルトの名無しさん
垢版 |
2022/02/26(土) 14:08:05.70ID:+OtunY2h
>>58
+を特別扱いするのはNTFSじゃなくて、特定のコマンドの仕様では?(copy fi+le等)
色んなコマンドが内部で引いてる可能性があるから避けたほうが無難な文字とは思うけど
$もNTFS的には合法だけど、予約名のプレフィックスにする慣習なので、なので避けたほうがいいのは確か
undocumentedなのもいっぱいある
0061デフォルトの名無しさん
垢版 |
2022/02/26(土) 14:54:37.65ID:+OtunY2h
win10/pwsh7.2.0/NTFSで試してみた

> ni -d sandbox |sl
> echo valid? >'+ $a'
> gci |select name
Name
----
+ $a
> ri '+ $a' &&echo $?
True
> gci |select name
# no output

うーん?
0064デフォルトの名無しさん
垢版 |
2022/02/26(土) 15:46:10.03ID:EUVpr27z
検証した
cmdを起動して rd "\\?\C:\works\ + $a " が正解だった
このやり方はPowershell経由では消えない
末尾スペースが再現できなかったから md "\\?\C:\works\ + $a " で作った
0065915
垢版 |
2022/02/26(土) 16:01:12.94ID:AL/cEm3C
>>62
>>64
消えました!!凄い!!!
ご教示頂きました皆さん本当にありがとうございます!
0066915
垢版 |
2022/02/26(土) 16:04:31.69ID:AL/cEm3C
因みに rd “\\?\〜“ってどんな意味でしょうか?
0068デフォルトの名無しさん
垢版 |
2022/02/26(土) 16:49:18.98ID:+OtunY2h
ずこー
ファイル名に末尾スペースはNTFS的に非合法のはずなのに、なんで作れちゃうかな
闇が深い
0069デフォルトの名無しさん
垢版 |
2022/02/26(土) 16:54:25.81ID:+OtunY2h
一応補足しとくとシェルは関係ない、pwshから非合法パス名へアクセスするのにも(ri)Remove-Item "\\?\~"は使える(使えてしまう)
0071デフォルトの名無しさん
垢版 |
2022/02/26(土) 20:14:14.01ID:+OtunY2h
ri -lp '\\?\C:\Users\ore\sandbox\trailing 'で消せた
そもそも-literalpath指定無しには正しくない名前のファイルは作れないようになってる

標準のFileSystemプロバイダは静かに切り詰めるようだけど、できればエラーにしてほしいところ
0072デフォルトの名無しさん
垢版 |
2022/02/26(土) 20:16:53.67ID:+OtunY2h
当たり前だがext4上では合法だから普通に作れるな
プロバイダ依存きをつける
0073デフォルトの名無しさん
垢版 |
2022/02/26(土) 20:28:51.97ID:HRmzshO4
各々のプログラムのモラルに任せられてるのが残念なところ
pwshからコマンドレットを使う限りはうっかり変なもの作るの阻止してくれるのが救いか

linux/mac上ならそもそもOSがハネてくれるのでpwshで余計なチェック挟む必要もないのだけど
0076デフォルトの名無しさん
垢版 |
2022/02/26(土) 23:23:38.20ID:U2u/902M
いや真似しても普通には再現できなかったよ
\\?\ でなんとか作った
条件もわからんしいたずらに憂いてもしょうがない
0077デフォルトの名無しさん
垢版 |
2022/02/28(月) 02:46:56.51ID:RHAmUG8r
APIで普通に作れるから対策したつもりてもコマンドを適当に組み合わせたら偶然できるようなレベル
web上に消し方の情報が沢山あるのはそういう理由
0080デフォルトの名無しさん
垢版 |
2022/02/28(月) 14:17:24.11ID:9W2zYqHy
そりゃあえて迂回したらな

Test-Path -IsValidは信頼できるのだろうか?
中身分からものに頼るよりendswith(". ")とかで自分でバリデーションするべきか
0081デフォルトの名無しさん
垢版 |
2022/02/28(月) 14:24:32.38ID:9W2zYqHy
任意文字列渡されてもそのまま作らせない、あるいは勝手に置換+ユニークIDにリネームが現実的な防御策か
ファイルシステム移行で問題起こす事もあるし、どこでも合法なファイル名に正規化しておいた方が後のため
0082デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:01:04.99ID:Xoh24ILj
>>79
ID変わってるけど64と78は同一人物です
psを普通に使う範囲までこのOSの瑕疵を気のするのは過剰品質だと感じるし、日本の安心安全神話で生産性クソ低い件を連想してしまう
0083デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:11:14.28ID:NrGkgOto
bashとか平気で不正ファイルポンポン作るからヤバい
OSが拒否するのを期待してるからそれ自体が悪い訳ではないのだが、安易にwindowsで使うのは本当にヤバい
0084デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:27:14.93ID:9W2zYqHy
win版のgitに付いてくるの使ってるけど、unix系ツールはファイルシステムに気を使う移植は見たことがない
仮想ドライブに隔離してしまうのが手っ取り早くて安全そう
0085デフォルトの名無しさん
垢版 |
2022/02/28(月) 15:40:26.92ID:9W2zYqHy
>>82
これな
考えれば考えるだけボロが出てくるし思考放棄することにした

行儀悪いプログラムの後始末のやり方だけ知っときゃいいのよ
(真剣な仕事でなければ)
0087デフォルトの名無しさん
垢版 |
2022/03/01(火) 03:09:34.84ID:L/ghTddK
>>82
これは瑕疵ではない、仕様とMSは一応言ってるんじゃね?

>>67によると ↓ だそうだから、自分でちゃんとチェックしろ、対処しろということだろうし

ファイル i/o の場合、 \ \ パス文字列の "? \ " プレフィックスは、すべての文字列解析を無効にし、その後に続く文字列をファイルシステムに送信するために、Windows api に指示します。

↑こう書くのはおそらく他OSのコードをそのまま移植しやすくするため、なんでね?

つまり何もチェック(今回の例なら末端にスペース入ってないか)せずにAPIに渡すと
結果として>>29のようなことが起き得ると
0089デフォルトの名無しさん
垢版 |
2022/03/01(火) 13:31:53.46ID:fDW5QBJr
powershellで文字コード?順でソートしたい時どうしたらいいんでしょう
3---t.txt
3-1-t.txt
4---t.txt
4-1-t.txt
ってファイルがある時、'-'が0x2dで'1'が0x31だから、
3---t.txt
3-1-t.txt
4---t.txt
4-1-t.txt
と並ぶのを期待したのに昇順でソートしたら
gci | sort
3-1-t.txt
3---t.txt
4-1-t.txt
4---t.txt
になってしまう
今確認したらcmdのdir /ONオプションでも同じだった
0090デフォルトの名無しさん
垢版 |
2022/03/01(火) 13:42:53.50ID:fDW5QBJr
ファイル名の末尾の英字取って
3---.txt
3-1-.txt
4---.txt
4-1-.txt
としたら
3---.txt
3-1-.txt
4---.txt
4-1-.txt
になったけど意味が判らない
変なバグに遭遇した気分
0091デフォルトの名無しさん
垢版 |
2022/03/01(火) 16:20:44.39ID:XlErARwx
最近のWindowsは9.txtの後ろに10.txtが並ぶように数の大小を考慮したソートを標準で行うからそのアルゴリズムが生む微妙な綾じゃね
レジストリによって挙動が変わるはず
文字コード順を順守させたいならファイル名標準のソートにならないように、ハッシュテーブルの引数なんかを使って単なる文字列としてソートしてあげればいいんじゃないかな
0092デフォルトの名無しさん
垢版 |
2022/03/01(火) 22:49:13.37ID:qg4SVCg0
テストしてないし遅い気がするけど
下準備なしがよければ
gci | sort {[Text.Encoding]::Unicode.GetBytes($_.Name) | %{'{0,3}' -f $_}}

※Shift_JIS基準がよければ
gci | sort {[Text.Encoding]::GetEncoding('shift_jis').GetBytes($_.Name) | %{'{0,3}' -f $_}}

重複ないなら
$list = [Collections.Generic.SortedList[string,IO.FileSystemInfo]]::new([StrintygComparer]::Ordinal)
gci | %{$list.Add($_.Name, $_)}

重複あるなら
$list = [Collections.Generic.List[IO.FileSystemInfo]]::new()
$list.AddRange([IO.FileSystemInfo[]]@(gci))
$list.Sort({Param($a, $b) [StringComparer]::Ordinal.Compare($a.Name, $b.Name)})
0094デフォルトの名無しさん
垢版 |
2022/03/02(水) 17:54:20.18ID:qWIZmWPY
>>89
PowerShell 5.1だと確かにそうなるけど
PowerShell 7.2.1だとgci | sort で期待通りの結果になったよ
最新バージョン使った方が良いんでない?
0095デフォルトの名無しさん
垢版 |
2022/03/02(水) 21:57:02.42ID:Gj5Erajd
PowerShellでSQliteのデータベースに追記操作しようと思っていますが
テーブル名を変数にし、カラムと追記したい内容を配列で操作しようとすると上手くいきません。
一括で出来ないなら配列内ループでと思いやってみましたが、そちらもうまくいきませんでした。
配列でINSERTするには、以下のサンプルだとどういった記述をすればよいのでしょうか?
0096デフォルトの名無しさん
垢版 |
2022/03/02(水) 21:57:57.51ID:Gj5Erajd
using namespace System.Data.SQLite

Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"

# モジュールのインポート
Import-Module SQLite

# データベースファイル
$db_path = "E:\ps1\sqlite\sample.db"

# コネクションオブジェクトの生成
$con = [SQLiteConnection]::new() | % {
$_.ConnectionString = ("Data Source = {0}"-f $db_path)
$_.Open()
$_
}

$cmd = [SQLiteCommand]::new()
$cmd.Connection = $con
0099デフォルトの名無しさん
垢版 |
2022/03/03(木) 00:11:25.85ID:Ai6V8ofW
どこでどんなエラーが出てるのか分からないし試してないけど
文字列の中で配列変数をそのまま展開してるのが原因なんじゃないかな。

$cmd.CommandText = @"
INSERT INTO $Table ($($ArrCol -join ', ')) values ($($ArrRecord -replace '^|$', "'" -join ', '))
"@

※余計なお世話だろうけどインジェクション対策がないので必要なら入れてね。
 (SQLiteがサポートしてるか知らないけど通常はSQLパラメータを使用。)
0101デフォルトの名無しさん
垢版 |
2022/03/03(木) 22:26:57.79ID:vKIVQ1+Z
すみません、色々試したのですがわからずまた質問させてください

$Table = "2022"
$ArrCol = @("No","Day","Name")
$ArrRecord = @("1","2022/03/03","山田")

だとして
0102デフォルトの名無しさん
垢版 |
2022/03/03(木) 22:35:42.15ID:vKIVQ1+Z
cmd.CommandText = @"
INSERT INTO "2020" ("No","Day","Name") values ("1","2022/03/03","山田")
"@
だとエラーなくデータベースに追記出来るのですが
0103デフォルトの名無しさん
垢版 |
2022/03/03(木) 22:37:17.23ID:vKIVQ1+Z
$cmd.CommandText = @"
INSERT INTO [string]$Table ("No","Day","Name") values ("1","2022/03/03","山田")
"@

だと"0"個の引数を指定して"ExecuteNonQuery"を呼び出し中に例外が発生しました"SQLite error near "2022":syntax error"
0104デフォルトの名無しさん
垢版 |
2022/03/03(木) 22:37:58.49ID:vKIVQ1+Z
あと
$cmd.CommandText = @"
INSERT INTO "2022" ($($ArrCol -join ', ')) values ("1","2022/03/03","山田")
"@


$cmd.CommandText = @"
INSERT INTO "2022" ("No","Day","Name") values ($($ArrRecord -replace '^|$', "'" -join ', '))
"@

だと
"0"個の引数を指定して"ExecuteNonQuery"を呼び出し中に例外が発生しました"SQLite error near "/":syntax error"

とエラーが出てデータベースを変更できませんでした
色々試したのですが理由がわからず申し訳ございませんが教えたもらいたく
0105デフォルトの名無しさん
垢版 |
2022/03/03(木) 22:42:34.74ID:vKIVQ1+Z
すみません
5chだとSQL関係で書き込めなかったのですが

$cmd.え(E)xecuteNonQuery() | Out-Null
も各場所で記入しています
0106デフォルトの名無しさん
垢版 |
2022/03/04(金) 01:01:51.54ID:rY0dcLRW
SQLをデータベースに渡す前に、ヒアドキュメントがどう変数展開されているのかデバッグしたりコンソール出力してみるといいよ
いろいろミスに気づくはず
軽く見た感じ次のように展開されてる気がする
INSERT INTO [string]2022 ("No","Day","Name") values ("1","2022/03/03","山田")
INSERT INTO "2022" (No, Day, Name) values ("1","2022/03/03","山田")
INSERT INTO "2022" ("No","Day","Name") values (1, 2022/03/03, 山田)
0107デフォルトの名無しさん
垢版 |
2022/03/05(土) 08:12:15.74ID:UxduI4YM
PowerShell and OpenSSH team investments for 2022
https://devblogs.microsoft.com/powershell/powershell-and-openssh-team-investments-for-2022/

We continue to explore and discuss with the Windows team how to make it easier to deploy PowerShell 7 on Windows.
As noted previously, support lifecycle differences between Windows and .NET along with size constraints we don’t have the ability currently to ship PowerShell 7 in Windows.
Previously we considered a bootstrapper to be a viable solution giving the experience of being inbox in Windows, however, it would have been a significant effort to implement.
Instead, we are exploring shipping a cmdlet in Windows PowerShell to make it easy to install PowerShell 7.
A new RFC will be published to discuss this.
010892
垢版 |
2022/03/05(土) 11:18:59.79ID:2eHlJFPP
>>92
1つ目の例のUnicodeはUTF-16LEの事だからだめだったね。
BigEndianUnicode(UTF-16BE)にする必要があったし、
そもそもbyte型にしてエンディアン気にする必要もないから、
gci | sort {[int[]][char[]]$_.Name | %{'{0,5}' -f $_}}
でよいはず。
※全く関係ない別の作業中になんか急に気づいた。
010999
垢版 |
2022/03/05(土) 11:34:56.78ID:2eHlJFPP
SQLiteがカラム名等を「"」で括る事を要求しているなら
$cmd.CommandText = @"
INSERT INTO "$Table" ($($ArrCol -replace '^|$', '"' -join ', ')) values ($($ArrRecord -replace '^|$', '"' -join ', '))
"@
かな。>>106さんの言う通りなので確認してみて。

これもだめなら、成功例と、失敗例や変数値のテーブル名が違うからそこかも。
0110デフォルトの名無しさん
垢版 |
2022/03/05(土) 17:03:38.16ID:aFkos6IC
>>107
もう開発やめりゃいいのにな
これまでWindowsに入ってるから採用されてきただけで、わざわざ入れて使うならPowerShellなんか選ばれるわけがない
コマンドレットで簡単に導入できるようにするならPowerShellじゃなくてPythonにでもしたほうがいいんじゃないか
0111デフォルトの名無しさん
垢版 |
2022/03/05(土) 22:04:13.92ID:BfpuuE1g
インストールしてなくてもpythonコマンドでMSストア版pythonのダウンロードページに飛ばされるから、既にpwsh7よりも導入が楽という悲しみ
0112デフォルトの名無しさん
垢版 |
2022/03/05(土) 22:12:35.50ID:vfk/Azs+
PowerShellってそんな残念なプログラム言語なんですか?
がんばって勉強したのに納得できません
0113デフォルトの名無しさん
垢版 |
2022/03/05(土) 22:41:29.84ID:ws14fGQi
PowerShell5系は向こう10年は大丈夫
6以降はAzure以外では全く使われておらず、Azureに生涯を捧げるのでない限りは完全無視でOK
0114デフォルトの名無しさん
垢版 |
2022/03/06(日) 11:25:06.52ID:2dMAfvhM
メインは蛇使いだけど
色々インポートしなくてもそこそこ戦えるのでregex、小規模データ処理、重くない数値計算がシェルから直接引けるpwshは有り難い

ネイティブライブラリ揃ってないからパワーが居るのはPython、まあPython自体はpwshとドングリ背比べ(処理速度、標準ライブラリもほぼ等価)だけど、やはりライブラリが強い
0118デフォルトの名無しさん
垢版 |
2022/03/06(日) 16:40:58.28ID:N33QeZ0g
ちょっと詳しい人に聞きたいんだけど開発環境で使用しているSDKのコマンドがcmdだと実行可能だけどPowershellだと一切認識されませんてエラーがでるんだけどこの理由はなぜ?
WIndows 11だとターミナルのデフォがPowershellなのにもやもやする、この解決方法はある?
もう一つ、ファイル名を指定して実行で起動したcmdからはSDKのコマンドが実行できるのに、Terminal(wt.exe)の既定のcmdからコマンドを実行すると認識されていませんエラーが出るんだけどこの原因もなぜ?解決方法はある?
cmdとpowershellとterminalと複数のshellを用意してMSは何がしたいのかマジで意味がわからない
WSLとか作っててOSSに寛容になったんだからさっさとデフォのShellをbashかzshにしてくれれば開発環境としてより便利なのに・・・
0119デフォルトの名無しさん
垢版 |
2022/03/06(日) 16:49:05.43ID:4qF5AnI1
しかもそのデフォルトで開くPowerShell、既に非推奨のバージョンなんだぜ
もう完全に破綻してるからWSLだけ使えばいいのよ
0120デフォルトの名無しさん
垢版 |
2022/03/06(日) 17:14:53.35ID:Y34SWeR7
>>118
情報少なくてわかんないけど、カレントフォルダに対して「.\ファイル名」の記法で書いてないとかはない?
ファイル名に特殊記号を含むとか
0121デフォルトの名無しさん
垢版 |
2022/03/06(日) 19:53:05.95ID:+PaQnGDE
bashとかは言語的にはPowershellに比べて時代遅れ過ぎるわ

さっさとPowershell7に統一したほうが遥かにマシ
0122デフォルトの名無しさん
垢版 |
2022/03/06(日) 20:11:36.59ID:GpPJTCKS
10や11に標準で入ってる5.1で動くようにしてる人が大半じゃないの
機能的にも特にこれ以上期待するものはないんだけど
0123デフォルトの名無しさん
垢版 |
2022/03/06(日) 20:14:22.19ID:N33QeZ0g
>>119
いやマジでそれでしたwww
PS7をインストールしてPS7で実行したらCLI認識しましたイミフwww
そしてPS7をインストールしてもアップデートされずWin11デフォのPS5がそのままアンインストールもできず鎮座してるくそすぎて草
0124デフォルトの名無しさん
垢版 |
2022/03/07(月) 00:21:21.62ID:M26ldpDZ
>>106
デバックで出力したとき文字列だから勝手に"が消されているものかと先入観を持ってしまっており疑問にすら思いませんでした
丁寧に説明していただきありがとうございます。

>>109
ありがとうございます。明日確認してみます。
0125デフォルトの名無しさん
垢版 |
2022/03/07(月) 17:43:24.45ID:GqmKE44y
powershell.exeに-Fileで.ps1スクリプトを指定する場合に、
引数で文字列配列を指定する簡単な方法はありますか?

.ps1側に変更を加えるのは無しで、Param()は以下の指定だとします。
Param( [string[]] $p1, [string[]] $p2 )

普段はPowerShellコンソールや他のスクリプトからこの.ps1を使っています。
これを.batに組み込みたい事があったものの配列の指定方法が分からず、
以下のように-Commandにして回避しました。
-Fileの場合でも指定方法があったのかな、と気になっています。

powershell.exe -c "〜.ps1 -p1 @('aaa', 'bbb') -p2 @('ccc', 'ddd')"
012696
垢版 |
2022/03/08(火) 02:39:16.58ID:BWZbDM8v
$Table = "2022"
$ArrCol = @("No","Day","Name")
$ArrRecord = @("1","","")

このようにブランクの配列があると
'1', ', ','
上のように途中の「""」が「'」シングルクォーテーション1つになりエラーが起こっているということがわかりました。
ですので
$ArrRecord | foreach-object -Process {$_ -replace '"',"'"}
として配列内で変換しようと思ったのですが、$_の時点でダブルクォーテーションが取れており上手く変換できない状態です

($($ArrRecord -replace '^|$', '"' -join ', '))の「'^|$'」は正規表現で前と後ろを「"」で変換するということですよね
途中のパイプの意味がわかっていないです
0127デフォルトの名無しさん
垢版 |
2022/03/08(火) 10:15:51.20ID:HM66xeZm
>>126
苦戦してるね
まずプログラミング一般の基礎として、ソースコード上に文字列型の変数値を直接書きたいということを伝えるための(文字列リテラルの)引用符と、文字列の中に引用符という文字データを含めたいと伝えるための引用符は別なので理解・区別しておかないとずっと混乱する
$_の時点で引用符が取れたという感覚は間違いで、今回文字列の中身には引用符文字は含まれていなくて、文字列リテラルですと伝える引用符になってる
次に、^|$ で置換する発想は、文字列の特定の位置が先頭または末尾なら置換というところまでは狙いどおり
でも空の文字列だった場合、正規表現処理が文字列を左から走査したとき「先頭かつ末尾」という単一の位置しかないので、置換も一回しか行われず引用符一つだけになるというバグになってる
例えばこうすれば文字列リテラルのなかに引用符文字を入れられる
($("""$ArrRecord""" -join ', '))
($("`"$ArrRecord`"" -join ', '))
($("'$ArrRecord'" -join ', '))
いずれも外側の二重引用符がリテラルの引用符で、内側の引用符が文字データの引用符
0128デフォルトの名無しさん
垢版 |
2022/03/08(火) 10:21:04.34ID:HM66xeZm
>>127
配列じゃなくて各要素の文字列を囲まないとダメたった
($("""$_""" -join ', '))
($("`"$_`"" -join ', '))
($("'$_'" -join ', '))
あと正規表現のパイプは「または」という意味
0133デフォルトの名無しさん
垢版 |
2022/03/09(水) 10:12:30.93ID:EcV8v1IL
>>131
Linux版使った事ないから
bashとどう比較してるか興味あるよ
優劣を列挙しもらえると助かる
0134デフォルトの名無しさん
垢版 |
2022/03/09(水) 15:06:09.10ID:Cj1SKgXQ
powershellはC#埋め込んでそこで定義したクラスとかがpowershellで使えるとこがいいところだから
bashもそうしたらいいとおもう
0137デフォルトの名無しさん
垢版 |
2022/03/09(水) 21:24:55.35ID:oTLaCJPf
コマンドレットの出力がオブジェクトで目的のプロパティから値が取り出しやすい
Where-object一つ覚えればフィルター出来るからコマンド毎にフィルタの仕様で悩む必要が無い
正規表現がperl拡張表現で標準搭載、コマンドやら環境によって規格が違うとか悩む必要がない

シェルスクリプトとしてそれだけでも全然いいわ
0138デフォルトの名無しさん
垢版 |
2022/03/12(土) 11:12:49.22ID:2x7XRkpq
regex沼に入る気はないけど$matches.namedで参照できるだけでもかなり有り難い

pwsh固有の事情としては(?-i)を繁用するな
sls等コマンドレットに-CaseSensitive渡したり-[ci]matchが入り乱れてたのがスッキリした
0140デフォルトの名無しさん
垢版 |
2022/03/15(火) 01:12:21.45ID:z4wleAC0
>>128
レスの内容を色々と検索しながら勉強させていただきました
まだエラーが出て止まっていますが、こちらで少し対応を考えてみたいと思います
本当に丁寧に教えていただきありがとうございます
0141デフォルトの名無しさん
垢版 |
2022/03/16(水) 22:20:26.82ID:Rh84s05v
二つの引数をとる関数に引数を二つ渡したら、一個目引数が全部持っていくのはなんで?
コード
function war {
param($putin, $zelenskyy)
Write-Host 'putin has ' $putin
Write-Host 'zelenskyy has ' $zelenskyy
}

war('Russian','Ukraine')

結果
putin has Russian Ukraine
zelenskyy has
0144デフォルトの名無しさん
垢版 |
2022/03/17(木) 00:07:43.00ID:0/d09PRO
格好も括弧も関係ない
シェルなんだから引数の区切りは空白と言うだけの話
0148デフォルトの名無しさん
垢版 |
2022/03/17(木) 12:57:17.38ID:ENyjKfBg
赤文字で出るエラーメッセージをログに出力して、
エラーログが出てるか適当な箇所で判定して、ログをnotepadで開くってことをやりたいです。
標準エラー出力みたいなのの取得方法を教えて下さい
0151デフォルトの名無しさん
垢版 |
2022/03/17(木) 21:22:30.00ID:KFCC0Q8d
長いから分かりやすくていいんだろ
wとか言われてもユーザーを笑いものにするコマンドか?としか思えんし
0153デフォルトの名無しさん
垢版 |
2022/03/19(土) 12:37:58.38ID:vJYdrJTe
配列の配列について

$array_of_array = @(
@(
'1-1'
'1-2'
'1-3'
),
@(
'2-1'
'2-2'
)
)
$array_of_array | foreach {
Write-Host 'L1' $_
$_ | foreach {
Write-Host ' L2' $_
}
}
結果は期待通り
L1 1-1 1-2 1-3
L2 1-1
L2 1-2
L2 1-3
L1 2-1 2-2
L2 2-1
L2 2-2
0154デフォルトの名無しさん
垢版 |
2022/03/19(土) 12:39:12.90ID:vJYdrJTe
だが、カンマを省略すると
$array_of_array = @(
@(
'1-1'
'1-2'
'1-3'
)
@(
'2-1'
'2-2'
)
)
結果は期待と違う。配列の配列じゃなくて、ただの配列になっている?
L1 1-1
L2 1-1
L1 1-2
L2 1-2
L1 1-3
L2 1-3
L1 2-1
L2 2-1
L1 2-2
L2 2-2
0155デフォルトの名無しさん
垢版 |
2022/03/19(土) 12:40:41.61ID:vJYdrJTe
改行してカンマをいれると
$array_of_array = @(
@(
'1-1'
'1-2'
'1-3'
)
,
@(
'2-1'
'2-2'
)
)
後半だけ、配列が要素になっている?
L1 1-1
L2 1-1
L1 1-2
L2 1-2
L1 1-3
L2 1-3
L1 2-1 2-2
L2 2-1
L2 2-2
どういうことなのか教えてよ。
0157デフォルトの名無しさん
垢版 |
2022/03/19(土) 16:28:22.32ID:vJYdrJTe
https://docs.microsoft.com/ja-jp/powershell/scripting/learn/deep-dives/everything-about-arrays?view=powershell-7.2#nested-arrays
「これらの例では、コンマは非常に重要です。 以前に示した通常の複数行での配列の例では、コンマは省略可能でした。 多次元配列の場合はそうではありません。」
そうではありませんと言われても、エラーになるわけでもなく、どうなるのか誰か教えて
0158デフォルトの名無しさん
垢版 |
2022/03/19(土) 23:33:26.82ID:GptrjqcJ
>>153-155
あまり自信はないのですが、
・「単項の ,」と「配列要素区切りの ,」は別物です。
 (「-1」と「1 - 1」の「-」が別物、みたいな違い。)
・式の終端と見なせる箇所にある改行は「;」と概ね等価です。

>>153の「,」は「配列要素区切りの ,」です。
>>155の「,」は「単項の ,」です。
0159デフォルトの名無しさん
垢版 |
2022/03/19(土) 23:33:48.95ID:GptrjqcJ
ワンライナーにするとこんな違いがあります。
>>153
@( @('1-1'; '1-2'; '1-3';) ,@('2-1'; '2-2';); )
>>154
@( @('1-1'; '1-2'; '1-3';); @('2-1'; '2-2'); )
>>155
@( @('1-1'; '1-2'; '1-3';); ,@('2-1'; '2-2';); )
0160デフォルトの名無しさん
垢版 |
2022/03/20(日) 00:30:34.10ID:V8R16naX
追加。
Out-*やWrite-*で出力先が示されていない改行や「;」などは、
暗黙のWrite-Outputが動くと考えるとよいです。

つまり「@(〜);」は「Write-Output @(〜);」となり、この時、配列が1段階分解(要素取出)されます。
ただし「単項 ,」の「,@(〜)」は「Write-Output -NoEnumerate (,@(〜))」となり、分解されません。

イメージ的にはこんな違い。(本当は他にもWrite-Outputが入ります)
>>153
@( (Write-Output @('1-1'; '1-2'; '1-3';), @('2-1'; '2-2';)); )
>>154
@( (Write-Output @('1-1'; '1-2'; '1-3';)); (Write-Output @('2-1'; '2-2';)); )
>>155
@( (Write-Output @('1-1'; '1-2'; '1-3';)); (Write-Output -NoEnumerate (,@('2-1'; '2-2';))); )
0161デフォルトの名無しさん
垢版 |
2022/03/20(日) 01:20:05.34ID:EnzWedk+
暗黙のWrite-Output
コマンドレットのような何某かの出力を持つものと、Powershellのスクリプト内で定義された関数や式の評価結果を
うまいこと混ぜることが出来るようにする仕掛けなのでしょうか
完全に理解しては居ませんがが、理解に努めます
文法知識は「Windows PowerShell実践システム管理ガイド 第3版(日経BP)」の第2章を読んだだけなのですが
これだけは全然足りないtのを痛感しました
何かお勧めはありませんか
0162デフォルトの名無しさん
垢版 |
2022/03/20(日) 01:39:27.35ID:KeTIMbSf
powershellは行志向寄りの言語だから改行はC/C++でいう暗黙の副作用完了点みたいな意味を持っている
何も考えず複数行にまたがる式を書くと思わぬ事故に繋がるから、C/C++の\やVBの_みたいに行継続を示す`を行末に付けるといいよ

$array_of_array = @( @('1-1', '1-2', '1-3') `
, @('2-1', '2-2'))
0163デフォルトの名無しさん
垢版 |
2022/03/20(日) 14:33:02.79ID:V8R16naX
>>161
今回の挙動の予想や理解は、構文のパース(式・文の区切り)、
独特なパイプラインの挙動、分かりづらい「単項 ,」の存在などがあり
わりと難易度の高いものです。

>>156>>162さんに同意で、配列の配列(ジャグ配列)を避け
行の継続を「`」で明示する事をお勧めします。

書籍では『Windows PowerShell イン アクション』がお勧めです。
ただv1の本なので今となっては内容が古く、紙だと新品の入手が難しいです。
※これのv5以上版が日本語で出て欲しい…。
https://www.sbcr.jp/product/4797337362/

あとは>>157のMSのサイト等。
about_*も有用な事が書かれてますが、日本語訳やサンプルコードの質が酷く、
多くの人がよく使う機能と一部の人が稀に使う機能が同じ扱いの記述なのが難点。
0164デフォルトの名無しさん
垢版 |
2022/03/20(日) 22:00:12.10ID:L+yKE55O
Powershellの洋書翻訳はもっと盛んになってほしい
オライリーのクックブックも原著は改定4版まで出てるのに日本語は初版のままだし
0165デフォルトの名無しさん
垢版 |
2022/03/21(月) 00:56:42.09ID:OI2SuuED
今時英語できないの日本人だけだからな
土人とか馬鹿にしてる韓国、中国、インド、ベトナム、フィリピンなんてネイティブレベルで英語できるからな
これで日本のレベルは低くないとかそれ以前の問題だよ
0166デフォルトの名無しさん
垢版 |
2022/03/21(月) 08:39:53.52ID:2Zu3Swq+
エリート層は英語できるだろうよ
馬鹿は海外だと底辺でも英語ペラペラだと思ってやがるが
0167デフォルトの名無しさん
垢版 |
2022/03/21(月) 09:24:20.27ID:JwhA0ika
日本ですら母国語での情報の鮮度が落ちるんだから
それらの国のプログラミング学習希望者は
必然的に英語の勉強からしないといけないだけの話じゃないかな?

日本のレベルが低いとか
英語できるのはエリート層だけとか
そういう問題じゃないと思いますよ

アニメ理解したいから日本語勉強しましたと
同じレベルの話な気がする
0168デフォルトの名無しさん
垢版 |
2022/03/21(月) 09:42:44.22ID:3OVxtXqz
まとめて挙がってるけど国によって差は大きい
インドとフィリピンは英語が公用語で世界でも有数の英語話者が多い国

日本の英語力が低すぎて世界に遅れを取っているというのは同意
学校教育も都度見直されてるしそのうち改善されるんじゃねーの、知らんけど
プログラマーなら英語を読むだけでもできるように少しずつ学ぶ気概は欲しい
ボク英語わからないんですと幼稚な変数名を付け続けるのはよくない
0169デフォルトの名無しさん
垢版 |
2022/03/21(月) 14:48:55.98ID:fHQFhWIP
日本は国内に金と仕事があるせいで海外でなくても稼げるからなあ
英語理解できなくても儲かる職業の筆頭が
マスコミと教育と役人政治家の時点で英語教育が変わるわけ無いじゃん
0170デフォルトの名無しさん
垢版 |
2022/03/21(月) 16:01:23.66ID:l99FVYBX
ITに限定すると英語は必要なんだけど英語に限らず日本のITエンジニアの多くは勉強しない
能力を伸ばしても給料が上がらず残業が増やされるだけと諦めるのが常態化している
0171デフォルトの名無しさん
垢版 |
2022/03/21(月) 16:10:09.00ID:l99FVYBX
国内に金があるというのは微妙な話になってきている
世界ワースト級の低成長による沈下を続けていて、本当に有能なエンジニアは海外に流出して残るのはIT土方ばかり
ノーベル賞受賞者が元日本人ばかりというのと同じような話が起こってる
GAFAのようなIT企業が伸びないから低成長から抜け出さない負のスパイラル
0172デフォルトの名無しさん
垢版 |
2022/03/21(月) 21:14:58.00ID:dTmdB0AV
海外ならGAFAみたいな企業がたくさんあるとでも思ってるのかこのゴミは
GAFAは世界中でも1つしか無いんだよ
0173デフォルトの名無しさん
垢版 |
2022/03/21(月) 21:25:38.84ID:vIzK+CHc
GAFAはひとつとな?
MARCHはひとつみたいな哲学かな?
のようなという日本語の意味はわかるのかな?
0175デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:10:37.43ID:KVIRUNm3
これ使って出来ることってフォルダ弄りファイル弄り設定弄りだけ?
他に出来ることないの?
0176デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:21:42.31ID:kikOm2qa
あとは何かプログラムを走らせたり、せいぜいOSの機能を実行するくらいかな
リモートで出来たりするけど、しょせんはローカルに出来ることがリモートでも出来るってだけだな
まだ勉強をはじめたばっかりだけど、そのマシンで出来ないことは出来ないんだなって分かった
0177デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:25:39.51ID:gjcW4Tfu
>>175
bashなんかのシェルとは違って.NETベースだからC#やVB.NETでできることは一通りできるよbashなんかと違ってね
メンテが楽だからあえてpowershellでGUIを作ったりする場合もある
0178デフォルトの名無しさん
垢版 |
2022/03/22(火) 00:37:38.83ID:aUdC0GfB
正規表現使えるしWindowsだとわざわざPythonセットアップして使うより楽だし利便性高い気がする
0179デフォルトの名無しさん
垢版 |
2022/03/23(水) 00:40:52.77ID:G2Twh9Sv
>>175
PowerShellは基本的にはWindowsサーバーの管理に使うもの
管理系のコマンドレットが非常に充実している
0180デフォルトの名無しさん
垢版 |
2022/03/23(水) 04:18:15.48ID:IVt1k3VA
>>177
出来るからって普通はやらんよまともな脳みそしてるならVSCode使う
お前みたいなのが秀丸やEMでコーディングしてるでぇー(ドヤッっイキリ散らかして周りが迷惑する馬鹿そのものだな
0181デフォルトの名無しさん
垢版 |
2022/03/23(水) 08:31:22.61ID:eqSZnoCQ
>>180
VSCodeを使うの意味が分からん
VSCodeでPSスクリプト組むならいいの?
なんで処理系の話でエディタの話になるの?
0182デフォルトの名無しさん
垢版 |
2022/03/23(水) 09:01:03.65ID:TpwnHNL9
分かってるくせに…
対面だと「何いってんだコイツ…」とか思いながらも愛想笑いしてそうだな
0183デフォルトの名無しさん
垢版 |
2022/03/23(水) 10:01:20.99ID:Jvnypl+E
釣りでしょ
面倒見いい人なら、オマエそれブーメランやんけーて言ってあげたら喜ぶよ
0185デフォルトの名無しさん
垢版 |
2022/03/24(木) 03:56:01.53ID:cKyI7Sj4
write-sqltabledateで列名は指定できますか?
計算列のあるテーブルでその列を飛ばしたいのですがPsCustumObjectのプロパティ名が無視されて並び順で投入されてしまいます。
0188デフォルトの名無しさん
垢版 |
2022/03/26(土) 14:42:03.29ID:u+BPDoH4
そういう挙動ということはWrite-SqlTableDataはメタデータを考慮してなさそうだし
Invoke-Sqlcmdでやれば?
0189デフォルトの名無しさん
垢版 |
2022/03/26(土) 14:50:17.14ID:pYdvgAQA
コマンドレットの命名規則をケバブケースにしたMSの馬鹿を殺してやりたい
補完でタブ押して確定してまたタブ押して確定してってのがめちゃくちゃイライラする
0193デフォルトの名無しさん
垢版 |
2022/03/26(土) 21:42:22.31ID:M1Ul1dov
文字列をPowerShellの文字列リテラルとして出力したいのですが、どうやったら楽ちんに出来ますか?

例えば下記を実行すると
$s = "``i`'`""
function literally {
param ($t)
return $t
}
Write-Output (literally $s)
実行結果は
`i'"
こうなりますが、
"``i`'`""
こうなってくれる function literally は既存の関数にありますか?
0194デフォルトの名無しさん
垢版 |
2022/03/27(日) 06:15:33.62ID:LvwD4OI0
>>188
ありがとうございます
やっぱそれが無難ですかね
IDENTITYにしたオートインクリメントな列は空文字列の代入で飛ばせたので計算列も何か方法が無いかと思ったのですが…
0195デフォルトの名無しさん
垢版 |
2022/03/27(日) 13:30:01.63ID:mnGGi+fZ
>>193
literally が何を意図してるのかわからんが
単一引用符のヒアドキュメントで囲むとか
$s = @'
"``i`'`""
'@
必要なリテラル部分だけ抜き出したファイルを作成してgcで読むとかすりゃいいんじゃね
あとは必要ならInvoke-Expressionなりして使う
まじめにコード内でエスケープ処理とかやろうとしたら一晩掛かるよ
0197デフォルトの名無しさん
垢版 |
2022/03/28(月) 00:54:22.58ID:8p5xi9DH
--- ここから x.ps1 ---
function x {
$s = (Get-Content -Path 'a.txt')
Write-Output ('$a = ' + "'" + $s + "'")
}
x | Out-File 'a.ps1'
--- ここまで ---

--- a.txt の中身が ---
im.dat
--- ここまで ---

の場合
0198デフォルトの名無しさん
垢版 |
2022/03/28(月) 00:57:03.84ID:8p5xi9DH
a.ps1 は
$a = 'im.dat'
となって PowerShellで読み込める

--- a.txt の中身が ---
i'm.dat
--- ここまで ---
の場合
a.ps1 は
$a = 'i'm.dat'
となってシンタックスエラーになる。こういう場合のためにエスケープ処理をしたいのです。
0199デフォルトの名無しさん
垢版 |
2022/03/28(月) 02:14:50.68ID:vgVAp+/s
>>198
であるならば>>195で示したヒアドキュメントを使えばそんな処理は不要になる
function x {
$s = (Get-Content -Path 'a.txt')
'$a = ' + "@'"
$s
"'@"
}
x | Out-File 'a.ps1'
0200デフォルトの名無しさん
垢版 |
2022/03/28(月) 02:28:26.94ID:8p5xi9DH
a.txt の内容が下記の場合はエラーになります。
'@.dat

----
いまさら気が付きましたが、やりたいことは、
PowerShellスクリプトをPowerShellで出力したいので、文字列をエスケープしたい。
最初から、こう言えればよかった。
0201デフォルトの名無しさん
垢版 |
2022/03/28(月) 07:29:09.01ID:vgVAp+/s
>>200
そういうのも想定するなら'@で分割して結合するだけ
これで穴の無さそうなエスケープ処理相当にはなったかな
function x {
$s = Get-Content -Path 'a.txt'
[string[]]$t=$s -split "'@"
for ($i = 0; $i -lt $t.length; $i++) {
if ($i -eq 0) {
'$a = ' + "@'"
} else {
'$a += ' + "`"'@`""
'$a += ' + "@'"
}
$t[$i]
"'@"
}
}
x | Out-File 'a.ps1'
0202デフォルトの名無しさん
垢版 |
2022/03/28(月) 08:39:09.99ID:5tj62u6D
文字列リテラルの構文仕様を見るかぎり、

function ConvertTo-StringLiteral ([string] $s) {
 '"{0}"' -f ($s -replace '[$"\u201C-\u201E`]', '`$&')
}

でいいのでは。

function x {
 $s = Get-Content a.txt
 '$a = ' + (ConvertTo-StringLiteral $s)
}

みたいに使う。
0203デフォルトの名無しさん
垢版 |
2022/03/28(月) 09:30:54.03ID:5tj62u6D
>>201
普通の「'」以外のシングルクォート類(*)も、正当なシングルクォート文字なので、
a.txt に「‘@.dat」とか入力されるとエラーになる穴が...。

(*) U+2018、U+2019、U+201A、U+201B
0205デフォルトの名無しさん
垢版 |
2022/03/29(火) 02:15:34.71ID:ieHzhZh4
>>202
https://www.microsoft.com/en-us/download/details.aspx?id=36389
これを見つけたので 22ページあたりを読むと、シングルクォートで囲む verbatim-string-literal は、割とシンプルで
single-quote-character(普通のシングルクォート+4個) を含む場合に single-quote-character single-quote-character とするので

function ConvertTo-SingleQuotedStringLiteral ([string] $s) {
 "'{0}'" -f ($s -replace "['\u2018\u2019\u201A\u201B]", "'$&")
}
こうすればいいのだろうか?
0207202
垢版 |
2022/03/29(火) 09:28:46.66ID:H9URZ70O
>>205
うん。範囲指定できるので、"['\u2018-\u201B]" とか書くと、もっとシンプルかも。

>>206
U+3000 の Unicode クラスは Zs で、正当な空白文字なので、コピペで動いてくれる。
0209デフォルトの名無しさん
垢版 |
2022/04/04(月) 21:22:25.32ID:ECqCrQfL
>>1
$url=$($site="+pj.og.ldn.iakkokA3%etis=q?hcraes/moc.elgoog.www//:sptth".ToCharArray();[Array]::Reverse($site);-join $site)
"ソビエト人","支那人","朝鮮人" | % {start "$url$_";sleep 21}
0210デフォルトの名無しさん
垢版 |
2022/04/07(木) 22:32:51.33ID:49oapsGv
(Get-Date).ToString("M/d") # 4/7
(Get-Date).ToString("M") # 4月7日
(Get-Date).ToString("d") # 2022/04/07

"M"と"d"単体で取れないのは仕様なの?
0214デフォルトの名無しさん
垢版 |
2022/04/13(水) 21:32:59.17ID:wBIIYhTi
事務員がこれ使って自動化して評価されるかね?
Excel VBAとかだと認知されてるし動きも分かるからアピールになりそうだけど、これはps1をダブルクリックしたら既に結果が出てるキンクリ状態になるんで何か地味なんだよね
出来ることは多彩なのにさ
0216デフォルトの名無しさん
垢版 |
2022/04/14(木) 16:18:50.55ID:NCtDoq3M
キンクリ状態てどういう意味なん
例えばExcel操作の自動化なら最初に$excel.Visible = $true
とでもしとけば同じようにリアルタイムで処理中の動きが出てくるけど
事務員ならいらん仕事押し付けられるのがオチだから隠しとけ
この程度でドヤりたいならIT土方にでも転職しなよ
0217デフォルトの名無しさん
垢版 |
2022/04/14(木) 20:27:06.96ID:PvzsrQHs
事務員がマクロやスクリプトで評価されても給料や時給が上がったりはしないだろ
都合よく使われるだけだよ
退屈な定常業務から抜け出したい動機なら良いのかも
0218デフォルトの名無しさん
垢版 |
2022/04/14(木) 20:32:25.20ID:PvzsrQHs
×定常業務
○定型業務
0220デフォルトの名無しさん
垢版 |
2022/04/14(木) 21:57:43.29ID:ICzBofFJ
それがパワー・シェルの能力……
ボクがこのps1をダブルクリックした時点で"結果"はもう確定しているッ!!
マクロみたいなトロいもんじゃあないんです
0221214
垢版 |
2022/04/14(木) 22:27:15.00ID:7HZEzgeQ
やっぱり評判あんま芳しく無いからやめとくわ
回答してくれた皆さんありがとう
0223デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:51:23.89ID:UtgXyNoL
パワーシェル
破壊力 A
スピード B
射程距離 A
持続力 B
精密動作性 E
成長性 E

タイプ 自動操縦型
能力 人が嫌がる仕事をする

To Be Continued…
0231デフォルトの名無しさん
垢版 |
2022/04/15(金) 23:31:17.12ID:3ZMsARLO
PowerShellはランキングとか関係ないでしょ
PS5止まりで.NET4.8と心中する運命しかない、完全に袋小路の言語だよ
0233デフォルトの名無しさん
垢版 |
2022/04/16(土) 12:02:03.34ID:nVJ4wCm0
>>232
おれがこれまで作ったソフトのほとんどが共に滅ぶな
かなりの割合の開発者が一緒に滅ぶんじゃないだろうか
0234デフォルトの名無しさん
垢版 |
2022/04/16(土) 12:30:34.16ID:4vTOoh05
>>231
それってよく聞くけどなんの問題があるの?
Powershellなんてそもそもbetter MS-DOSであり
better WSHでしかないんだからなんの問題もないでしょ
なんか過剰な期待をしてた人がいるの?
0235デフォルトの名無しさん
垢版 |
2022/04/16(土) 12:58:53.88ID:NFUA2B25
そもそもすでにオープンソースなんだし衰退することはあるだろうけど袋小路とか意味わからん
0239デフォルトの名無しさん
垢版 |
2022/04/16(土) 16:24:09.56ID:nVJ4wCm0
>>237
コードちら見したけど普通にPSプロセス呼んでプロセス間通信した方がよくないってなった
0243デフォルトの名無しさん
垢版 |
2022/04/21(木) 02:16:18.40ID:/A3pqg11
20年位前の30代前半の頃、小6と付き合ってた
powershellのお陰だと思うよたぶん
0244デフォルトの名無しさん
垢版 |
2022/04/21(木) 03:15:46.74ID:+OyHOy+D
>>243
そのころpowershellは未だ無いだろ

おれの場合は30年位前に小6と付き合っていると噂されたが事実はそのようなことはなく
当時powershellがあれば付き合えたのは確実だったと思う
0245デフォルトの名無しさん
垢版 |
2022/04/21(木) 15:56:01.36ID:6s2N7jdI
ワイも小学生低学年のころ、かけっこで1位だった
PowerShellのおかげだろうなあ
0246デフォルトの名無しさん
垢版 |
2022/04/29(金) 11:16:42.60ID:8kZAWy9o
htmlの特定のID(例:<div id="XXX">)の中身を取得するにはどうすればいいでしょうか?
htmlのソース自体は$sourceに格納しています。
0247デフォルトの名無しさん
垢版 |
2022/04/29(金) 11:18:43.54ID:RNDpr+pH
文字コードを文字に変換するコマンドはありますでしょうか。

PS > change-moji -code SJIS 0x41
A
PS >

こういうコマンドです。
0250デフォルトの名無しさん
垢版 |
2022/04/29(金) 23:23:53.91ID:X7f5QGPR
>>246
$html = New-Object -ComObject "HTMLFile"
$html.IHTMLDocument2_write($source)
$html.getElementsByTagName("div") | ?{ $_.ID -like "特定のID" }
みたいにCOM使ってDOMで操作するか、正規表現で自力で解析するかしか思いつかない
powershellの定番の処理方法があるなら俺が聞きたい
0251デフォルトの名無しさん
垢版 |
2022/04/30(土) 02:08:01.29ID:TTQ8Rhtz
Ruby なら、Nokogiri, CSS Selector で、

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div>あ</div>
<div id="xyz">い</div>
EOT

element = doc.at_css( '#xyz' )
puts element.content #=> い
0253デフォルトの名無しさん
垢版 |
2022/04/30(土) 13:04:46.37ID:9f5J4pIa
Windows11は、結構Powershellが主役の位置に躍り出てきて、コマンドプロンプトの影が薄くなってる。
0254デフォルトの名無しさん
垢版 |
2022/04/30(土) 15:40:15.85ID:6Xk9b1VA
>>252
DOM操作にお詳しいなら補足してやって
俺は普段webページ解析なんてしないから適当に書いただけなので
0256デフォルトの名無しさん
垢版 |
2022/05/01(日) 07:07:03.47ID:Rd1MW222
Invoke-WebRequest でパースできるんだから Web からだけじゃなく html を格納した変数とかもソースにできればいいのにね
0257デフォルトの名無しさん
垢版 |
2022/05/01(日) 22:31:03.32ID:bsI6eYYg
COMのやつってIEのパーサなんだよね
くやしいけどこの辺を高度にやりたいならスクレイピングに定評のあるスクリプトでやった方がいいと思う
0258デフォルトの名無しさん
垢版 |
2022/05/02(月) 03:17:08.47ID:GCJ++Ydj
>>250
ありがとうございます!
できました。
0259デフォルトの名無しさん
垢版 |
2022/05/07(土) 22:39:06.01ID:A4G1I3Hd
$idContents = $html.getElementById($idName).innerHTML
でinnerHTMLを取得して、$idContentsに格納してある「src」の値(src="https://〜〜.jpg)はどうやって取得するのでしょうか?
0261デフォルトの名無しさん
垢版 |
2022/05/08(日) 11:03:41.82ID:KUDJnBX7
$idContents = $html.getElementById($idName).getAttribute("src")
で試したのですが、$idContentsの中身は何もない状態です。
試しに、$idContents = $html.getElementById($idName)だけで実行すると、
$idContentsの中身に
innerHTML : <IMG id=img src="https://〜〜jpg/keystamp=〜〜;></A>
はあります。
0263デフォルトの名無しさん
垢版 |
2022/05/08(日) 12:17:10.62ID:KUDJnBX7
$idNameは'img'ではなく、'kr3'になります。
0264デフォルトの名無しさん
垢版 |
2022/05/08(日) 12:25:56.66ID:q3KU1av3
だから取得したいのは、id=imgのIMGタグにあるsrc属性値じゃないのか?
$idNameを'img'にしろよ
0265デフォルトの名無しさん
垢版 |
2022/05/08(日) 12:30:38.21ID:vSiZdN2k
ID:KUDJnBX7はバカなんだろうね
0266デフォルトの名無しさん
垢版 |
2022/05/08(日) 12:47:35.64ID:KUDJnBX7
>>264
なるほどです。ありがとうございました。
0267デフォルトの名無しさん
垢版 |
2022/05/09(月) 13:37:41.35ID:Plp0Diry
特定のフォルダの中にファイルが10個以上あったらタイムスタンプが一番古いファイルを削除する処理をPowerShellでどう書くかどなたか教えろください。。
スクリプトはタスクスケジューラで日次で走らせるイメージです。
0270デフォルトの名無しさん
垢版 |
2022/05/09(月) 16:57:08.12ID:Plp0Diry
>>268
一番古い一個だけを削除か、最新の9個を残してそれ以外を削除、の簡単な方でお願いしたいです。
0271デフォルトの名無しさん
垢版 |
2022/05/09(月) 17:37:09.13ID:7AqNU3U0
>>270
269の30を9に変更するのが簡単だと思います
一番古い一個だけを消すのは Select-Object -Skip 9 | Select-Object -Last と二回もSelect-Object するのでとても難易度が高いです
0275デフォルトの名無しさん
垢版 |
2022/05/10(火) 23:04:11.60ID:gcxSlYEt
フリーランスエンジニアになってからの年収推移を公開【現在年収1000万】

【実体験】仕事ができない新卒エンジニアでも月収70万フリーランスになれる理由

フリーランスエンジニアは年収900万円までは余裕!現役フリーランスエンジニアが徹底解説

フリーエンジニアの平均年収!未経験が年収1000万円を超える方法とは?

月額150万円以上も可能?ITフリーランスで高単価を獲得できる理由

在宅で年収1000万稼ぐフリーランスエンジニアの稼ぎ方【再現できる】

フリーランスのエンジニアやるなら45歳までに貯金5000万円作れないと死ぬ説
0276デフォルトの名無しさん
垢版 |
2022/05/12(木) 17:12:26.22ID:QXSbgRzq
フォルダA内にファイルを1つずつ個別に圧縮した上でフォルダBにそれぞれ出力するPowerShellってどう書けば良きでしょうか。
以下スクリプトを書いてみましたが、これだと1つずつの圧縮はできないようで。。。

//フォルダA内のファイル名(拡張子なし)を取得
$src = Get-ChildItem -Name C:\folderA
$file = [System.IO.Path]::GetFileNameWithoutExtension("$src")
//ファイル圧縮とフォルダ移動
Compress-Archive -Path C:\folderA\*.* -DestinationPath C:\folderB\$file
0278デフォルトの名無しさん
垢版 |
2022/05/12(木) 18:08:53.97ID:3e5cbbRq
>>276
以下のサンプルみたいにForeach-objectとか使ってCompress-Archiveをファイル毎に実行すればいい

$SrcPath = "C:\folderA\*.*"
$DstPath = "C:\folderB\"

Get-ChildItem $SrcPath|
ForEach-Object {$DstFile = Join-Path $DstPath ($_.Name -replace '^(.+)\..+$','$1');$_}|
ForEach-Object {Compress-Archive -LiteralPath $_.FullName -DestinationPath $DstFile}
0279デフォルトの名無しさん
垢版 |
2022/05/12(木) 18:27:26.96ID:ZUpAZ75N
PowerShellで複数アイテムに同じ処理をする場合は、アイテムをリストアップした出力をパイプでForEach-Objectに渡して
ForEach-Object の中で、一個ずつ($_ という変数で参照できる)処理するのが定番と思うの。

get-childitem | foreach-object { write-output $_.fullname $_.name }

とりあえず、これをやってみると感じが分かると思うの。
0280デフォルトの名無しさん
垢版 |
2022/05/12(木) 20:27:03.08ID:QXSbgRzq
>>278
ありがとうございます。
ただ、フォルダAにファイル2つ置いて試してみたのですが、いずれも圧縮・移動されませんでした。。。
再度ご確認いただけますでしょか??
0282デフォルトの名無しさん
垢版 |
2022/05/12(木) 23:17:43.20ID:TAn4nFm7
ここは労働の場じゃないからな
金のやり取りを伴ってる仕事とは違うのになんでお客様気分丸出しでいられるんだよ
0284デフォルトの名無しさん
垢版 |
2022/05/12(木) 23:56:30.38ID:z9H8Cfuc
>>280
Compress-Archive の使い方(パラメーターの指定方法)は分かってますか?
ファイル一個だけで試してみましたか?
それを調べてから
Get-ChildItem -path "C:\folderA" -File | ForEach-Object {
Compress-Archive -LiteralPath $_.FullName -DestinationPath ("C:\folderB\" + $_.Name + ".zip")
}
これの意味を考えてみてください。
0285276
垢版 |
2022/05/13(金) 00:26:01.86ID:/s7ZcOSV
解決しました!ありがとうございます!
0286デフォルトの名無しさん
垢版 |
2022/05/13(金) 03:41:22.40ID:tKRLPzFb
Ruby で、7-zip なら、
a フォルダ以下を再帰的に圧縮して、a.zip アーカイブにする

圧縮
7z a (アーカイブ名) (圧縮したいフォルダ)
7z a sample.zip aaa_folder

archive = "C:/Users/Owner/Documents/test/a.zip"
src_dir = "C:/Users/Owner/Documents/test/a"

# Program Files には半角空白があるので、"〜" で囲む
puts %x("C:/Program Files/7-Zip/7z.exe" a #{ archive } #{ src_dir }) # 圧縮
0289デフォルトの名無しさん
垢版 |
2022/05/13(金) 22:56:09.66ID:uctr9r2r
foreach中に最後の要素でないって判定どこかでできないですか
これができなくてforに書き直すはめになること何回もあるんですけど…
Foreach-Objectの場合もあったらお願いします
0291デフォルトの名無しさん
垢版 |
2022/05/14(土) 00:16:48.73ID:5a0Y4MKv
最後の要素でないってどういう目的で知りたいの?
本当に知りたいときもあるけど慣れてない人が書きがちなコードでもあるので気になった
カンマ区切りにするために最後ならカンマを付けない分岐を書くとかそういうの
0292デフォルトの名無しさん
垢版 |
2022/05/14(土) 00:17:48.74ID:hb3+ANgg
カウンタを用意してforeach対象のコンテナのlengthと都度比較する
これがモダンプログラミング()
0293デフォルトの名無しさん
垢版 |
2022/05/14(土) 00:27:25.14ID:hb3+ANgg
>>291
次の処理の前準備を現在の要素も使ってやってて最後だけ不要なとき
$i = 0
foreach ($item in $list) {
 # $itemの処理
 #
 if (++$i -lt $list.length) {
  # 前準備
 }
}
これなら普通にforのが見やすい
0294デフォルトの名無しさん
垢版 |
2022/05/14(土) 05:45:14.69ID:NJOQ17Ts
そういう最後だけ処理が違うってのは同じように処理しといて後から取り除く方が良くね?
二度手間で美しく無いように思えるけれどそれよりも
一々「最後かどうか」の判別に毎回if挿む方がバカらしく感じる
0296デフォルトの名無しさん
垢版 |
2022/05/14(土) 06:07:55.24ID:Wt4JCGPH
>>291
> カンマ区切りにするために最後ならカンマを付けない分岐を書くとかそういうの
そう言うのは最初以外はカンマを頭に付けるようにしたほうがいいかと
0298デフォルトの名無しさん
垢版 |
2022/05/14(土) 09:47:46.73ID:R8RMhLQi
そう、joinで済むんだよね
慣れてない人はフラグや分岐で処理しがち
だからまずは具体的にどんな処理をしようとしてるのか聞きたかったんだ
0301デフォルトの名無しさん
垢版 |
2022/05/14(土) 11:23:04.66ID:etUAy71A
ID変わってるけど291=298な
判定する必要のない例としてカンマ区切りを挙げて、だから具体的な例を教えてくれと書いたのに、カンマ区切りのうまいやり方をレクチャーしてくれる人が出てきたから説明しただけよ
0303デフォルトの名無しさん
垢版 |
2022/05/14(土) 13:05:47.91ID:Ws3jUYfQ
具体的な処理が分からんとどうしようもないだろ
準備じゃなくて、準備のための情報の保存にすることならできるんじゃないか
#itemの準備
#itemの処理
#次のitemの準備のための設定
として実際の準備は次のループの先頭で行うようにする
0304デフォルトの名無しさん
垢版 |
2022/05/14(土) 13:37:46.90ID:hb3+ANgg
はあ…やっぱり論点ズラしで無いことを正当化する流れになったかw
無いなら無いでいいよ
0305デフォルトの名無しさん
垢版 |
2022/05/14(土) 13:39:58.87ID:HwJxcgzF
>>289
最初、最後、何番目などには別処理をする場合は、foreachは向いてないというか
もともと for があって、何番目かを気にせず全部の要素に同じ処理をすることが多いので、そういう場合用に foreach があると思ってます
0307デフォルトの名無しさん
垢版 |
2022/05/14(土) 15:09:44.46ID:Y4vxLItZ
だからforeachでは原理的に無理
foreach($item in $items){ ... }
はざっくり
$e = $items.GetEnumerator();
while ($e.MoveNext()) {
$item = $e.Current;
...
}
みたいなコードになるから$e.MoveNext()を呼ぶまで最後かどうかはわからない
極端な話、乱数で最後にするかを決めるような実装されたらどうしようもない
0308デフォルトの名無しさん
垢版 |
2022/05/14(土) 16:18:41.32ID:YaxyXfsS
最後の要素って$list[-1]でいいんじゃないの?
if($item -ne $list[-1]){前処理}でいけると思うけど
0309デフォルトの名無しさん
垢版 |
2022/05/14(土) 18:19:29.97ID:POYL5zWo
<section id="image-test">
<a href="https://www~BBB.jpg">
<img src = "https://www~AAA.jpg">
</a>
</section>
があって、AAAとBBBのURLをそれぞれ変数にかくのうしたいのですが、これであってます?
$AAA = $web_source_code.getElementById("image-test").getAttribute("src")
$BBB = $web_source_code.getElementById("image-test").getAttribute("href")
0310デフォルトの名無しさん
垢版 |
2022/05/14(土) 18:55:56.30ID:QtW6yb+i
合ってないよ
section要素にはsrcもhrefもないんだから取れない
子や孫の要素からイイ感じで取ってきてくれるような期待をしてるんだろうけど、内側がどんな構造でいくつのimg要素とかがあるのかわかんないんだから、そんなのでイイ感じに取られる曖昧な挙動は逆に困る
要素をid指定で取ったあと.ChildNodesで自分で辿ったりする必要がある
querySelectorが使えれば楽なんだけどね
何度も似たような質問を繰り返すよりもまずHTML DOMの基礎を多少でも勉強しないとずっとハマるだけだし応用もできないよ
0311デフォルトの名無しさん
垢版 |
2022/05/14(土) 19:43:46.46ID:POYL5zWo
ありがとうございます。HTML DOMを勉強してみます。
0312デフォルトの名無しさん
垢版 |
2022/05/17(火) 11:55:50.17ID:w1KKtOUX
PowerShellである処理について、変数の値だけ変えてそれぞれに同じ処理を実行したい場合、以下のように変数の値の数だけ実処理を複数段書けば実行できました。
ただ、これだとスマートではないと思いますので、ループ処理?のような形で最初に全変数を定義する等して、実際の処理自体は1か所だけにしたいのですが、どなたか書き方教えろください。。
------------
$変数a1 = 1-a
$変数b1 = 1-b

~~処理~~
------------
$変数a2 = 2-a
$変数b2 = 2-b

~~処理~~
------------
$変数a3 = 3-a
$変数b3 = 3-b

~~処理~~
------------
0314デフォルトの名無しさん
垢版 |
2022/05/17(火) 19:17:50.09ID:ZA1GChKV
ググれとか言う奴はスレから出ていけ
0316デフォルトの名無しさん
垢版 |
2022/05/18(水) 03:24:17.13ID:CLYU5EG2
こんな初歩の初心者にpowershellの配列は難しい気がする
別の規格がちゃんとしてる言語を1つでも履修して出直してもらいたいな
プロの俺でもフィルタ関連とか関数から返した場合とかでしょっちゅう間違えるんで…
0317デフォルトの名無しさん
垢版 |
2022/05/18(水) 09:11:28.21ID:b9KxG2vQ
ベテランでも諳んじて一発正解するのは難しいかったりするけど、シェルなんだから試行錯誤で構造化プログラミングの感覚を摑めばいいと思うよ
固定長配列でハコとして使う分には落とし穴もそうないのでは
パイプは使うかもしれないし使わないかもしれない
せっかくの気付きなんだから試してみるチャンス
0318デフォルトの名無しさん
垢版 |
2022/05/18(水) 10:26:21.69ID:Q05gEBgM
まずforeach文で作ってみればいい、そんな難しくはない

foreach-objectとかのコマンドレットにしたい、てのは次の段階にしてみよう
0319デフォルトの名無しさん
垢版 |
2022/05/19(木) 01:52:14.72ID:r92G1leA
.NETのジェネリックなコレクションを使う癖を付ければpsの変な仕様に振り回されないで済むかも
0320デフォルトの名無しさん
垢版 |
2022/05/19(木) 10:22:09.77ID:hhrIPFsF
そもそも配列やコレクションをループで回したりするのはPowerShell的な発想ではない
積極的にパイプを使うんだよ
それに馴染めないならもうインラインでC#書いたほうがいい
0321デフォルトの名無しさん
垢版 |
2022/05/19(木) 11:54:46.82ID:AWcD8iuw
初学者がパイプの意味を理解するのはハードル高いと思う
コードが長くてもいいから自分のやりたいことをロジックにして組み立てる
それも出来ないうちからパイプでかくなんてさらに混乱するだけ

コマンドレットを見てすぐ処理を想像できるような慣れてる人ならいいと思うけどね
0322デフォルトの名無しさん
垢版 |
2022/05/19(木) 12:11:52.45ID:vDWzHeJO
>>320
ドトネトのコレクションはそのままパイプに突っ込めるでしょ
powershellのビルトイン配列(System.Array)をMS公開文書通りに使ってるとハマりやすいという話
0323デフォルトの名無しさん
垢版 |
2022/05/19(木) 12:19:41.05ID:HGJ493WX
初心者ですでにスクリプトも書いていてリファクタの相談なのに、パイプ使わないならC#でって…
原理主義なのか話を聞かない人なのか柔軟性が動脈硬化起こしてる人なのか
0327デフォルトの名無しさん
垢版 |
2022/05/19(木) 16:21:27.92ID:vDWzHeJO
ドトネトのコレクションはPS的には未知の参照型オブジェクトだから
PSのスコープの影響も受けないし、
配列みたいに勝手に構造を壊されたりもしないから積極的に使う事をお勧めしたい
0329デフォルトの名無しさん
垢版 |
2022/05/19(木) 17:16:58.08ID:z1zzxM54
ID変わったけど323=328な
好きなものを無条件に全肯定しないと則敵認定ってまさに信者やん
0330デフォルトの名無しさん
垢版 |
2022/05/20(金) 15:12:12.74ID:rcI504Fo
-pv/-ovで黒魔術できるのがpwshパイプの真骨頂、汚いけど…
パイプは一般にバッファ単位の目詰まりが難だけど、これは-obで自由に調節できる
-pv/-ov/-ovは共通パラメータだからいつでも使えるしpitfallsは大体これで解決できるからパイプ活用したいなら、最重要で覚えるべし
0331デフォルトの名無しさん
垢版 |
2022/05/20(金) 20:50:08.65ID:8qofalUL
>>330
パイプで最重要で覚える事はさあ、パイプはめっちゃコストコが掛かる書き方だな!って理解することじゃないかなあ
1行ずつ読んでパイプに渡してたら日が暮れるし…ずっとパイプの中で暮らさないといけない程変な言語でもない…
あっこの処理、パイプで連携したら効率いいかも…なんてあんまないのでな
これがパイプの真骨頂!って例を見せてくれたら、まあ考えを改めてもいいが…君の発言は新しいもの好きの勇み足発言にしか見えなくて痛々しい…
0332デフォルトの名無しさん
垢版 |
2022/05/20(金) 20:56:56.50ID:zxJBX/+G
PowetShell大好きパイプ大好き
可能な限りパイプを使うように努めてるよ
0333デフォルトの名無しさん
垢版 |
2022/05/20(金) 20:58:03.25ID:zxJBX/+G
ちょっと間違えちゃった
0336デフォルトの名無しさん
垢版 |
2022/05/21(土) 04:11:37.11ID:xI11xSxR
結局どんな言語や書き方であろうと慣れでしか無い
読み辛いとか言う奴の大半が適応力やワーキングメモリの低い低能
0337デフォルトの名無しさん
垢版 |
2022/05/29(日) 14:10:16.59ID:KYl341LT
2つ以上のcsvをできる限り簡単に結合する方法ありますでしょうか。

a.csv
id,name,gender
以下データ

b.csv
address,phone
以下データ

$firstcsv = a.csv
$secondcsv. = b.csv
$ketugou = connect-csv -delimiter ',' firstcsv[0] + firstcsv[1] + $secondcsv[0] + $secondcsv[1] + firstcsv[2]

$ketugou
id,name,address,phone,gender
以下データ

という感じであれば最高です。
0339デフォルトの名無しさん
垢版 |
2022/05/29(日) 18:24:56.01ID:maoDzYC5
カラムの順序指定もしたいみたいだから、cutとかでもう1処理いるね。

PowerShellだと
(>>338) | ConvertFrom-Csv | select id,name,address,phone,gender | ConvertTo-Csv
ただしConvertFrom-Csv・ConvertTo-Csvは
元データを正確に再現する必要がある場合には難あり。
(Trim()が掛かるとかダブルクォーテーションで括られるとか。)
0340デフォルトの名無しさん
垢版 |
2022/05/29(日) 18:27:45.99ID:maoDzYC5
paste使えない環境とか、Trim()掛かると困るとか、PowerShellだけで実装したい場合
function Merge-Csv {
  Param (
    [Object[]] $InputObject,
    [string[]] $Header,
    [char] $Delimiter = ','
  )
  $tbl = [Data.DataTable]::new()
  # 1行目をカラム名として使用
  foreach ($csv in $InputObject) {
    $tbl.Columns.AddRange(($csv[0].Split($Delimiter)))
  }
  # 各CSVの同じ行同士をDataRowにする。
  for ($lineIdx = 0; $lineIdx -lt $InputObject[0].Length; $lineIdx++) {
    $rowData = @(
      foreach ($csv in $InputObject) {
        $csv[$lineIdx].Split($Delimiter)
      }
    )
    $null= $tbl.Rows.Add($rowData)
  }
  # カラム順序を指定順序に変更する。
  for ($order = 0; $order -lt $Header.Length; $order++) {
    $tbl.Columns[$Header[$order]].SetOrdinal($order)
  }
  # CSV形式で出力
  foreach ($row in $tbl.Rows) {
    $row.ItemArray -join $Delimiter
  }
}
0341デフォルトの名無しさん
垢版 |
2022/05/29(日) 18:28:27.86ID:maoDzYC5
注意:
・CSVは1行1要素の配列で、1行目にヘッダがあり、データに区切り文字を含んでいない想定。
・各CSVのヘッダに重複はない想定。
・1つ目のCSVの行数を基準にしている。
・エラーチェックしてないので適宜追加すること。

例:
$csv1 = @(
@"
id,name,gender
csv1.r1.id,csv1.r1.name,csv1.r1.genger
csv1.r2.id,csv1.r2.name,csv1.r2.genger
csv1.r3.id,csv1.r3.name,csv1.r3.genger
"@ -split '\r?\n'
)
$csv2 = @(
@"
address,phone
csv2.r1.address,csv2.r1.phone
csv2.r2.address,csv2.r2.phone
csv2.r3.address,csv2.r3.phone
"@ -split '\r?\n'
)

Merge-Csv $csv1, $csv2 -Header id, name, address, phone, gender | ConvertFrom-Csv | ft -a

id     name     address     phone     gender
--     ----     -------     -----     ------
csv1.r1.id csv1.r1.name csv2.r1.address csv2.r1.phone csv1.r1.genger
csv1.r2.id csv1.r2.name csv2.r2.address csv2.r2.phone csv1.r2.genger
csv1.r3.id csv1.r3.name csv2.r3.address csv2.r3.phone csv1.r3.genger
0342デフォルトの名無しさん
垢版 |
2022/05/29(日) 19:20:10.32ID:KYl341LT
>>338-340
ありがとうございます!
書き起こしてくれるなんて、感謝のしようがありません・・。
少し読み解くのに時間がかかりそうですが、半日考えても良い手が思いつかなかったので
しっかり読んで身に着けたいと思います。

ありがとうございました。
0343デフォルトの名無しさん
垢版 |
2022/05/29(日) 23:48:36.53ID:MBI5r2Hn
割とちゃんとした風なのが出てきてよかったな
>>337の結合は別にCSVとして処理する必要ねーじゃんと思ってたわ
0344デフォルトの名無しさん
垢版 |
2022/05/30(月) 22:45:36.14ID:5eMIb3Vr
どこでみんな基礎を習得してるか気になる
都度ネット検索して見よう見まねでやってるけどちゃんと体型立てて学んだ方が良い気が最近してる

上のcsv解決の発想だって全然出てこないもの
0345デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:00:34.01ID:1p0oXEXT
PowerShellから入る人なんていないでしょ
初学者がPowerShellでまともなプログラミングを学ぶのは難しいからC#でもやった方がいいよ
0347デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:08:03.98ID:fHLpS2ag
>>345
C#もJavaも含めてほぼプログラム言語扱えない非プログラマーだけどPowershellは普通に学習出来たよ
0348デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:14:06.95ID:5eMIb3Vr
会社では追加基本インストール禁止だから使える自動化ツールがVBA、WSH、CMD、Powershell くらいしか無いのです
VBA VBSは一通り使えるけどやっぱモダンなの使いたいって事でpowershellを使いこなしたいんですよ

っていうパターンは自分以外にもきっといるんだろうなって思って
0350デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:16:19.58ID:bPn6KqG1
どの言語を学んでも解決ロジックなんかは数をこなして他人のソースサンプルを見るとかしていかないと見につかない
C#とか言語仕様は入門書が充実してるところが違うだけで読んだからといって
問題解決力が身につくわけではないことは心得ておかないとね
教科書を全部読んだからといって入試問題が解けるか?ってこと
0351デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:16:45.35ID:0w3w2Q9u
>>348
>会社では追加基本インストール禁止
そうさせましょう、そのために弊社の何とかを使いましょう、と営業してくるウザい連中がいるからね
0352デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:29:45.91ID:ArE2ZMbw
>>348
プライベートのPCでやればいい
プロでプログラミングやってる人間は学生時代やプライベートの時間など多かれ少なかれ仕事以外の時間を捧げてるんだよ
基礎から学ぶというのはそういう連中と同じ土俵に立つってことだ
0353デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:38:38.76ID:fHLpS2ag
>>349
MS365関連の処理やらcmdスクリプトの代替やらログ処理やらを目的に応じてパイプ処理やら勉強してたらどうにかなった
元々プログラム言語としての習得したんじゃないから特殊かも
0355デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:49:53.74ID:+PNdSWJO
普通にpwsh使ってコマンドライン作業してれば覚える
スクリプトもその延長線上
0356デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:54:36.28ID:9dnvWkql
いうほど精神論説いてるやついる?
〇〇論を聞いてるのに〇〇論を、そういう気の利いたフレーズを言ってみたい気持ちが先行してるように見える
0357デフォルトの名無しさん
垢版 |
2022/05/30(月) 23:57:11.82ID:NR5IHQxQ
本腰入れて文法とかほじくりたいならまずはpowershellexplainedってブログオススメ
0358デフォルトの名無しさん
垢版 |
2022/05/31(火) 00:32:11.60ID:eW10AB/z
やりたいことが先にあって、それを如何に良く実現するかをあれやこれや試行錯誤していくのがいいよ
漠然と習得したいとか体系的にとかやってると漠然としか身につかない
あと人のものをよく見ること
こういうやり方があったのか、ってのを一つでも多く体験するのがいい
0359デフォルトの名無しさん
垢版 |
2022/05/31(火) 00:43:09.74ID:z7NqqS3T
コマンドラインで補完叩きながら必要そうなパラメータやメンバ探してれば大体望みのものが見つかるはず
フラッシュ暗記的にどこに使えそうなものがあったか思い出せればヘルプも引ける

俺がワンライナー以上の事をするときの具体的な手順
必要そうな関数を一つ定義してはパラメータ与えて何回かチェック、動けばfunction:から追記リダイレクトして最後にvimで手直ししてmainを添えて取り敢えず動くものを完成
暇なときに気が向いたら体裁整えたり関数まとめたり構造化

副産物として汎用性高そうなの出来たら$profileにも追記

こういうlisp的なサイクル回して使っていくのがいいと思う
0360デフォルトの名無しさん
垢版 |
2022/05/31(火) 00:43:37.67ID:BZqNx7Tc
>>357
ありがとうございます
髭のオッサンは気になりますがチラ見した程度だと復習がてら良さそうです
0361デフォルトの名無しさん
垢版 |
2022/05/31(火) 23:10:25.48ID:OuANH9gG
このコマンドがうまく動きません。
1行で書いて、うまく動かす方法を教えてください
powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process remove-item -ArgumentList C:\Users\Public\Desktop\test -Verb runas"
Start-Process : このコマンドは、次のエラーのため実行できません: 指定されたファイルが見つかりません。
とエラーが出て正常に実行できません。

powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process cmd -Verb runas"
powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process notepad -ArgumentList C:\Windows\System32\drivers\etc\hosts -Verb runas"
このコマンドはうまく動くので、同じ感じで行けるのかと思ったのですが、上のremove-itemコマンドの場合がうまくいきません。
0362デフォルトの名無しさん
垢版 |
2022/06/01(水) 04:00:12.01ID:U+A7iBPz
remove-item.***なんて言う実行ファイルは存在しないから無理なのは当たり前
どうしてもstart-processに繋げないといけないの?
0363361
垢版 |
2022/06/01(水) 05:21:30.48ID:lJWk1HAY
>>362
レスありがとうございます。

> どうしてもstart-processに繋げないといけないの?
というわけではありません。

1行で管理者権限でRemove-Item C:\Users\Public\Desktop\testを実行する
ということが出来れば、どんな方法であっても構いません。

①powershell -NoProfile -ExecutionPolicy unrestricted -Command "Start-Process powershell -Verb runas"
②Powershellが管理者:Windows Powershellとして起動する。
③remove-item C:\Users\Public\Desktop\test を実行する

という①と③を1行でまとめる方法です。
0364デフォルトの名無しさん
垢版 |
2022/06/01(水) 11:08:03.91ID:yxFCK4Jy
>>363
自分もこの問題は解決出来なかった
UAC有効な環境で管理者権限使うならStart-processか管理者権限実行なのも一緒
しかしStart-processはコマンドレット実行出来ない模様

ワークアラウンドで別のcmdスクリプト作ってそいつをStart-processで実行させるという非スマートな力業でどうにかするしかなかった
0365デフォルトの名無しさん
垢版 |
2022/06/01(水) 11:27:22.75ID:HV/k13ls
powershell -NoProfile -ExecutionPolicy unrestricted -command "Start-Process -Verb runas -FilePath powershell.exe -ArgumentList ‘-command remove-item C:\Users\Public\Desktop\test'"
試してないけどこんな感じで出来ん?
不備とかエスケープ処理が必要だったりとかあるかも
powershellから昇格させたpowershell呼んでそこでdel
0367361
垢版 |
2022/06/02(木) 00:05:13.65ID:B9Goniqn
>>365
出来ました!ありがとうございます!
0368デフォルトの名無しさん
垢版 |
2022/06/04(土) 17:47:37.42ID:TSmSPUgr
定義した変数のメモリ開放は$nullの代入でいいのでしょうか?
メモリリソースが足りませんとエラーがでるので。
0370デフォルトの名無しさん
垢版 |
2022/06/04(土) 20:19:25.41ID:TSmSPUgr
ありがとうございます!
0371デフォルトの名無しさん
垢版 |
2022/06/18(土) 20:04:49.41ID:2rZBula1
フォルダ内にあるすべての画像ファイルにおいて、その画像のWidthが1280のものだけを削除するスクリプトを作成中ですが、ファイルはどうやって削除するのでしょうか?

Get-ChildItem "D:\Download\test" | Sort Name | % {
$img = [System.Drawing.Image]::FromFile($_.fullname)
if ($img.Width -eq 1280) {
Remove-Item $_
}
}
だと
Remove-Item : Cannot find path 'D:\Download\test_01.jpg' because it does not exist.
とエラーがでるのですが、パスの設定方法がいまいちわかりません。
0373デフォルトの名無しさん
垢版 |
2022/06/18(土) 20:51:53.83ID:2rZBula1
ありがとうございます。やってみます!
0374デフォルトの名無しさん
垢版 |
2022/06/19(日) 00:03:25.24ID:d/5y1flf
VSCode でも、コマンドプロンプト・PowerShell を使うと、
ファイル・フォルダ操作のアクセス権限が無いから、
右下のトーストに、そういうエラー通知が来る

そこで、アプリに対して、操作を許可する

それと、Windows でもファイルパス区切りに、/ を使える。
C:/Users/Owner/Documents/a.txt
0375デフォルトの名無しさん
垢版 |
2022/06/19(日) 18:24:35.04ID:xfiYTNc0
今までこれをbatで起動させていました!
-------
sc stop DoSvc

@echo off

echo.
echo ====================
echo Enable_TaskScheduler
echo ====================
echo.

rem ----- win10_ServicePreparation_DoSvc -----
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DoSvc" /v "Start" /t REG_DWORD /d "4" /f

exit
-------
特定サービスの作動強制停止およびスタートアップ強制置換です
しかしこれでは管理者権限を付与する場合、人間がコンテキストで管理者実行をその都度選んでやらねばならず、
反映の有無も再起動が必要だったり再起動なしで切り替わったり不安定です

PowerShellのps1はそれら管理者権限付与の自動化や再起動不要が可能と聞きました
ネットにはバッチのような記述解説サイトが乏しいので、コードの代替案、またはおすすめの参考書等があれば教えてください〜
0382デフォルトの名無しさん
垢版 |
2022/06/20(月) 12:50:56.18ID:E6UoKUAB
ハード的家電において、メーカーの分解拒否声明は「簡単に直せる部分を民間でやられたら業績下がるやんけ」理論が殆どと、感電・火災防止が少しって感じ
同じくソフトにおいても、メーカーの調整拒否声明は「テレメトリを拒否されると情報転売が減って業績下がるやんけ」理論がほぼ全てで、僅かに不測の事態とその対応への危惧(面倒≒ユーザー側の心配はしていない)が含まれる感じ

大体、テレメトリの最終的な購入先は巡り巡ってそれらを利用したがっているガチ支那チョン露などの反社集団でしょうに
だから米国大手の支那癒着や制裁緩和の声が消えないわけで
例え吸われても、利用先が日本国内または米国のみであればそんなに問題視しませんわ

逆にDoSvcなんかは設定での表面上なOFFやグルポをしようと内部でMB単位のダウンロードをしっかりしていますし、
DoSvc動作用の基礎データか何かと期待したいものの時間経過で増大します→つまり120%ガチテレメトリなんですよ
そしてスタートアップを無効にしなければOS設定にかかわらず強制実行+勝手に通信+削除しようと復活増量し続ける
無効にしたスタートアップさえ手動(トリガー)へ勝手に戻される→高頻度自主改変がなければOSから「DoSvcの無い空間」を作り出せない

こんなソフトの癌とも言えるものを放置出来る方々の無神経さは平和の極みですな
安いからっつって支那産PCを大量購入し自衛隊へ配布した馬鹿で愚かな国賊官僚と同レベルに思う
0383デフォルトの名無しさん
垢版 |
2022/06/20(月) 14:23:54.66ID:XSN9SiQv
>>375>>382 でいいのかな
テレメトリを目の敵にするのは勝手だけど
だからってレジストリを直接編集していい事にはならないからね
0384デフォルトの名無しさん
垢版 |
2022/06/20(月) 14:47:00.73ID:YswTafv8
会社の物とかでなければレジストリくらい好きに弄ったらいいだろ
それで何かあっても自己責任ってだけで
0385デフォルトの名無しさん
垢版 |
2022/06/20(月) 14:58:58.89ID:h1SesB6c
レジストリ編集では期待通りにいかないことを体験的に踏まえた上で上手くいく手順としてPSでやりたいって流れの質問なのにレジストリ編集するな!ってクソバイスやん
自己責任を理解せずに杓子定規で正しさを主張し続ける人にはアレな傾向を感じざるを得ない
0386デフォルトの名無しさん
垢版 |
2022/06/20(月) 15:20:32.49ID:4G+nodK/
batはレジストリの値を弄ってるのみにしか見えん
この後にPCを再起動でもさせるのか?
0387デフォルトの名無しさん
垢版 |
2022/06/20(月) 15:32:06.62ID:JJsUxIz5
だいぶ前から色んなところで聞いているけど
タスクマネージャーで権限がないから書き込めないとか
黒窓が出るのが嫌だとか
原因を追求する気もないのに聞いて回るクソヤロウだよ
0388デフォルトの名無しさん
垢版 |
2022/06/20(月) 15:46:09.48ID:3ZXlTK7A
>>378
レジストリの変更はともかく
この記事の「おしゃれなレストランにいると考えてみてください」
という謎の例えはどうかと思うw
0389デフォルトの名無しさん
垢版 |
2022/06/20(月) 17:32:51.93ID:6RdOG7wm
>>386
弄ってるよ
その続き読んだ?
引き続きレジストリ弄りたがってるとしか読めないならアスペかもな
0390デフォルトの名無しさん
垢版 |
2022/06/20(月) 18:28:34.00ID:E6UoKUAB
バッチスレは論外ですな
batやスケジューラの挙動に関して最初から細かく説明していたのですが、どう考えてもガチ支那の五毛っぽいDQNが私の最後のレスを部分的にチラ見しただけで、答えている感じでしたね^^;
冷やかしがオナニーしている状態で、バッチスレの名が泣いていました

原因も提示し、それら打開策などの例や実施結果を挙げつつも、堂々巡りの、それもむっちゃ浅い既出内容をドヤ顔で書き込まれる感じ
バッチスレで唯一のプログラミングスレらしい収穫は「俺だったら.ps1で作る」という言葉、ただひとつのみでしたわorz

あとはなかなかまとまった時間が作れず、もう少ししたらps1版のサービス削除などもネット検索・吟味できそうです

最も盛んでしたwinXP時代にソフトを制作していた年代は今50前後?で開発・更新停止などが相次いでいますよね
そんで2022年現在、高校辺りでプログラミングを必修とする云々が出ている
間が20年くらいスッカラカンなのは日本の経済力低迷を表しているようで大変残念です
そりゃ今の官僚層が自衛隊へ支那産PC送ったりするはずですわ、そんなのが国を回しているんだから^^;
0391デフォルトの名無しさん
垢版 |
2022/06/20(月) 20:16:43.25ID:+SBlN13D
直接編集しちゃいけないなんてルールはないから好きにしな
無知が無学のまま弄った責任を負わされることを防ぐためのおまじないでしかないよ
0393デフォルトの名無しさん
垢版 |
2022/06/20(月) 21:31:17.15ID:yjTGWQu/
俺はちゃんとバッチスレにサービスの設定を変えるコマンドの事書いたぞ
コマンドのドキュメントのリンク付きで

このスレでも他の人が設定変更用のコマンドレットのこと書いてるし
何をどう見てるのやら
0394デフォルトの名無しさん
垢版 |
2022/06/20(月) 22:24:09.27ID:4G+nodK/
レジストリなんて不整合があれば書き戻されることもあるのでレジストリ弄るだけで解決しない
0395デフォルトの名無しさん
垢版 |
2022/06/21(火) 00:22:01.55ID:KK61fTqr
てかバッチスレが余りにも低水準かつ五毛全開だったからこそ呆れ、唯一のまともなアドバイスに従ってパワシェへ切り替えようとしているのにさ

わざわざ別スレのリンク貼ったりパワシェスレへ出張(笑)してきたり、ほんま意味不明ですわw

ま、ストーカー云々の類いはリアルもネットも気色悪いですしバッチスレ関係者から得られるものが無いのも経験済み
似た主題なので両方のスレを高頻度で訪問しているのかな、そう思うことにして特定のレスは流し聞きしときますよwww
0396デフォルトの名無しさん
垢版 |
2022/06/21(火) 00:36:09.32ID:xELEw2uC
Linux なら、systemd とか

Windows の仕組みは知らないけど、
レジストリはその結果を収めたデータベースだから、
結果をいじっても問題解決にはならない

設定は各アプリ製作者が作っているものだから、
製作者以外の人間にできる事は、アプリをアンインストールする事だけ

設定にも様々な依存関係があるから、
アプリの内容も分からない人が、ある設定を変えても、どう作用するか分からない

例えば、アプリのメモリが解放されなくなって、
他のアプリも動かなくなるかも

それに設定を変えても、再起動しないと有効にならないかも知れないし、
再起動すると、設定が元に戻るかも知れない

OS 起動時の処理に、設定読み込みを登録しているかも知れない
0397デフォルトの名無しさん
垢版 |
2022/06/21(火) 09:15:38.14ID:lQ/zAxwG
ウダウダと一体何の話をしてるんだ
いいからStop-ServiceとSet-Service使えよ
ただ老人がじゃれ合いたいだけなのか?
0399デフォルトの名無しさん
垢版 |
2022/06/22(水) 20:51:18.50ID:At4JlVSH
>>375
管理者やSYSTEMじゃなくてTrustedInstallerとして実行しても駄目か?
もちろんレジストリをいじるんじゃんなくてSet-Serviceを使うんだぞ
もう見てないかもしれんが
0401デフォルトの名無しさん
垢版 |
2022/06/24(金) 13:29:04.40ID:VuoDyj+3
最近foreach文のコレクションの要素を受け取る変数の名前をつけるのが
めんどくさくって
for文のカウンター変数の名前に i を使うのはよくありますが
foreachにも同じような定石ってありますか?
0402デフォルトの名無しさん
垢版 |
2022/06/24(金) 13:47:20.90ID:4Qrsm7mD
aオブジェクト名
0403デフォルトの名無しさん
垢版 |
2022/06/24(金) 14:25:06.98ID:K2we1Lar
e
0406デフォルトの名無しさん
垢版 |
2022/06/26(日) 07:43:19.31ID:G39l7ngg
例えば$url = "https://yyyy.xxx/aaa/bbbb/2/";があり、最後の[2/]をカウンタを使ってアクセスしたいとおもいます。
その際、$nextUrl = ($url -replace ".{2}$") + $cnt + "`\"
で行けると思ったのですが、何か間違えていますでしょうか?
0407デフォルトの名無しさん
垢版 |
2022/06/26(日) 08:16:14.03ID:JGEtGMnz
-replaceの使い方を間違えてる
0408デフォルトの名無しさん
垢版 |
2022/06/26(日) 11:32:39.54ID:G39l7ngg
replaceですか。ありがとうございます
0409デフォルトの名無しさん
垢版 |
2022/06/29(水) 00:00:51.24ID:x2p/lm6W
arrayListの使い方がわからない。

----------------------------
$arrayReturn = new-object system.collections.arrayList
$col = new-object PSObject | select "A", "B", "C"

foreach ($i in 1..3) {
$col."A" = $i
$col."B" = $i + 1
$col."C" = $i + 2
$nul = $arrayReturn.add($col)
}

$arrayReturn
----------------------------

上記のコードを実行すると以下のようになってしまう。
A B C
- - -
3 4 5
3 4 5
3 4 5

本当は以下のようにしたい
A B C
- - -
1 2 3
2 3 4
3 4 5

なぜうまくいかないのか謎。
0411デフォルトの名無しさん
垢版 |
2022/06/29(水) 07:19:16.62ID:x2p/lm6W
>>410
うまくいった
はあああああああああああああ!?
なんで!? なんでこれでうまくいくんだ!?

ループの中に入れたら毎回$colの中身が破壊されると思うんですけど????
0412デフォルトの名無しさん
垢版 |
2022/06/29(水) 08:20:00.62ID:8GN1KOCk
PSObjectは参照型
ArrayListに追加されるのはオブジェクトそのものじゃなくてオブジェクトの参照だけ
0414デフォルトの名無しさん
垢版 |
2022/06/29(水) 14:16:08.11ID:SZ5j8L6g
PSReadLine 2.2.6 enables Predictive Intellisense by default
https://devblogs.microsoft.com/powershell/psreadline-2-2-6-enables-predictive-intellisense-by-default/
入力しようとしているコマンドを予測 〜PowerShellで「Predictive IntelliSense」が既定有効に
履歴やプラグインなどを参考に推測できるIntelliSense機能
https://forest.watch.impress.co.jp/docs/news/1420812.html
0415デフォルトの名無しさん
垢版 |
2022/06/29(水) 21:06:08.62ID:h+5hcb7e
PSCustomObjectは積極的に使っていいものかどうか判断できない
結局C#でクラスや構造体宣言して使った方がいい気がするし
Powershellで作成したPSCustomObjectを、同ソースに埋め込んだC#コード側から参照する方法ってある?
0417デフォルトの名無しさん
垢版 |
2022/06/30(木) 01:46:52.84ID:LVSNczoT
>>415
New-Object PSCustomObject や [PSCustomObject]@{} は
Win10 の v5.1 なら Add-Type の C# でなくとも class があるからスクリプトでの使用頻度は下がった。
Win7 の v2 では function NewABC {} みたいなコンストラクタ的な関数用意して積極的に使ってた。

Win10 の今でも ConvertTo-Csv へ渡す前に日時や数値を書式指定して文字列化するために使ってる。
CSV に日本語カラム名が欲しい時に日本語プロパティ名の class 用意するのはなんか気が引けるけど
[PSCustomObject]@{} や Select-Object での誰が見ても短命なオブジェクトなら気にならない。

データだけでメソッドがなく複数作るなら System.Data.DataTable も有り。
.Columns.AddRange([string[]]) でプロパティ(DataColumn)定義して
.Rows.Add([Object[]]) でデータ(DataRow)追加する使い方なら意外と手軽に使える。
日本語カラム名の使用も問題ないし。
0418デフォルトの名無しさん
垢版 |
2022/07/06(水) 09:44:42.33ID:L+R7c7Gd
-replaceと-ireplaceの違いって分かりますか?
まだ勉強中ですが、当然のように出てきて両方同じ説明しかされてないので気になって調べてみてもどこにも解説がなくて…
扱える値の範囲が違ったりとかするんでしょうか?
普通はどっちを使うものなんですか?
0419デフォルトの名無しさん
垢版 |
2022/07/06(水) 11:05:49.65ID:MXaUuSJv
1.完全に理解した←初心者
2.チョットワカル←中級者
3.全然判らん←上級者
0420デフォルトの名無しさん
垢版 |
2022/07/06(水) 11:41:17.81ID:HSp/EaB5
>>418
https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.2
既定では、 -replace 演算子では大文字と小文字が区別されません。
大文字と小文字を区別するには、次を使用します -creplace。
明示的に大文字と小文字を区別しないようにするには、次を使用します -ireplace。

replaceの既定動作を変更する方法は知りません。
大文字小文字を区別しようがしまいがどっちでもいいときは replace
そこんとこ間違ってもらっちゃ困るときは ireplace か creplace

普通がどっちかは分かりません。
0421デフォルトの名無しさん
垢版 |
2022/07/06(水) 13:11:25.93ID:c6fRPAAn
例えば、Ruby のCSV 処理なら、

require 'csv'

input_csv = <<"CSV_TEXT"
id,果物
1,りんご
21,スイカ
33,みかん
CSV_TEXT

# 2次元配列
ary = CSV.parse( input_csv, headers: true ).each do |row|
row[ '果物' ] = "レモン" if row[ 'id' ].to_i == 21
end

p ary.to_a
#=> [ ["id", "果物"], ["1", "りんご"], ["21", "レモン"], ["33", "みかん"] ]
0422デフォルトの名無しさん
垢版 |
2022/07/06(水) 13:16:19.97ID:iisDFTgh
>>420
ありがとうございます!
理解できました!
明示的に大文字の区別をつけるかつけないか指定する際に利用するものなんですね!
たしかにそれだと【普通】は場合によるとしか言えないですよね
0424デフォルトの名無しさん
垢版 |
2022/07/06(水) 22:49:51.62ID:pVM7wVd2
パワシェルの-replaceは勝手に右辺を正規表現と解釈するから
それが必要ない場合は文字列.Replace()のがいいよ
0426デフォルトの名無しさん
垢版 |
2022/07/08(金) 13:33:50.89ID:EP1tRVB4
Windowsでコマンドラインシェルとして使う場合に
外部コマンド引数のクオーテーションの振る舞いをなんとかして欲しい

例えばpwshを外部コマンドとして使うとして

pwsh -nop -c "`$a = 'abc'; `$a | out-host"

は期待通り abc が出力されるのに

pwsh -nop -c '$a = "abc"; $a | out-host'

はエラーになるの不便過ぎる
0427デフォルトの名無しさん
垢版 |
2022/07/08(金) 20:51:35.26ID:Bjqd/A21
補完が有効になってやっとまともに使えるようになったなよくこんなクソ長くて覚え辛くて入力し辛いコマンドレットなんて使ってるよなお前ら
しかしMSって言語やフレームワークでもそうだが命名規則にセンスねーゎ
なんでnpmやgitみたいに使いやすく作れないのか壊滅的にセンスねーゎ
0429デフォルトの名無しさん
垢版 |
2022/07/08(金) 22:10:30.33ID:EP1tRVB4
PS> pwsh -nop -c "`$a = 'abc'; `$a | out-host"
abc
PS> pwsh -nop -c '$a = "abc"; $a | out-host'
abc: The term 'abc' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

これほんと何がどうしてこうなるの?
0430デフォルトの名無しさん
垢版 |
2022/07/08(金) 23:27:21.05ID:UIv0TQaX
pwsh.exeへのコマンドラインとして解釈されるから、まずOSのルールに従って引数リストが次のように分解される
-nop
-c
'$a
=
abc
;
$a
|
out-host'
pwsh.exeの内側でコマンド文字列を再結合した時点では既にダブルクォートが失われているという寸法
0432デフォルトの名無しさん
垢版 |
2022/07/08(金) 23:40:56.26ID:UIv0TQaX
無茶言うなよ…
pwshの-cより右ならスクリプト扱いで、cmdやその他大勢の右ならOS解釈? pwshという同名のオレオレアプリの類だったときもスクリプト扱い?
言語仕様の一貫性的にあかんことになるだろ常考
0434デフォルトの名無しさん
垢版 |
2022/07/08(金) 23:52:42.34ID:PFPNTTsE
>>429
「'$a = "abc"; $a | out-host'」の「'〜'」は
そのコマンドライン上の文字列リテラルである事をPowerShellに指示してる事になって
PowerShellは1つの文字列「$a = "abc"; $a | out-host」の事だと受け取る。

コマンドが実行ファイルの実行で、その引数の文字列にスペースがあると
その文字列全体が「"〜"」で括られて文字列「"$a = "abc"; $a | out-host"」になる。
↑Windows PowerShell v5.1のTrace-Commandで確認
↓自信なし
powershell実行時の引数パース時に「\"」とか「"""」とかではない
単独「"」は不正な(余分な)メタキャラとして取り除かれるもよう。
で-cには「$a = abc; $a | out-host」が渡る。

>>430
確か「OSのルール」だと、実行ファイルに渡される引数は単一の文字列で、
スペースで区切ったり「"」を特別扱いするのはpowershell(pwsh).exeの独自のただし非常に一般的な仕様。
(大抵は、exeにコンパイルした際のコンパイラの仕様。)
0436デフォルトの名無しさん
垢版 |
2022/07/09(土) 08:04:26.74ID:qWQ5DRIr
コマンドプロンプトで
pwsh -nop -c "$a=\"abc\"; $a | out-host"
とするのは " 内部の " をエスケープするように見えて自然に納得できる
Windows版のPowerShellだけ
pwsh -nop -c '$a=\"abc\"; $a | out-host'
とするのは ' 内部の " をエスケープさせられて気持ち悪すぎる
おまけにLinux版でこう書くと動かないんでしょ
0437デフォルトの名無しさん
垢版 |
2022/07/09(土) 10:32:21.09ID:d4+i07Ea
>>436
コマンドプロンプト(cmd)だともっと高難易度の問題がある。
cmdのメタキャラ(&, |, <, >など)が偶数番目の「"」の後にあるとだめとか、
powershellコンソール以上に問題有り。
pwsh -nop -c "$a=\"&abc\"; $a | out-host"

同一のシェル名(pwsh)であっても、OSによって他プロセス起動の作法が違うのは仕方ないと思う。
国や地域で言葉や文化が違っても仕方ない感じ。
(POSIXとかに規定あればば別だが。)

例えば「ping」を動かすだけにしても結局オプションも挙動も違う訳だし、
現時点では他プロセス使う時点で、移植性考慮はプログラマの領分かな〜と思ってる。
0438デフォルトの名無しさん
垢版 |
2022/07/09(土) 10:48:49.98ID:d4+i07Ea
PowerShellのコンソールやスクリプト上で他プロセスを起動したい場合、
自分だとほぼ下記2通り。

(A) System.Diagnostics.ProcessStartInfoを使う。
(ちゃんと制御したい場合。スクリプトだと基本これ。)
$si = [Diagnostics.ProcessStartInfo]::new()
$si.FileName = 'powershell.exe'
$si.Arguments = '-nop -c "$a = \"abc\"; $a | out-host"'
$si.UseShellExecute = $false
$proc = [Diagnostics.Process]::Start($si)
$proc.WaitForExit()

(B) 引数を1つずつ@()に入れ、「"〜"」としたい場合は最初から値に含める。
(コマンドラインとかで手軽に。…手軽?)
& 'powershell' @('-nop', '-c', '"$a = \"abc\"; $a | out-host"')
0439デフォルトの名無しさん
垢版 |
2022/07/09(土) 10:59:09.60ID:qWQ5DRIr
MSYS2のbashもWindows上のコマンドラインシェルだけど
pwsh -nop -c "\$a = 'abc'; \$a | out-host"
pwsh -nop -c '$a = "abc"; $a | out-host'
のどちらでも動くんだよね
PowerShellには頑張って欲しい
0440デフォルトの名無しさん
垢版 |
2022/07/09(土) 14:41:14.65ID:OGG0CV73
わざわざProcessStartInfo使うとかめんどくさいわ
Start-Processでいい

Start-Process -FilePath 'powershell.exe' -ArgumentList '-nop -c "$a = \"abc\"; $a | out-host"' -NoNewWindow -Wait
0441デフォルトの名無しさん
垢版 |
2022/07/09(土) 21:16:37.86ID:d4+i07Ea
ProcessStartInfoが面倒なのは同意。
Start-Processで済む時は使う事もあって
大体はUseShellExecute = $trueの時かな。

Start-Processを使わない一番の理由は-Redirect*がファイルパス指定な事。
出力を無加工でファイル出力したい事がまずないので使いづらい。
なんで-PassThruのProcessオブジェクトの出力制御変更のスイッチじゃないのか。
標準出力・エラーを同時に制御するとデッドロックしやすいからかな。
Start-Processがその辺うまい事制御してくれたらスクリプトでも使うんだけど。
0442デフォルトの名無しさん
垢版 |
2022/07/09(土) 21:55:59.58ID:0vXUA52p
コマンドラインパラメーターの処理はexeをビルドした処理系のスタートアップコードに依存するのだ
MSのC/C++やMingwとかで微妙に変わってくるのだガハハ
WindowsでC/C++/C#の場合argvとかではなくWin32APIのGetCommandLineで取得するのが一番正解に近い
0443デフォルトの名無しさん
垢版 |
2022/07/09(土) 22:06:03.52ID:qWQ5DRIr
"" や \" が必要な仕様は気持ち悪いって話をしてたつもりが…
ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ
about_Parsing の icacls を呼ぶ例もそのまま並べてる
そのままと異なる動きをさせたい時以外は、>>438>>440 も面倒すぎる
0445デフォルトの名無しさん
垢版 |
2022/07/09(土) 23:17:22.46ID:d4+i07Ea
MSもこの辺の気持ち悪さ・分かりづらさは分かってるみたいで
core v7とかだと環境変数かなんかで、パースルール変更できるんじゃなかったっけ。
Win10のv5.1しか使わないから知らんけど。
0446デフォルトの名無しさん
垢版 |
2022/07/10(日) 00:25:59.02ID:qiFT6lHF
実行順がわかりにくい
0448デフォルトの名無しさん
垢版 |
2022/07/10(日) 01:17:57.68ID:KsOikrPY
>>443
> ネイティブコマンドを呼ぶのはコマンドと引数を並べて書くだけが普通でしょ
例えば
$a = "abc"; cmd /c "echo $a"
を実行したら「$a」と出力されて欲しくて
「abc」と出力されて欲しければ>>438,440ってこと?
好みが分かれるところかなー
0449デフォルトの名無しさん
垢版 |
2022/07/10(日) 04:27:28.58ID:qiFT6lHF
UNIXのシェルスクリプトのマネにならないようにした結果がこれ
0450デフォルトの名無しさん
垢版 |
2022/07/10(日) 04:30:45.24ID:qiFT6lHF
PowerShellは、記号に独自の意味を持たせているから、PowerShell職人を養成しないと使いこなせない。
0451デフォルトの名無しさん
垢版 |
2022/07/10(日) 09:49:01.94ID:os7PFybL
PowerShell in ActionにはUNIXシェルを参考にしたっていろんな所に書いてあるけど
たとえば比較演算子とか
0452デフォルトの名無しさん
垢版 |
2022/07/10(日) 10:20:51.27ID:j6DdFbos
powershellはPerlの匂いがする
俺が好きになった理由はここ
0453デフォルトの名無しさん
垢版 |
2022/07/10(日) 20:59:21.65ID:KsOikrPY
>>450
記号に独自の意味を持たせてる言語は多数あるのでは。
というか程度の差こそあれ殆どでは。
学習せず「使いこなせる」言語はないでしょ。
0454デフォルトの名無しさん
垢版 |
2022/07/10(日) 21:53:38.94ID:bG/pnkmn
powershellの記号が特殊とかはあまり思わないな
それより配列の扱いがトリッキーとかの方が職人の養成が必要と思う
0456デフォルトの名無しさん
垢版 |
2022/07/10(日) 22:53:56.17ID:qiFT6lHF
>>453
バッチファイルとの相性が最悪なのに気づかないとは情けないよ、あんた。
0457デフォルトの名無しさん
垢版 |
2022/07/10(日) 22:55:51.37ID:qiFT6lHF
>>451
あらゆる言語を参考にして、いろいろ混ぜ込んで、奇妙奇天烈なものになってしまった。
0458デフォルトの名無しさん
垢版 |
2022/07/10(日) 23:58:19.25ID:RTsqHO1/
まあ最大の問題は、空白をトークンの区切り、改行を入力に終わりとしたことだな
0459デフォルトの名無しさん
垢版 |
2022/07/11(月) 00:03:16.90ID:bX2QAhdS
変数のスコープが他と違うPowershellには何も期待してない
グローバル変数を更新したつもりがローカル変数と見なされたりして使い難すぎる
グローバルデータを全部.NETのコンテナに逃がしてようやく使えるようになった
0460デフォルトの名無しさん
垢版 |
2022/07/11(月) 00:04:59.61ID:vt1vW9IA
ファイルや文字列の操作の構文がヘンテコすぎる
0461デフォルトの名無しさん
垢版 |
2022/07/11(月) 01:41:49.71ID:4UtqkfgJ
超ヘンテコなJavaScriptだって一世を風靡したんだからPowershellだっていけるし(震え声
0462デフォルトの名無しさん
垢版 |
2022/07/11(月) 03:32:17.37ID:vt1vW9IA
>>461
あんたPowerShellをほどんど知らないでしょ?
0463デフォルトの名無しさん
垢版 |
2022/07/11(月) 07:53:28.56ID:3aArSxtS
>>456
そんな話してなかったでしょ。会話になってないよ。

バッチ(コマンドプロンプト)上でワンライナー書くときに
記号の取り扱いに注意しなくていいメジャー言語は一つも知らない。
0464デフォルトの名無しさん
垢版 |
2022/07/11(月) 09:42:24.64ID:zwDcIdQY
>>463
個人的にはバッチは制限多過ぎだよね
今回の問題もPowershellというより旧cmm互換性のせいだし
0470デフォルトの名無しさん
垢版 |
2022/07/14(木) 22:41:31.83ID:ztzbKaJ8
久々にvbsで書いたらめっちゃ素直でスラスラ書けるわ
Powershellはせめてレキシカルスコープで作り直してくれ
クラス使えって?
0474デフォルトの名無しさん
垢版 |
2022/07/15(金) 13:20:06.85ID:Wgy0KDme
PowerShellの悲しい点は、関数とスクリプトブロックが動的にスコープされることです。
しかし、私が驚いたもう1つの点は、変数が内部スコープ内でコピーオンライトとして動作することです。
$array=@("g")

function foo() {
$array += "h" Write-Host $array
}

& { $array +="s" Write-Host $array }

foo Write-Host $array

出力は次のとおりです。
g s
g h
g
これにより、動的スコープの苦痛が少し軽減されます。
しかし、どうすればコピーオンライトを回避できますか?
0477デフォルトの名無しさん
垢版 |
2022/07/15(金) 16:26:41.50ID:mFZqR7Di
せめて問題を理解してからレスしろよ

この動的スコープとは何ですか?
ほとんどのプログラムは、理解しやすいため、レキシカルとも呼ばれる静的スコープを使用します。ソースコードを見ると、範囲内にあるものがわかります。Pythonの例では、スコープ内のxの唯一の値はxのグローバル値です。

対照的に、PowerShellは動的スコープを使用します。このモデルでは、スコープスタックに基づいて実行時に変数を検索します。関数を呼び出すたびに、新しいスコープを作成し、すべての値を親スコープからそのスコープにコピーします。PowerShellの例では、printXがsetAndprintXから呼び出されると、setAndprintXスコープで設定された$xの値を取得します。

なぜ動的スコープが必要なのですか?

字句スコープよりも動的スコープを選択する理由について、適切な説明を思い付くことができません。

「健康は病人だけが見ることができる王冠です」
0478デフォルトの名無しさん
垢版 |
2022/07/15(金) 17:59:02.69ID:jPbc5odD
function foo() {
$global:array += "h" Write-Host $array
}
& { $global:array +="s" Write-Host $array }
ってやるだけじゃねーの?
そもそもグローバル変数自体はそれ程使わん、ましてや関数やスクリプトブロックで更新なんてほぼやらん
0480デフォルトの名無しさん
垢版 |
2022/07/15(金) 23:56:32.68ID:avBUMPl6
using namespace System.Collections.Generic
$list = [List[string]] @('ggg');
'$list={0}' -f ($list -join ', ') | oh
function f {$list.Add('fff'); 'f={0}' -f ($list -join ', ') | oh;}
&{$list.Add('sb'); 'sb={0}' -f ($list -join ', ')|oh;}
f
'$list={0}' -f ($list -join ', ') | oh

$list=ggg
sb=ggg, sb
f=ggg, sb, fff
$list=ggg, sb, fff
0481デフォルトの名無しさん
垢版 |
2022/07/16(土) 13:19:21.19ID:3YCfDQK3
>>480
.NEtのListコンテナ使うと意図通り動くのはなんでなん
Powershellの配列の変数は値型とか?
この辺をちゃんと理解ておきたい
0482デフォルトの名無しさん
垢版 |
2022/07/16(土) 14:25:05.61ID:QBrOblFw
Listかどうかは関係ない 変数に新しい値を代入してるかどうか
>>474の $array += "h"は 新しく作った配列を $array に代入してるけど
>>480の $list はそんな事してないでしょ
0483デフォルトの名無しさん
垢版 |
2022/07/16(土) 14:36:33.24ID:3YCfDQK3
>>482
えーつまり$array += "h"は文字列への追加じゃなくて
やってることは$array = $array + "h"相当で新規に文字列のインスタンスとローカル変数が作成されるってことなの?
$arrayに対してのAdd相当は$global:的な装飾子以外にないの?
0484デフォルトの名無しさん
垢版 |
2022/07/16(土) 15:02:15.96ID:m/XBj/Ao
メインclerだけど、動的静的スコープの使い分けがclの武器と刷り込まれてた
評判悪いのか…
呼び出し側から振り分けられるのは便利では?出力先とか
0485デフォルトの名無しさん
垢版 |
2022/07/16(土) 15:49:49.15ID:OVIs5jsH
lispのようにメモリ上フラットにオブジェクトが住む思想(~pwshのfunction:プロバイダ)だと、動的スコープになるのが自然では
レキシカルな文脈が無いのだから
0486デフォルトの名無しさん
垢版 |
2022/07/16(土) 15:54:08.82ID:yus9SEVI
Powershellの配列は固定長だよ
追加はできない
+=演算子はその見た目のイメージ通り、新しい配列による再代入を伴う
これはスコープとは関係ない問題
0487デフォルトの名無しさん
垢版 |
2022/07/16(土) 15:57:07.03ID:m/XBj/Ao
ミュータブルかイミュータブルか、あと参照の話がごっちゃになってるよね

GetNewClosureはclのfunctionフォームと等価だね
0488デフォルトの名無しさん
垢版 |
2022/07/16(土) 16:10:18.66ID:XIhDxiQx
>>479
unixシェルもpwshもclもそうだけど、関数定義をズラズラっとダンプできて、それをちゃんと読み戻せる言語は原理的にレキシカルスコープでは有り得ない
(暗黙のうちにletやクロージャ生成を行う)ブロックぽい構文でレキシカルスコープを模倣することは可能だけど
0489デフォルトの名無しさん
垢版 |
2022/07/16(土) 17:23:13.80ID:3YCfDQK3
LISP族はletか何かで変数に対しての宣言を必ずするからダイナミックでも違和感ないでしょ
Powershellの違和感は暗黙的に変数の意味が代わるところじゃないかな
0490デフォルトの名無しさん
垢版 |
2022/07/17(日) 18:41:53.37ID:zSvUsLU3
コード適当に書いていってある程度の規模になった頃にそろそそ関数化でもすっか!
ってなった時に下手にグローバル変数更新してたりすると即はまるなコレ
しかも一見何が悪いのかさっぱり判らないという
Powershellコーティング十か条でも壁に貼っとかないとな
0494デフォルトの名無しさん
垢版 |
2022/07/17(日) 23:45:40.91ID:zSvUsLU3
>>491
MSの自動翻訳は的が外れてて知りたいことは何も書かれてない…
個人のurlの人は説明が無茶苦茶で到底理解できてると思えない中身。スコープでググってこれが引っかかるなら悪質
結局のところ、参照渡しや参照書き換えの仕方を知ってればスコープはほぼ気にしなくていいという結論に至った
値渡しだけで済む書き方ができればなお良い
0496デフォルトの名無しさん
垢版 |
2022/07/18(月) 21:25:16.34ID:0lMMqLG2
スコープの話をしたいわけじゃなかったのなら最初からそう言ってほしかった
0498デフォルトの名無しさん
垢版 |
2022/07/20(水) 22:59:35.63ID:DVSzMIGJ
Pesterって使ってる?
使ってないとしたらUTどうしてる?

証跡としてコードカバレッジ出す目的に今も使ってるけどPowerShellの言語としてとか実行ホスト(exe)の機能ではなく
式単位にブレークポイント仕掛けて実現してるんだかで処理速度も普段よりかなり遅いし、あんまり便利って気がしない。
(うろ覚え)記述によってはうまくコードカバレッジに反映されない事もあった気がする。
そんとき忙しくて詳しく調査してらんなくてコードの方変えた気がする。
確かif文の条件内で変数に代入したりしてる場合だったかな。
while($null -ne ($line = $stream.ReadLine())){}みたいなのだったかな。
0499デフォルトの名無しさん
垢版 |
2022/07/20(水) 23:06:57.28ID:ZWOh364P
PowerShellなんか想定した運用で動きゃいいでしょ
真面目にテスト書くようなものはC#で書きなさい
0500デフォルトの名無しさん
垢版 |
2022/07/21(木) 22:42:00.80ID:o92gVnUV
以下のごく普通?のjsonがConvertFrom-Jsonだと意味不明なエラーで通らなかった
'{"":"あーあ" }' | ConvertFrom-Json
エラー出力
ConvertFrom-Json : Cannot process argument because the value of argument "name" is not valid. Change the value of the "name" argument and run the operation again.
At line:1 char:17
+ '{"":"あーあ" }' | ConvertFrom-Json
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [ConvertFrom-Json], PSArgumentException
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
0501デフォルトの名無しさん
垢版 |
2022/07/21(木) 23:21:49.49ID:hK8T/Nr3
>>500
PowerShell Core ではバグとして修正されてるらしい
https://github.com/PowerShell/PowerShell/issues/1755

PowerShell Core は使ったことないが、Windows PowerShellが認めるJSONは独特なので外部とのデータ連携に使うには向いてない印象。
PowerShellからPowerShellへの受け渡しなら苦労は少ないけど、それならJSONで入出力する必要がないことが多い。
0502デフォルトの名無しさん
垢版 |
2022/07/22(金) 00:05:10.76ID:DccLQn0d
名前なしの値ってjson採用してるアプリで普通に使われるんだよね
困ったわい
0503デフォルトの名無しさん
垢版 |
2022/07/22(金) 01:13:11.32ID:bxySyujx
JavaScriptってプロパティ名で空文字列が使えるもんなあ
JavaScriptの仕様がファンキーすぎる気がしないでもない
0504デフォルトの名無しさん
垢版 |
2022/07/27(水) 19:10:35.01ID:LaxYcXsV
ハッシュテーブルの実装的には問題ないんだろうか?
どれとは言わんがある言語のハッシュテーブル実装用のハッシュ関数(種はランダム)に空文字列""通したら恒等的に0なんだが
0505デフォルトの名無しさん
垢版 |
2022/07/27(水) 19:11:49.39ID:C81kwZF2
バッチスレでPowerShell使いなよってアドバイスもらって
GetでJSON取得⇒JSON要素出力がこんなに簡単に出来るなんて感動した
curlコマンドとjqコマンド駆使してやってたのがアホみたいだった
でも構文とコマンドレット覚えるのは面倒
0506デフォルトの名無しさん
垢版 |
2022/07/27(水) 19:50:05.55ID:ATmfTI/o
種を要求するハッシュ関数ってよくあるんか?セキュリティ対策?
ずっと同じ値が帰ってくるならハッシュテーブル的には問題ないかと
0507デフォルトの名無しさん
垢版 |
2022/07/27(水) 20:16:25.64ID:xJ8anoa4
>>504 がなんか勘違いしてるんだろうと思う
種なんて聞いたことないし空文字列で 0 を返すのはよくある実装だと思う
0508デフォルトの名無しさん
垢版 |
2022/07/27(水) 20:35:46.87ID:8xZeKJIl
>>506
起動時環境ノイズから勝手に取ってくるのが普通かと

同じハッシュ値持つキーがあると、まあ実装によるがDoS攻撃のいい的
追加情報で判別にフォールバックしたり、テーブル作り直したり、非常に負荷がかかる
perl, python, pwshは少なくともそう

python -c print(hash(""))→0
python -c print(hash(" "))→ランダムなint64
pwsh -nop -c '"".GetHashCode()'→ランダムなint32
perlはスマホに入ってないのでまた

どちらも勝手に種植えてるね、Pythonは64bitにハッシュしてるから単純に強度が強いが、pwshが0でもランダムに見えるのに対し、常にf("")=0のpythonの実装はちょっと謎
fによって""と同じ値に写る文字列も毎回変わるので探すのも容易じゃないだろうけど、実際に規則性を見てしまうと他にも弱点ありそうな気がしてくる
事実としてpwshよりはwebで扱かれてるわけで、まあ大丈夫なんでしょう
0509デフォルトの名無しさん
垢版 |
2022/07/27(水) 20:38:19.25ID:8xZeKJIl
>>507
デバッグ用に手動で植える機能はあるはずだよ、マニュアルのどっか見たら書いてるはず、もちろん非推奨だけど
0512デフォルトの名無しさん
垢版 |
2022/07/27(水) 20:50:04.66ID:8xZeKJIl
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
tps://perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
0513デフォルトの名無しさん
垢版 |
2022/07/27(水) 20:50:41.34ID:8xZeKJIl
今perl環境無いので記述だけ、v5.8以来ハッシュ関数の種は秘密に植えてるようで、あと人力で植えたい人への植え方
誰か検証たのむ
perldoc.jp/docs/perl/5.36.0/perlsec.pod#Algorithmic32Complexity32Attacks
(そのまま貼れない)

既にwebで流行ってた頃だと思うんだけど大丈夫だったのか
0516デフォルトの名無しさん
垢版 |
2022/07/27(水) 21:29:23.20ID:rYm6iVSU
で、件のjsの仕様だが、空文字でもよしなにハッシュしてくれるってことかいな?多分
空文字をキーとして使う事に関しては、言語固有のデータ型の概念も絡む
パスカル文字列でもc文字列でも、空文字列自体はいかなるバイト表現も持ち得ない
値がなけりゃ関数にも渡せない
文字数や終端の0埋めバイトごと渡せば値になるが、そこは思想の問題だろうね
0518デフォルトの名無しさん
垢版 |
2022/07/27(水) 22:08:43.58ID:xJ8anoa4
ああすまん、最近の実装まで追いかけきれてなかったな
なるほど一つ賢くなったわ、ありがとう
0519デフォルトの名無しさん
垢版 |
2022/07/27(水) 22:10:01.71ID:ZpfKnwiP
実装のドキュメントもランダム化の有無に関わらず空文字列に0を返す事については触れてないな
まあ実装の詳細も詳細だし、保証する意味も無いから、気になるならソース読むしかない
気になるなら、この実装に問題無いんですか、と元気があるなら問い合わせる案件
0520デフォルトの名無しさん
垢版 |
2022/07/27(水) 22:30:36.76ID:Sct47BON
とりあえずPythonでhash("")==0なことはundocumentedなので依存するコードは書いちゃダメってことかな
偶々タイプが面倒だったのか、それでもよく見つけたな

一点だけ分かって現実に問題になるかはともかく、理想的なハッシュ関数の振る舞い(=完全にランダムに見える)として好ましくないのは確か

pwshのこういう面白ネタないかな、まあまだまだ開発中なので山ほどありそうなのがアレだけど
0522デフォルトの名無しさん
垢版 |
2022/07/27(水) 22:49:04.75ID:FyEJHrzo
面白そうなのでハッシュ衝突させてみた
d=dict()
d[0]="int 0"
d[""]="nullstr"
print(hash(0), hash(""), d)
0 0 {0: 'int 0', '': 'nullstr'}
たった2個ぶつけて死ぬ事はまあ無いが、いくらか試して中身は予想付いてきた
スレチごめん
0523デフォルトの名無しさん
垢版 |
2022/07/27(水) 23:59:51.61ID:su1evgJ+
面白そうなのでpwshでも
$h=@{0='int0'; ''='strnull'}
write (0).GetHashCode(), ''.GetHashCode(). $h[0, '']
→0 498565465 int0 strnull
cpythonと違い空文字列は0とは別物のようです
なおpython/pwshともに値の等しいintとfloat型をキーにしようとしたらエラー

([double][int]::MaxValue -eq [int]::MaxValue)
→True
キーにfloatを使うアホが居るかは不明だけど、[double]の範囲では全ての[int32]が表せるので今の実装の整合性に問題はない
さらに型を大きくするとfloatで表せる整数は歯抜けになってくるけどまあ

-0.0→-0.0
(-0.0).GetHashCode()→0
整数としての値ですね

$nan=[double]::NaN
$nancode=$nan.GetHashCode()
-214643572
$maxcode=[double]::MaxValue.GetHashCode()
214635072
$nancode + $maxcode→0ですね
ところでナンだか見慣れた数字が…
2gb, 4gb→2147483648 42949672

$nan -eq $nan→False
そう決めたからまあ、そうなんだけど
$nancode -eq $nancode→True
なんだかなー
0524デフォルトの名無しさん
垢版 |
2022/07/28(木) 00:20:32.59ID:y/Pgitn8
複数のNaNをキーにしたハッシュリテラル書くとInvalidOperation例外投げるな、Duplicate Keys 'NaN' are not allowed...らしい
アサインすると値が上書き

見方によってはハッシュテーブルというアルゴリズムの敗北と言えるかもしれん
困る機会も思いつかないのが幸い
0525デフォルトの名無しさん
垢版 |
2022/07/28(木) 00:31:26.53ID:8WeqhqUG
どのNaNとNaNも互いに値が等しくないからといって、キーがNaNまみれのハッシュ$nansが作れたとして
じゃあ$nans[NaN]はどの値を返せば正解なんだよ
0526デフォルトの名無しさん
垢版 |
2022/07/28(木) 00:51:33.48ID:y/Pgitn8
抽象データ構造としての連想配列なら、NaNがインデックスとして渡されたら探索すらせずに常に$nullを返せばいい
NaNと-eqなキーは$nansがNaNまみれであるかに関わらず存在し得ないんだから

ハッシュテーブルはあくまで"ほぼ-eq"を使った連想配列の実装
$nan=[double]::NaN;
$ht=@{$nan="abc"}; $h[$nan]
は"abc" を返すはず
0527デフォルトの名無しさん
垢版 |
2022/07/28(木) 01:22:01.83ID:AWyQ+yiB
そもそもnanは論理学と数学基礎論の公理、同一律を否定しているので、論理的思考を行っている限り無矛盾に理解することは原理的に不可能だぞ
考えるな、感じろ
0528デフォルトの名無しさん
垢版 |
2022/07/28(木) 13:14:46.86ID:y/Pgitn8
>>505
jqはフィルターとして便利なだけじゃなく、プログラミング言語として非常に面白いと思ってるので、学ぶ価値ありだと思うよ

移行前はcmd+vimで何でもやってたな
vimは安定してwinサポートしてたし、ユニコ以前から常に日本語パッチ供給されてて、強力なテキスト処理とある程度の構造化データ処理もできる入手性よいツールとして稀有だったはず
引数に直接スクリプト渡して非インタラクティブにバッチ処理できるからbatの中身はほぼvim/exスクリプトだった
多分2000年あたりでvim並みの機能かつ日本語サポートもしっかりしてるのはperlくらい
0529デフォルトの名無しさん
垢版 |
2022/07/28(木) 14:57:01.82ID:HSo5zcUE
コードエディタとしては愛用してるけど、vimをコマンドとして使う発想に時代を感じる
0530デフォルトの名無しさん
垢版 |
2022/07/28(木) 15:19:13.17ID:HSo5zcUE
こんな感じかね
vim -es "g/\W?\|\Wwhere/ s//Where-Object/p" -c wq $profile
こわいから-c wqはしないけど

findstrでパターンマッチ、for /f ... in (file.txt)で行毎にスキャンして置換したのをechoとかやってたな
0531デフォルトの名無しさん
垢版 |
2022/07/28(木) 15:43:37.36ID:y/Pgitn8
for /f "tokens=...delims=...skip=...eol=..."はプレーンな行毎のテーブルの処理には悪くない、明示的にフォーマットを指定してパースするので、むしろ分かりやすいまである

クオートやエスケープの解釈、ダメ文字などイレギュラーに全く対応出来なかったり、/フラグ毎にforの挙動が別コマンドと言えるほど違ったりで、融通が全く効かないのがアレというだけ
for /fで扱いやすいフォーマットで書いて読む閉じた世界に住んでるなら幸せ
0532デフォルトの名無しさん
垢版 |
2022/07/28(木) 16:33:20.60ID:y/Pgitn8
>>530
あーよく見たら$proflleか
フリーフォーマットをfor /fで走査は黒魔術になるな、行をどう分割するにしろ、変数展開時の文字列置換は分割単位毎だし、行内複数マッチの場合どうするのか考えるだけでぞっとする

vimに引数でコマンド渡すにはたとえ単一引数でも-cが必要、兄弟のsedやvi(m)のエイリアスexは専ら引数にコマンドを期待するので-e落として紛れはないけど、vi(m)はその名の通りvisualエディタだからはじめの引数にファイルを期待する
0533デフォルトの名無しさん
垢版 |
2022/07/29(金) 21:36:58.16ID:HWojhWX3
最近仕事で触ることになって使い方習ったけど全然わからん
0534デフォルトの名無しさん
垢版 |
2022/07/29(金) 21:41:36.22ID:wZddRh7F
右も左も分からないなら、とりあえず良く使いそうなコマンドレットはエイリアスが事前に定義されてるので、galで出てくるのを順番に弄り回したりghするといいかも
0535デフォルトの名無しさん
垢版 |
2022/07/29(金) 23:32:09.97ID:HWojhWX3
基本文法を覚える前にVB.NETでモジュールメソッド作成して呼び出すやり方覚えたら動けばいいやでそっちばかり使ってしまってなかなか覚えられない
0536デフォルトの名無しさん
垢版 |
2022/09/13(火) 01:54:14.48ID:G28B9gdh
$OutputEncoding の初期値をUS-ASCIIからShift-JIS 932に変更したいのですが方法が分かりません
変更は
$OutputEncoding = [Console]::OutputEncoding
$OutputEncoding = [System.Text.Encoding]::GetEncoding(‘Shift_JIS’)
などで出来るようなのですが既定値を変えたいです

やりたい事はcmd上でripgrepをパイプで繋いだ際に文字化けしないようにしたいのですが
https://github.com/BurntSushi/ripgrep/blob/master/FAQ.md#pipe-non-ascii-windows
$OutputEncoding の既定値を変えられたとしてもcmd上でも効果があるのかは試してみないと分かりません
こちらの解決法が分かる方が居ましたら是非教えて欲しいです
0538デフォルトの名無しさん
垢版 |
2022/09/13(火) 17:28:13.33ID:BFM47HY2
>>537
ありがとうございます
$profileでやってみました。UTF-8でなら使えそうなのですが
$OutputEncoding をsjisにしたps上でもrgがUTF-8で吐いてるので無理みたいです
【.cmd】 バッチファイルスクリプト %13 【.bat】
https://mevius.5ch.net/test/read.cgi/tech/1542779527/496
参照先のようにUTF-8にすれば一応化けずに使えるのですがUTF-8だとコマンド類がascii以外機能しないものが多いのでバッチなどでは使いづらい
sjisで使えたら貧弱なfindstrに置き換えられ便利になると思ったのですが残念です
0539デフォルトの名無しさん
垢版 |
2022/09/13(火) 18:34:17.55ID:3Aj3EGjO
findstr置き換え目的でPowerShell持ち出すなら、Select-Stringとかの手もある。

rgの高速検索のメリットがPowerShellのオーバーヘッドを上回るなら、
例えば以下のような処理を関数なりスクリプトなりにしておくといいと思う。
スクリプト化しておけばcmdからもpowershell経由で使える。
#…けど、他のgrepコマンド導入した方が良さそうな気がする。

$path = "検索対象ファイルパス"
$pattern = "検索パターン"
$si = [Diagnostics.ProcessStartInfo]::new("rg.exe")
$si.Arguments = '"{0}" "{1}"' -f $pattern, $path
$si.UseShellExecute = $false
$si.RedirectStandardOutput = $true
$si.StandardOutputEncoding = [Text.Encoding]::UTF8
$proc = [Process]::Start($si)
$stdout = $proc.StandardOutput
while (! $stdout.EndOfStream) {
$stdout.ReadLine()
}
0540デフォルトの名無しさん
垢版 |
2022/09/13(火) 18:36:39.73ID:3Aj3EGjO
誤:$proc = [Process]::Start($si)
正:$proc = [Diagnostics.Process]::Start($si)

動作確認してないので他にもあるかも。
0541デフォルトの名無しさん
垢版 |
2022/09/21(水) 00:41:00.54ID:MPN5wMTP
同階層にフォルダツリーA~Zまであり、それぞれのツリーの中身はバラバラです。
それぞれのツリーのCSVを出力したいのですが、やり方がイマイチ分かりません。
CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したいです。
PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが、各ツリー内の更新日を取得する部分とフォルダサイズを取得する部分を同時に行う事が私の頭では無理でした。何方かお助け頂けないでしょうか
0542デフォルトの名無しさん
垢版 |
2022/09/21(水) 17:45:18.14ID:xipfHTvE
ツリーて何だ?
フォルダに階層があってその中全部見たいということならGet-ChildItem -Recurseだぞ
0543デフォルトの名無しさん
垢版 |
2022/09/21(水) 17:57:09.50ID:Wu29T3MH
・コード貼ってバカにされるの嫌
・具体例挙げるなど仕様詳細説明面倒臭いから文章から汲み取れ
・全部やれ

こういうことだろう
舐め腐ってるヤツはスルーしときなよ
0544デフォルトの名無しさん
垢版 |
2022/09/21(水) 18:12:43.86ID:6s8rSvAF
本人はいたって真面目なパターンだろ
ググった情報を組み合わせるスキルがないということは、悲しいかな往々にして他人に要件を一発で伝えるスキルも不足しがち

同時にやるのが無理めに感じるのはパイプを使おうとしてるからだろう
for文とローカル変数で書き変えれば簡単
0545デフォルトの名無しさん
垢版 |
2022/09/21(水) 18:29:01.13ID:757dNGj4
伝えるスキルうんぬんの前に
> PSFolderSizeをインストールして色んなサイトから拝借してコピペの集合体でやってみたのですが
って言うならそのコード上げろって話
ヘタに説明するより100倍早い
0546デフォルトの名無しさん
垢版 |
2022/09/21(水) 18:53:18.61ID:VZ2CqY7n
いやできなかったコード上げても何の説明にもならんから
現状と得たい結果の図示だな
0547デフォルトの名無しさん
垢版 |
2022/09/21(水) 19:02:42.62ID:6s8rSvAF
コードを上げたほうがいいんじゃないかとか図で伝えるべきなんじゃないかとかそういうの引っくるめての伝えるスキルだよ
コミュニケーションは言葉に限定されない
0548デフォルトの名無しさん
垢版 |
2022/09/21(水) 20:42:50.25ID:9IkSSHYa
>CSVにはツリー名、ツリー毎の合計サイズと、ツリー毎に最新更新ファイル(ファイル1つだけ)の日時を抜き出したい
変なモジュール入れんでも数行で書けるからがんばれ
0549デフォルトの名無しさん
垢版 |
2022/09/21(水) 22:28:24.59ID:RTQsXz5w
パワー!
0550デフォルトの名無しさん
垢版 |
2022/09/21(水) 22:31:28.97ID:RTQsXz5w
しっかしコマンドレットがコマンドライン実行時とスクリプト内呼び出しでパラメータ解釈が異なるって
どんなキチガイが仕様考えたのか気になるわw
switch型パラメータをスクリプト内で動的に外したり与える方法がないとか終わってる
0552デフォルトの名無しさん
垢版 |
2022/09/22(木) 00:48:03.74ID:XoRPEjFK
Ruby で、win32ole を使って、
フォルダ以下のサイズ(再帰的な子孫も含めて)は、

require 'win32ole'

fso = WIN32OLE.new( 'Scripting.FileSystemObject' )

folders = [ "C:/Users/Owner/Documents/test_1",
"C:/Users/Owner/Documents/test_2" ]

folders.each do |folder|
folder_obj = fso.GetFolder( folder )

puts File.expand_path( folder_obj.path ) # \ を、/ に変換する
puts "#{ folder_obj.name } : #{ folder_obj.size }"
end

出力
C:/Users/Owner/Documents/test_1
test_1 : 28803

C:/Users/Owner/Documents/test_2
test_2 : 4390
0553552
垢版 |
2022/09/22(木) 01:41:34.82ID:XoRPEjFK
Ruby で、フォルダ以下のファイル(再帰的な子孫も含めて)で、
更新時刻が最も最近のものを求めた

folders = [ "C:/Users/Owner/Documents/test_1",
"C:/Users/Owner/Documents/test_2" ]

folders.each do |folder|
# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = folder + "/**/*"

latest_file = Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.max_by { |full_path| File.mtime( full_path ) } # 更新時刻が最も最近のファイルパス

puts "#{ latest_file }\n#{ File.mtime( latest_file ) }"
end

出力
C:/Users/Owner/Documents/test_1/a.txt
2022-05-19 14:38:35 +0900

C:/Users/Owner/Documents/test_2/x/x.txt
2022-02-24 16:01:54 +0900
0554552
垢版 |
2022/09/22(木) 05:06:16.90ID:XoRPEjFK
Ruby で、CSV 形式で出力する部分は、

require 'csv'

result_ary = [
[ "C:/Users/Owner/Documents/test_1", "28,803", "2022-05-19 14:38:35 +0900" ],
[ "C:/Users/Owner/Documents/test_2", "4,390", "2022-02-24 16:01:54 +0900" ]
]

# 2次元配列を、CSV 文字列に変換する
csv_str = result_ary.map( &:to_csv ).join
print csv_str

出力
C:/Users/Owner/Documents/test_1,"28,803",2022-05-19 14:38:35 +0900
C:/Users/Owner/Documents/test_2,"4,390",2022-02-24 16:01:54 +0900
0555デフォルトの名無しさん
垢版 |
2022/09/22(木) 09:18:39.47ID:5Z2vYjCC
>>541
@(
"C:\dir1"
"C:\dir2"
) | %{
  $prop = [Ordered] @{Path=$_}
  $file = @(Get-ChildItem -LiteralPath $_ -Force -Recurse -File)
  ([Ordered] @{LastWriteTime='Maximum'; Length='Sum';}).GetEnumerator() | %{
    $opt = @{'Property'=$_.Key; $_.Value=$true;}
    $prop += @{$_.Key = $file | measure @opt | select -exp $_.Value}
  }
  [PSCustomObject] $prop
} | ConvertTo-Csv -NoTypeInformation
0556デフォルトの名無しさん
垢版 |
2022/09/23(金) 00:05:04.72ID:r49iT1KO
>>555
おおー無駄がなくてすごい
これぐらい書けるようになりてぇ

開始は配列の変わりにコマンドレットでも良さそう
Get-ChildItem -LiteralPath <親フォルダ> -Directory | ...
0557デフォルトの名無しさん
垢版 |
2022/09/25(日) 13:45:46.35ID:5ly2Ski6
>>556
確かに。てか半端に汎用性意識せず、素直にこんなんでも良かったな。
@(Get-ChildItem -LiteralPath <親フォルダ> -Directory).FullName | %{
  $file = @(Get-ChildItem -LiteralPath $_ -Force -Recurse -File)
  [PSCustomObject] @{
    Path     = $_
    LastWriteTime = ($file | measure LastWriteTime -Maximum).Maximum
    Length    = ($file | measure Length -Sum).Sum
  }
} | ConvertTo-Csv -NoTypeInformation
0558デフォルトの名無しさん
垢版 |
2022/09/25(日) 14:01:26.72ID:5ly2Ski6
いや、こうか。
Get-ChildItem -LiteralPath <親フォルダ> -Directory | %{
  $file = @($_ | Get-ChildItem -Force -Recurse -File)
  [PSCustomObject] @{
    Path     = $_.FullName
    LastWriteTime = ($file | measure LastWriteTime -Maximum).Maximum
    Length    = ($file | measure Length -Sum).Sum
  }
} | ConvertTo-Csv -NoTypeInformation
0559デフォルトの名無しさん
垢版 |
2022/09/25(日) 14:13:19.66ID:76wlmrvm
試してないけどフォルダにファイルが1個も無い場合を考慮できてない気がする
0560デフォルトの名無しさん
垢版 |
2022/09/25(日) 14:48:45.69ID:5ly2Ski6
知らんかった。前者つもりだった。
(@() | measure -Sum).Sum → 0
(@() | measure Length -Sum).Sum → Null
0561デフォルトの名無しさん
垢版 |
2022/09/25(日) 15:45:18.22ID:76wlmrvm
powershellはgciはともかくmeasureが遅くてファイルが多くなると辛くなるね
結局C#に丸投げとかの手段になりそう
0562デフォルトの名無しさん
垢版 |
2022/09/25(日) 16:18:35.15ID:PDKGWlWe
試してないけど
Get-ChildItem -LiteralPath <親フォルダ> -Directory | %{
 $Stat = $_ | Get-ChildItem -Force -Recurse -File | Measure-Object LastWriteTimeLastWriteTime, Length -Sum -Maximum
 [PSCustomObject] @{
  Path     = $_.FullName
  LastWriteTime = $Stat[0].Maximum
  Length    = $Stat[1].Sum
 }
} | ConvertTo-Csv -NoTypeInformation
ってやると多少効率的かと
0564デフォルトの名無しさん
垢版 |
2022/09/25(日) 19:58:47.42ID:5ly2Ski6
>>562
なるほどな〜、余分な集計をする事になるとしても
measureを1回で済ませられれば効率的な可能性があるのか、
さらにパイプラインで列挙と集計が同時進行になる可能性もあったり?
と思い試してみたけど、残念ながらLastWriteTimeの-Sumがダメらしい。
-ea:SilentlyContinueなら?と思ったがLengthのMaximumしか出ない。
でもこのアイデアは使えそう。
0565デフォルトの名無しさん
垢版 |
2022/09/25(日) 20:11:16.46ID:PDKGWlWe
>>564
ああなるほど、だから小細工してたのか、すまんかった
てか、初めからURL書いとけば良かったな

$Stat = $_ | Get-ChildItem -Force -Recurse -File | Measure-Object LastWriteTime.Ticks, Length -Sum -Maximum
[PSCustomObject] @{
 Path     = $_.FullName
 LastWriteTime = [DateTime][Int64]$Stat[0].Maximum
 Length    = $Stat[1].Sum
}

https://stackoverflow.com/questions/66697384/measure-multiple-properties
0568デフォルトの名無しさん
垢版 |
2022/09/25(日) 21:18:28.66ID:5ly2Ski6
PSv7だとmeasureに集計プロパティ使えるのか。
PSv5なので試せないのが残念。

速度の話が出てたからmeasureの速度がどんなもんか>>558で計ってみたら
自環境だと普通の実装(最高水位線と足し算)より7〜8倍くらい遅いわ。
まあ、標準コマンドレットのよくある結果だな…。
0569デフォルトの名無しさん
垢版 |
2022/09/29(木) 21:06:47.50ID:OAAH5wr1
タスクマネージャの詳細タブからaudiodg.exeの関係の設定を変更する操作をスクリプトで書けますか?
0570デフォルトの名無しさん
垢版 |
2022/09/29(木) 21:46:11.19ID:NUiBz/8K
Get-Process "audiodg" | %{ $_.ProcessorAffinity = $コア数 }
$コア数は2のn乗で表したコア数の数
たとえば若い番号の3コアだけ割り当てたい場合は 0xf
0571デフォルトの名無しさん
垢版 |
2022/09/29(木) 21:47:29.47ID:NUiBz/8K
上の3は4の間違い
もちろんタスクマネージャーをいじろうと思えばできるけど面倒
0572デフォルトの名無しさん
垢版 |
2022/09/30(金) 01:54:30.65ID:Ls0wbInl
>>570
わからん・・・
2の4乗=16 != 0xf ?
4=2の2乗 だと 0x2 ?

コア数というよりフラグ?マスク?ってこと?
0575デフォルトの名無しさん
垢版 |
2022/10/31(月) 09:21:34.51ID:fKpjF07r
comobjectでofficeを操作してるとき、
$xxx.Count() が 2なのに
$xxx[0] 範囲外
$xxx[1] 範囲内
$xxx[2] 範囲内
$xxx[3] 範囲外
みたいなアクセスになることがあるんやが
これはどう理解すればええんや?
0577デフォルトの名無しさん
垢版 |
2022/10/31(月) 12:19:33.83ID:K5+OjW4X
Excelってたしか値も書式もないセルはオブジェクト自体が存在しない扱いになるので、インデックスが0から始まるとは限らなかったはず
データが取れる前提で処理するとうまく行かない
0578デフォルトの名無しさん
垢版 |
2022/10/31(月) 23:20:47.42ID:9ETwK7p6
>>576
これかも
明日試してみるわ!サンクス!

>>577
これは怖いな
今回は関係なさそうだけど、心に留めておくわ、サンクス
0582デフォルトの名無しさん
垢版 |
2022/11/06(日) 19:05:17.89ID:vSW2pkDA
$a = "abc::de/f/ghi/123jk"
$b = $a.TrimEnd("/")
をしても$bの出力が「abc::de/f/ghi/」にならないのですが、どこが間違っているのでしょうか?
0583デフォルトの名無しさん
垢版 |
2022/11/06(日) 19:19:37.21ID:NZll9bPy
>>582
同じ勘違いしたことある
指定文字「を」末尾からtrimするのがTrimEnd

$a.TrimEnd("jk123")

Trimメソッドは正規表現使えないからreplaceステートメントをつかう

$a -replace "\w*$",''
0584デフォルトの名無しさん
垢版 |
2022/11/06(日) 23:51:09.18ID:vSW2pkDA
>>583
ありがとうございます!
今回はreplaceを使っていこうと思います
0587デフォルトの名無しさん
垢版 |
2022/11/12(土) 15:22:51.03ID:c/ILT9OL
11でもPowershell起動すると新しいのお試ししろとか表示されるけど5.1で十分だよなぁ
他の鯖系のベンダーのモジュールが5.1に対応しなくなったら考えるわ程度
0588デフォルトの名無しさん
垢版 |
2022/11/12(土) 19:04:11.88ID:lKqjLh4g
>>586
前からexperimentalで有ったのは知ってたし、オプションだから嫌なら切ればいいんだけども…

cmdから呼ばれる想定のコマンドは引数処理に癖があるからといって、特定のプログラムのみ特別扱いするワークアラウンド的挙動にはちょっと賛同できない
ワークアラウンドというのはユーザーがやるものだ

pwsh側で個別対応をするとしても、ユーザーが期待する形式の引数を取って、コマンドの期待する形式に変換するラッパースクリプトを用意すれば済むだけの話

普段linux/macでpwsh使ってるから、どれ程の癖なのかは図りかねるが、
0589デフォルトの名無しさん
垢版 |
2022/11/14(月) 01:13:06.37ID:zoPzNIvr
$obj.('行');

1. 上記を7.3で実行するとハングする。
2. 5.1や7.2ではハングしない。
3. $prop = '行'; $obj.$prop; でもハングする。
4. '行'が違う言葉だとハングしない。
5. $obj.行; だとハングしない。
バグ?バグなの?ゲイツに電凸していいの?
0590589
垢版 |
2022/11/14(月) 01:23:18.32ID:zoPzNIvr
あ環境はWindows11とmacOS13で再現してます。連投スマソ
0591589
垢版 |
2022/11/14(月) 21:56:16.00ID:zoPzNIvr
589の条件4についてだけど、
$obj.([System.Text.Encoding]::UTF8.GetString((0xE8, 0xA1, 0x8C)));
でもハングして、UTF-8での先頭バイトが0xE8だった場合にハングするっぽい。
毎回ハングするのであんまり回数試してないけど。
0593デフォルトの名無しさん
垢版 |
2022/11/15(火) 11:09:43.75ID:ADWqgLY3
7.30-preview.2 Core win10(en-US)だけど大丈夫な感じ

$gyo =[System.Text.Encoding]::UTF8.GetString((0xE8, 0xA1, 0x8C)))
$gyo

$trans=@{$gyo="go"}
$trans.$gyo, $trans[$gyo]
go

(まだ日本語IME入れてない新品なので行が入力できないのはご愛嬌)
属性/キーはハッシュ可能な任意のビット列で構わないはずなので、単にエンコルーチンの問題のはず、7.30-preview-2以降のgitレポの差分みては
0594デフォルトの名無しさん
垢版 |
2022/11/15(火) 11:40:25.67ID:Xte85wf7
cx-fxは開始バイトだから安定リリースで出してたらマルチバイト圏壊滅してそうだが
0595589
垢版 |
2022/11/16(水) 02:47:51.66ID:VVslFgtK
>>592-594 ども!
>>593 ありがとうございます。
preview.3 から preview.4の間でなんかあったとこまで突き止めましたが、
preview.3から5までのStart-PSBootstrapがバグっててビルドに予想以上に時間かかったからもう寝るお
0596589
垢版 |
2022/11/18(金) 02:58:42.77ID:5YGh8aoa
お巡りさんこの人でつ38909f7ee
でそのコミットの中身がこちら
Update .NET SDK version from `7.0.100-preview.2.22153.17` to `7.0.100-preview.4.22252.9` (#17061)
おふぅ。PowerShellのバグを追っていて大変なものを見つけてしまったーどうしよう?
0597デフォルトの名無しさん
垢版 |
2022/11/29(火) 18:07:22.13ID:bVQqRFK0
以前は PowerShell の日本語ドキュメントのリポジトリが Github に置いてあったはずですが今は消えていますよね?
事情がよくわからないんですが、マイクロソフトとしてはコミュニティで日本語翻訳を運用しない (機械翻訳でやっていく?) ということなんでしょうか。

それはそれとして、諸事情でネットワーク接続できない場所で日本語ドキュメントを読みたいんですが
どこかでまとめてダウンロードする方法とかありませんかね?
0598デフォルトの名無しさん
垢版 |
2022/11/29(火) 21:34:29.76ID:S4GKm+YH
>>597
マイクロソフトにかきらず、英語以外の言語に翻訳することをみんなやめてしまっただけ。

ソフトウェアの更新スピードが速すぎて、ドキュメントを人間が翻訳する時間がない。
0600デフォルトの名無しさん
垢版 |
2022/11/29(火) 23:10:55.01ID:F0R68kvV
日本語にすると曖昧になっちゃうからな
英語で厳密に説明されたほうがいいだろうし、ソフトウェア技術者だったら英語は素養の一つだね
0602デフォルトの名無しさん
垢版 |
2022/11/30(水) 01:12:58.71ID:TaPBZKHt
文字列検索する時は、ラテン文字のキーワードが検索結果に埋もれない日本語ドキュメントのほうが便利
0604デフォルトの名無しさん
垢版 |
2022/11/30(水) 08:53:37.63ID:QfqHtuzd
どうしてもドキュメントを日本語化してほしいなら16ビット時代みたいに
日本語版がリリースされる頃には英語版の新バージョンがリリースされている
みたいな事になってもおま国とか文句言わないようにしないとね
英語版が完成してからじゃないと翻訳作業を始められないんだから
0605デフォルトの名無しさん
垢版 |
2022/11/30(水) 12:40:03.59ID:4G7kek1Y
Google, DeepL, みらい翻訳

「みんなの自動翻訳@TexTra®」は、
国立研究開発法人情報通信研究機構(NICT)が開発した自動翻訳サイトです。無料
mt-auto-minhon-mlt.ucri.jgn-x.jp/

翻訳したいサイトのURLを入力するだけで、自動翻訳結果をエディタ上に再現
0606デフォルトの名無しさん
垢版 |
2022/11/30(水) 13:17:37.01ID:Occ07s0g
機械が無料で一瞬でそれなりの翻訳をしてくれる時代になったのに
わざわざ多ヵ国の翻訳チームを雇って変わり続ける膨大なドキュメントへの人件費を出す判断なんてできんだろなあ
0607597
垢版 |
2022/11/30(水) 17:21:56.68ID:zA9UzzGK
私は現時点では PowerShell について全く知識を持たず、
入門的な資料を移動中の合間にタブレットコンピュータで読みたいと考えています。
(通信は出来ないので事前に入れておく必要があります。)

基本理念をわかれば個々のコマンドの資料はたぶん英語でも理解できると思うんですが
新しい概念そのものを英語で読むのはしんどいです。

オフラインで読みたいと思うと ePub (などの電子書籍形式) になっているとやりやすくて
そうするには元が Markdown なら一発で出来ると思ったんですが、
機械翻訳を通してその形に持っていくとなると面倒ですね。
0608605
垢版 |
2022/11/30(水) 17:40:14.72ID:4G7kek1Y
Markdown は、HTML になるから、
「みんなの自動翻訳@TexTra®」で翻訳できるのでは?

翻訳したいサイトのURLを入力するだけで、自動翻訳結果をエディタ上に再現と書いてあるから、
ローカルPC にある、HTMLへのパスを入力すれば?
0609597
垢版 |
2022/11/30(水) 18:10:28.67ID:zA9UzzGK
>>608
翻訳できることにはなんの疑いも持ってないですよ。
コマンド一発で出来るツールはないので手間がかかると言ってます。
0611デフォルトの名無しさん
垢版 |
2022/11/30(水) 23:01:06.28ID:k8p89eha
過去の公式日本語訳が出てきたとして、基本理念を理解したい人の役に立つレベルとは思えない
電子書籍買って読むほうがいい
0613デフォルトの名無しさん
垢版 |
2022/12/01(木) 13:08:12.37ID:Qs+E1f1w
もしも古い翻訳テキストが手元にあるなら
それでいいんじゃね
新しい要素だけググって調べてブラウザ上でctrl+Sするなりして保存しておけば?
0614デフォルトの名無しさん
垢版 |
2022/12/03(土) 12:28:32.79ID:Jt/U29yp
配列の要素を逆順にしたものを得たいのですが, …たとえば,
$a = @(10, 0, 5)
これに対して
$a[-1..-$a.Length] …とすれば,@(5, 0, 10) が得られて,
それで不満は無いのですが,何かもっとシンプルに書ける気がして.
(→ でもこれって $a[-1..0] とは書けないんですね.)

あるいは
[array]::Reverse($a)
とすることで,$a 自体が逆順の中身に変えられるのですが
でも $a自体は 変えたく無いのです

感覚的には
$a.Reverse() とか
$a | Reverse-Object みたいに書けたらいいのに
とは思うのですが(…そんなものは無い)

文字列だったら
[linq.enumerable]::Reverse("abcdef") で逆順を得られるのに
同じ場所に 数値の配列を書いて
[linq.enumerable]::Reverse(@(0,5,1,2))
…としても,何故かできない (なぜなのかはc#に勉強不足な私には分からず)

ってなわけで,別に困ってるわけでは無いのですが
もっと シンプルな書き方ってありますか
0615デフォルトの名無しさん
垢版 |
2022/12/03(土) 14:39:08.81ID:H3EtATlx
$a[length - 1 - n]
0616デフォルトの名無しさん
垢版 |
2022/12/03(土) 15:49:40.73ID:h4dim/Vw
>>614
とりあえず、$a[-1..-$a.Length]だと-1,0,1で並ぶから@(5,10,0)になっちゃうはず。
$a[$a.length..0] が正。
個人的にはlengthじゃなくてcount使ってほしい。

後はsort-object使うか。
$a|sort -des でいける。
ただし遅いので巨大配列には向かない。
0617デフォルトの名無しさん
垢版 |
2022/12/03(土) 18:40:22.74ID:Jt/U29yp
>>616
$a[$a.Count..0] 言われてみれば! …これ使わせていただきます
なお,sort を使うと,どうしても数値でsortされてしまうので うまくいかない感じです
何の意味も無い基準でsortして(何の順番も変えないで) -desだけしてくれたらいいのですが
0619デフォルトの名無しさん
垢版 |
2022/12/03(土) 19:46:36.52ID:Jt/U29yp
>>618 intの配列にcastってことなのか…半分くらいしか理解してませんが
ありがとうございます.
LINQは powershellだと 無理やり感があって,かえって使いにくい感じは ありますね
0620デフォルトの名無しさん
垢版 |
2022/12/03(土) 22:02:33.57ID:vihcAie/
Ruby なら、

reverse -> Array
reverse! -> self 破壊的変更

a = ["a", 2, true]
p a.reverse #=> [true, 2, "a"]
p a #=> ["a", 2, true] (変化なし)

a = ["a", 2, true]
p a.reverse! #=> [true, 2, "a"]
p a #=> [true, 2, "a"] 破壊的変更
0621デフォルトの名無しさん
垢版 |
2022/12/05(月) 15:26:18.97ID:9N6A06cG
きっと とても初歩的なことだとは思うのですが

$a = "abc"
$job = start-job { write-host $a }
receive-job -Job $job # → 何も出力されない

これって スコープの問題なんでしょうか
{ブロック}の中の $aの中身を "abc"にしたいのですが
0623デフォルトの名無しさん
垢版 |
2022/12/05(月) 18:59:35.95ID:9N6A06cG
>>622 ありがとうございます
ブロックの中の $a を $Using:$a と書けば望む動作になりました
まぁ、何でusingって名前なんだろ?とか
Remote Variablesとは言うけれど別にリモートじゃないし(?)など
まだ不思議な感じは残りますが…もうちょっと調べたり勉強してみます
0624デフォルトの名無しさん
垢版 |
2022/12/05(月) 19:22:50.61ID:9N6A06cG
$a = "abc"
$job = start-job { param($str); write-host $str } -Arg $a
でも 受け渡せるんですね。
0625デフォルトの名無しさん
垢版 |
2022/12/05(月) 21:14:48.29ID:Xw9Qnajp
Start-Jobでスクリプトブロック実行すると
別プロセスのpowershell.exeが起動してそっちで動く。(少なくともPSv5.1では。)
イメージとしてはコンソールや.ps1から「powershell.exe -f 他スクリプト.ps1」で
他プロセスを動かすくらいに別スコープだと思ってればいいと思う。
0626デフォルトの名無しさん
垢版 |
2022/12/06(火) 03:20:51.26ID:PbeCdWM3
>>599
マイクロソフトのサポートにはとんでもない質問が大量に押し寄せる。

Windows Serverが起動しなくなった。電源が入ってないけど、Windowsのバグに違いないやら、しつこい嫌がらせやら、女に変なことを聞く変態やらと3万円も払って電話してくる。
0627デフォルトの名無しさん
垢版 |
2022/12/06(火) 03:22:42.62ID:PbeCdWM3
PowerShellのバージョンがわかりませんのでどうすればいいですか?

こんなのを3万円も払って教えてもらうのが日本人
0628デフォルトの名無しさん
垢版 |
2022/12/06(火) 06:55:15.41ID:yvaEv+2c
一時片手間にカスタマサポートやってたことあるけど結構トンデモ問合せは多い
いろいろ聞いて行ったら他社の製品の問合せだったなんてオチすらあるし
0629デフォルトの名無しさん
垢版 |
2022/12/06(火) 07:03:21.20ID:wGOv2qdu
>>625 そういうイメージ…ということでわりと納得.
同じことですが…では、ブロックの中で処理中に 変数に何かを入れても
それは、receiveするまでは 取り出せないってことか…
0630デフォルトの名無しさん
垢版 |
2022/12/19(月) 19:06:25.36ID:ayS530mj
functionの中でhashtable @{}を作成してその中にウィンドウと紐付いてるハンドルオブジェクトやらを入れて返して
functionの呼び出し側で使おうとしたら無効なオブジェクトやら何やらのエラーが出てまともに使えなかった
PSObjectに変換して返したらエラーは出なくなったがこれ何だろう
怖すぎなんだが
0632デフォルトの名無しさん
垢版 |
2022/12/23(金) 17:58:06.26ID:F84mgbO0
紐付けてるオブジェクトやらは.NETの参照型ね
値型だったら恐らくこの問題は起きてないだろうし
PSCustomObjectのプロパティとhashtableの値への紐付けでオブジェクトの生存期間に差異があるようにしか見えないから
functionから戻る時に何か想定外な事が起きてるんだろうなあ
0633デフォルトの名無しさん
垢版 |
2022/12/27(火) 14:24:53.22ID:r8IxISV7
コマンド・プロンプトも一切つかったことない状況から
powershellの勉強最近始めたけど難しいね

先ず参考書籍少なすぎ
何から手を付けたらいいのか全くわからん

先輩諸兄はどんな感じで習得していったの?
0634デフォルトの名無しさん
垢版 |
2022/12/27(火) 14:35:15.62ID:ZD0ehGa/
必要に迫られて色々とネットで調べて解決策を探し回る
そのコードから理解できない部分や言語の基本を調べる(変数や表示の仕方とか色々と)
という泥縄式だな
0635デフォルトの名無しさん
垢版 |
2022/12/27(火) 15:00:48.14ID:r8IxISV7
ネットしかないのか、仕方ないな、、、

しばらくは苦しみながら覚えるしかないかぁ
0636デフォルトの名無しさん
垢版 |
2022/12/27(火) 15:45:26.24ID:/tVTIbQ7
Get-Help about_
で出てくるのを一通り読んどきゃ何も苦しむことなんてないだろ
0637デフォルトの名無しさん
垢版 |
2022/12/27(火) 17:56:17.16ID:0E4juWNJ
ある程度使えるようになってから書籍買って読んだら
「大体全部知ってるわ」ってなったから
ネットだけでもいけるだろ
0639デフォルトの名無しさん
垢版 |
2022/12/27(火) 20:24:26.94ID:jYPDn/gh
ほかの開発言語やシェルプログラミングにまったく疎い状況からPoweshellで入門してゴリゴリ使いこなしてやろうという路線は正直筋が悪いと思う
とはいえ勉強のためにPythonあたりの入門書をやれとも言いづらい
やはり泥縄式かな
0640デフォルトの名無しさん
垢版 |
2022/12/27(火) 21:27:46.01ID:T5RPj38W
>>639
一応VBAとGASが多少できるなったから他の言語も余裕かな、っておもって
PowerShellに手を出したら苦戦してる感じ

一通り基礎を覚えたら実践的に色々と試してみたいけど
powershellは色々覚えることが多すぎてメンドイ、、、
0641デフォルトの名無しさん
垢版 |
2022/12/27(火) 21:53:19.53ID:fSsOcWwB
変数?配列?何それ状態から始めてる初心者だけど基本的な用語がわからないから検索にも苦労する
セオリーもわからないから無駄にあれこれやってあとはコメント書きまくってグチャグチャになってる
0642デフォルトの名無しさん
垢版 |
2022/12/27(火) 22:04:55.23ID:vIW/uBHA
PythonもJavaも全くコード書けないノンプログラマだけどPowerShellは分かり易い気がする
0643デフォルトの名無しさん
垢版 |
2022/12/27(火) 22:58:59.38ID:B+wJL+Im
素人だけど、「PowerShell実践ガイドブック」っていう本は、素人には理解しにくい仕様とかを理解するのにとても役に立った
ただ、いろいろ冗長でちょっと読みづらい本ではある
0644デフォルトの名無しさん
垢版 |
2022/12/28(水) 01:26:32.00ID:++xg0WRh
PowerShell上で cmd /C xxxx を使うのが最善という結論に到達する
こういうのでいいんだよ的な
0645デフォルトの名無しさん
垢版 |
2022/12/28(水) 14:16:21.29ID:dmcJ6Qpo
ヘルプが出来が良いので何も要らない気はするけど
ハック的なモノや中でどう動いてるとかはpowershellexplained、実用的な書法はPowerShellGetで人気のあるやつ読むとか
0647デフォルトの名無しさん
垢版 |
2022/12/29(木) 01:00:35.68ID:036NTvOT
覚え始めは Microsoft docs を探し、それでわからなければ個人の解説記事を探した
スクリプトを書くようになってからは about_ から知りたいことを追いかける事が増えた

上でも名前が上がった「PowerShell実践ガイドブック」は、ある程度できるようになってから読んだが
何もわからない状態で読むにも良いと思う
第2章までで基本的なことが身につく
0649デフォルトの名無しさん
垢版 |
2022/12/29(木) 16:02:07.28ID:HWC94+Gl
>>648
実はこのスレだったりする
1つのサイト覗くよりたまにぜんぜん知らん知識が入ってくる
過去ログおすすめ
0650デフォルトの名無しさん
垢版 |
2022/12/29(木) 16:06:45.35ID:HWC94+Gl
あと間違った情報書く奴には必ず突っ込み入るから間違えたまま覚え事故も起き難くなる仕様だと個人的には思ってる
0651デフォルトの名無しさん
垢版 |
2022/12/29(木) 16:17:56.35ID:HWC94+Gl
powershell何某でぐぐって出てくる日本語の情報はなぜか間違ってたり思い込みで書かれた記事が放置されてて悲しい
情報源としてはstackoverflow辺りをまず探すのが安定
Microsoftの知りたかったことの全て系は役には立つけど知りたい事全てを補完できるわけではない
0652デフォルトの名無しさん
垢版 |
2023/01/01(日) 00:27:17.84ID:CeabMe2h
やり方が多すぎて失敗しているものだからな
0653デフォルトの名無しさん
垢版 |
2023/01/03(火) 15:47:50.12ID:naMqCIBL
リリース当時は学生だったからPIAをむさぼり読んでたな、楽しい本だった
挙動で間違いやすいのは(スコープを除けば)基本パイプ周りだから、
パイプ使わないスクリプトを書いてけば初手で躓く要素は少ないと思う
0654デフォルトの名無しさん
垢版 |
2023/01/03(火) 21:14:49.48ID:AaMOQNR6
>>653
シェルスクリプトを知っているのが前提だと思っていたが?
0655デフォルトの名無しさん
垢版 |
2023/01/03(火) 21:46:27.47ID:cXTWG1PB
パイプで間違う要素なんてあったっけ?
むしろ配列まわりの方が間違いやすい気がするが...
0657デフォルトの名無しさん
垢版 |
2023/01/03(火) 23:27:08.09ID:cXTWG1PB
>>656
いやパイプ関係なく PowerShell の配列は色々トリッキー

例えば複数のオブジェクトを配列で返すコマンドレットが要素が1つだけだとオブジェクト自体を返したりするとか
https://qiita.com/hitsumabushi845/items/fe4219ba9daa34f541c2

switch文に配列与えたら各要素を順番に適用する(要は勝手にループする)とか
https://step-learn.com/article/powershell/076-switch-loop.html
0658デフォルトの名無しさん
垢版 |
2023/01/04(水) 00:46:17.26ID:v02S4T2G
>>657
まさに前者をパイプ周り(のための)の仕様だって認識してる
カンマ演算子の使い方は知らないとできないけど、型指定しない変数に代入して原因がわからないってことはないでしょ
後者はforやforeach省略出来て便利ってだけで、トリッキーだとは思ったことないわ
0659デフォルトの名無しさん
垢版 |
2023/01/04(水) 03:45:39.75ID:jtN0WhrQ
switchの評価式に配列をぶち込む発想は他の言語経験有りなら起きないから無害だけど
function戻りの配列の扱いは慣れてても混乱するから特殊な事情が無い限りPSObjectや別のコンテナに入れて返す(脳死)
0660デフォルトの名無しさん
垢版 |
2023/01/06(金) 23:20:27.35ID:kugWcEru
どなたか助けてください。相談です。

一つのファイルに置換したい複数の数列(0.005→0.000、0.006→0.001、0.007→0.002、etc‥)が存在した場合、うまく自動で全て置換する方法はないでしょうか?

下の置換のコマンドを繰り返し使用してるのですが明らかに非効率で何かうまくできないか考えてます。

(Get-Content ファイル名) | foreach { $_ -replace "置換前","置換後" } | Set-Content ファイル名
0661デフォルトの名無しさん
垢版 |
2023/01/07(土) 08:57:10.32ID:rjY6PjFx
>>660
$hash = @{ 0.005 = 0.000; 0.006 = 0.001; 0.007 = 0.002 }
$hash[0.006]

とすると 0.001 が返るから、"置換後" にあたる部分を $hash["置換前"] とすればいい。
詳しくはハッシュとかハッシュテーブルでググれ
0662デフォルトの名無しさん
垢版 |
2023/01/07(土) 14:47:12.03ID:tZDUx9Ho
ver6.0以降だとスクリプトブロック使えるから、一応こんな感じで一度にできることはできる

"対象の数値" -replace "^[-+]?[0-9]+[.]?[0-9]*", { [decimal]$_.value - 差分の数値 }

数字の足し引きならCSVデータとかで読みこんで処理した方がいいとは思うけど
0664デフォルトの名無しさん
垢版 |
2023/01/08(日) 03:23:42.25ID:nZw+zsKC
0.005を足した数値にしたいと書いてないのが不思議

質問者は聞き方がわかっていない
0665デフォルトの名無しさん
垢版 |
2023/01/08(日) 09:53:58.06ID:n7Qx+Bf+
ちなみに、v5でも[regex]::Replace()のMatchEvaluatorにスクリプトブロックを渡せるから
>>662より手軽さが劣るけど同様の事ができる。
0666デフォルトの名無しさん
垢版 |
2023/01/09(月) 14:33:22.12ID:2QUdKeZJ
サブディレクトリ以下の全てのファイルに対し、ゾーンIDの削除をしたいのですが、
各ファイルのゾーンIDは
Get-ChildItem -Recurse -File | ?{
$_ | Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
} | Remove-Item -Stream Zone.Identifier;
に書けばできるみたいです。

powershell の勉強のため、下記のような書き方だと、どのように書けばできるのでしょうか?
$itemList = Get-ChildItem $targetFolder -Recurse;
foreach($item in $itemList){
Get-Item -Stream Zone.Identifier -ErrorAction Ignore;
}
0667デフォルトの名無しさん
垢版 |
2023/01/09(月) 15:34:37.62ID:2yNmR2Eh
>>666
こういうこと?
foreach($item in $itemList){
if (Get-Item -LiteralPath $item.FullName -Stream Zone.Identifier -ErrorAction Ignore) {
Remove-Item -LiteralPath $item.FullName -Stream Zone.Identifier
}
}
もちろん$itemはLiteralPathの代わりにパイプでオブジェクトごと渡してもいいと思う
0668デフォルトの名無しさん
垢版 |
2023/01/09(月) 15:52:05.35ID:2QUdKeZJ
>>667
ありがとうございます。
勉強になりました。
0669デフォルトの名無しさん
垢版 |
2023/01/10(火) 05:44:39.22ID:bjV4/8ri
例えば、Ruby で、再帰的にフォルダのサイズを求めてみると、

require 'win32ole'
fso = WIN32OLE.new( 'Scripting.FileSystemObject' )

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠しフォルダ・ファイルを除く。
# /**/* で再帰的に、以下の全てのフォルダ・ファイルを走査する
dir_path = "C:/Users/Owner/Documents/**/*"

target_dirs = Dir.glob( dir_path )
.select { |full_path| File.directory?( full_path ) } # フォルダのみ
.each do |folder|
folder_obj = fso.GetFolder( folder )

puts File.expand_path( folder_obj.path ) # \ を、/ に変換する
puts "#{ folder_obj.name } : #{ folder_obj.size }"
end

出力
C:/Users/Owner/Documents/a
a : 14231
C:/Users/Owner/Documents/a/b
b : 4666

# next で、次の繰り返しに進む事もできるが、
# select みたいなフィルターで絞り込む方が、可読性が高い
Dir.glob( dir_path ).each do |full_path|
next unless File.directory?( full_path ) # フォルダだけを処理する

puts full_path
end
0670デフォルトの名無しさん
垢版 |
2023/01/23(月) 12:43:06.27ID:y+pH12Ov
Tree /fとget-childitem select-object Full name,を組み合わせたデータがほしいのですが、ご存知の方、ご教示願います。
0671デフォルトの名無しさん
垢版 |
2023/01/23(月) 18:21:06.24ID:g43oPRJS
>>670
名前の通り再帰処理でフォルダのツリーデータ構造を作ってから出力する事になる。
powershellの関数呼び出しは100ぐらいのネストでスタックオーバーフローするので、
ある程度動作確認が出来たら再帰処理を配列とループに変換するか、
C#なりで書き直す必要があるかも。
0673670
垢版 |
2023/01/24(火) 00:18:36.99ID:splC6Inp
>>672
ありがとうございますm(_ _)m。できました。スクリプトの実行が無効になっているため、読み込むことができません。と出ましたが、ポリシーを変更してできました。
>>671
ありがとうございます。制限があるのですね。
0674デフォルトの名無しさん
垢版 |
2023/02/08(水) 20:31:25.08ID:s0xdk+qH
@("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | convertfrom-string -delimiter "," | sort-object p1 -descending | convertto-csv -notypeinformation
"yyyy/MM/dd"っぽいと勝手に日付時間の形式に変換されるのですがされないようにできますか?
windows10 PSVersion 5.1.19041.2364
0675デフォルトの名無しさん
垢版 |
2023/02/08(水) 21:02:50.26ID:s0xdk+qH
@("`"2023/01/01`",`"123`"","`"2023/01/02`",`"abc`"","`"2023/01/03`",`"あいう`"") | `
convertfrom-string -delimiter "," | sort-object p1 -descending | foreach-object {"$($_.p1),$($_.p2)"}
こうすれば出来たっぽいけど何かめんどくさい
0676デフォルトの名無しさん
垢版 |
2023/02/08(水) 21:55:45.34ID:Igk1TEx9
>>674
日付でソートするならばConvertFrom-Stringによる日付処理のままDateTime型で扱うのが正しいのでは?
0677デフォルトの名無しさん
垢版 |
2023/02/08(水) 22:42:40.57ID:s0xdk+qH
csv出力する際に "2023/01/01" が "2023/01/01 00:00:00" となるのを避けたいということです
ソート部分は別の処理をするかもしれないです
わかり難くてすいません
あとは tostring() で変換し直すかくらいでしょうか
0678デフォルトの名無しさん
垢版 |
2023/02/08(水) 23:16:16.35ID:4iQ2gNuN
>>674
676 の方針で書き換え量少なめパターン
@("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | convertfrom-string -delimiter "," | % { $_.P1 = $_.P1.ToShortDateString() ; $_ } | sort-object p1 -descending | convertto-csv -notypeinformation

Convertfrom-String を使いつつ変換したくないという裏には深い事情がありそうだが
その深い事情を無視していいなら新しくオブジェクトを作るのが楽かな
@("2023/01/01,123","2023-01-02,abc","2023 01 03,あいう") | %{ [PSCustomObject] @{ 'Date'=$_.split(',')[0]; 'content'=$_.split(',')[1] } }
0679デフォルトの名無しさん
垢版 |
2023/02/08(水) 23:25:37.64ID:KpfZjU7w
自分もConvertfrom-Stringさえ使わなければ楽だと思うが、
当初の質問通りConvertfrom-StringでDateTime型への自動変換を避ける方法、
という事なら
$a = @("2023/01/01,123", "2023-01-02,abc", "2023 01 03,あいう")
$t = @"
{p1*:2023/01/01},{p2:123}
{p1*:*},{p2:*}
"@
$a | ConvertFrom-String -TemplateContent $t

p1 p2
-- --
2023/01/01 123
2023-01-02 abc
2023 01 03 あいう
0680デフォルトの名無しさん
垢版 |
2023/02/08(水) 23:59:48.39ID:s0xdk+qH
>>678−679
ありがとうございます、参考にさせて頂きます
convertfrom-string を使っているのは前に使って動いてるからヨシッ!の精神と圧倒的な知識不足の為です
0681674
垢版 |
2023/02/09(木) 22:15:00.08ID:Zgr5da8a
PSCustomObject なんて便利なものがあるんですね
おかげで Convertfrom-String も使わないで済むようになり
日付の自動変換もされなくなりました、ありがとうございました
0682デフォルトの名無しさん
垢版 |
2023/02/09(木) 23:20:46.77ID:wH9zoD6W
本来、肩こりを和らげるマッサージの福利厚生の充実よりも、肩こりしない環境にすることが重要なわけだが、
PowerShellやってる人は、肩こりを和らげるマッサージを喜ぶ傾向が顕著
0686デフォルトの名無しさん
垢版 |
2023/02/10(金) 10:36:58.88ID:SshlofV9
rubyってことかもな
これを言ったのがいつも突然出てくるruby野郎だったら間違いなくrubyだと言える
0688デフォルトの名無しさん
垢版 |
2023/02/10(金) 14:00:16.56ID:fdH5JkI3
Ruby では「2023/01/01, 2023-01-02, 2023 01 03」の内、
最後の形式だけ、Date.parse で日付オブジェクトに変換できない

日付オブジェクトに変換せず、文字列のままソートするのが簡単

date_texts = %w(2023/01/03 2023/01/01 2023/01/02)
p date_texts.sort # 日付の文字列でソート

#=> ["2023/01/01", "2023/01/02", "2023/01/03"]

# 要素内に空白を含むので、\ で要素内の空白をエスケープする
date_texts = %w(2023/01/03\ あいう 2023/01/01\ 123 2023/01/02\ abc)
p date_texts.sort # 全体の文字列でソート

#=> ["2023/01/01 123", "2023/01/02 abc", "2023/01/03 あいう"]
0689688
垢版 |
2023/02/10(金) 14:01:04.70ID:fdH5JkI3
Ruby で仮に、2列のCSV テキストとみなした場合でも、
sort_by で任意の列のソート順で、行をソートできる

require 'csv'

input = <<"EOT"
2023/01/03 あいう
2023/01/01 123
2023/01/02 abc
EOT

options = { col_sep: " " } # 空白区切り

p input_ary = CSV.parse( input, options ) # 2次元配列
#=> [ ["2023/01/03", "あいう"], ["2023/01/01", "123"], ["2023/01/02", "abc"] ]

# 日付列でソートする
p result_ary = input_ary.sort_by{ |row| row[ 0 ] }.map( &:itself )
#=> [ ["2023/01/01", "123"], ["2023/01/02", "abc"], ["2023/01/03", "あいう"] ]

# 2次元配列を、CSV 文字列に変換する
puts csv_str = result_ary.map( &:to_csv ).join

カンマ区切りで出力
2023/01/01,123
2023/01/02,abc
2023/01/03,あいう
0690688
垢版 |
2023/02/10(金) 17:56:45.48ID:A9tz9okE
Ruby の日付オブジェクトには、数十種類の書式がある

require 'date'

# デフォルトの書式は、下と同じ
puts date = Date.parse( '2023/01/01' )
#=> 2023-01-01

# %F: %Y-%m-%d と同等 (ISO 8601の日付フォーマット)
puts date.strftime( '%F' )
#=> 2023-01-01

# %T: 24時間制の時刻。%H:%M:%S と同等
puts date.strftime( '%F %T' )
#=> 2023-01-01 00:00:00
0691デフォルトの名無しさん
垢版 |
2023/02/10(金) 21:41:15.34ID:TDizb0jh
目的と手段があべこべになってるって意味だよ、察しろよ
0693デフォルトの名無しさん
垢版 |
2023/02/18(土) 17:44:45.89ID:WNIjE3rx
Excelを操作しようとしたら酷く遅い。
これは工夫が足りない感じ?

やりたいのは3000行、100列ぐらいに関数が詰まってて、その中でエラーとなってるセルを見つけること。
関数が別のブックを参照してて、その別ブックは日々自動生成されるからその生成されかたによってはどうしてもエラーになってしまう。

VBAでも出来るけど、他と併せて考えるとPowerShell向きの処理だから、これで始めたのに。
PowerShellからVBAのプロシージャ呼び出せば、この部分の処理は一瞬だけど、それは本末転倒だし。
0694デフォルトの名無しさん
垢版 |
2023/02/18(土) 18:06:52.69ID:nz9Z1NDi
>>693
COMのIDispatch経由だからVBAと比較すれば当然遅くなるよ
一個一個のセルを見て回るのなんかは特に遅い
powershell自体も遅いから遅さはさらに加速する
ワークブックを開けてるならCOMからVBAコードを動的に流し込んで処理させた方が全然速いかもしれない
CodeModule.InsertLines辺りでぐぐれば出てくると思う
0696デフォルトの名無しさん
垢版 |
2023/02/19(日) 01:42:49.14ID:15y14fHP
数式のチェックをするということならusedrange.formulaとかで二次元配列に入れてしまえば速いだろうね
0697デフォルトの名無しさん
垢版 |
2023/02/19(日) 07:28:37.93ID:xSIr/CQB
セルの値をチェックしたいのか数式をチェックしたいのかもわからんしそもそも既に作ってあるならその遅い部分のコード晒せばいいのに

としか思わん
0698693
垢版 |
2023/02/21(火) 12:34:29.62ID:jIGEezda
PowerShellでRangeに対してforeachを使ったら糞遅かったが、Range.Cellsに対して使ったら爆速でした。

VBAで.Cellsを付けないことは無いが、PowerShellだと書き方が変わるから気付かんかった。

ソースは仕事で晒せないが、記憶を頼りに再現したのを後で書くよ。
0700デフォルトの名無しさん
垢版 |
2023/02/21(火) 17:16:31.11ID:mQxVjbPG
Excel操作は真面目にやるとCOMの参照の管理と解放が大変で避けちゃう。
完全に自分用なら雑でもいいんだけどさ。
VBScriptくらいに気楽にやらせて欲しい。
0701デフォルトの名無しさん
垢版 |
2023/02/21(火) 18:44:18.75ID:7Z23bFwT
あららSnoverさん去年退職しちゃったのか、、、
言語的には成熟してるし問題はないんだろうけど、残念だな
0702デフォルトの名無しさん
垢版 |
2023/02/21(火) 19:36:25.83ID:VTx8hARX
>>698
素直にExcel VBAを書いた方が安全だよ。
0704デフォルトの名無しさん
垢版 |
2023/02/27(月) 21:04:03.19ID:5eoJ3K3o
大規模な PowerShell モジュールは Install-Module での導入がオススメです
https://jpwinsup.github.io/blog/2023/02/27/UserInterfaceAndApps/PowerShell/PowerShell-ImportModule-FunctionOverflow/

Windows PowerShell では、 1 セッションのうち利用できる関数 (Function) の数の上限を変数 $MaximumFunctionCount にて制御しており、既定では 4096 となります。
Import-Module にて PowerShell モジュールを導入しますと、この $MaximumFunctionCount で管理する関数の数にカウントされ 4096 を超えた場合にエラーが生じます。

Install-Module では、本事象は発生しませんので、Install-Module を、ご利用いただくことを推奨いたします。
単機能のモジュールであれば、今回のような制限が生じるほど大規模な関数 (Function) 数とならないですが、クラウド製品に対し提供されるモジュールは、大規模な関数数となる傾向がございます。
クラウド製品に対する PowerShell モジュールのご利用にはインターネット (オンライン) への接続が必須となりますため、Install-Module も利用可能でございます。
0705デフォルトの名無しさん
垢版 |
2023/02/28(火) 21:55:58.18ID:NXRHGwBO
vscodeのプラグインどうにかしてくれないかな
せめて参照関連はちゃんとして欲しい
0706デフォルトの名無しさん
垢版 |
2023/02/28(火) 23:08:46.00ID:XEMkLhh3
PowerShellの構文が分からなくなったときに今話題のChatGPTで質問してみたら
的確な回答返ってきてすげぇ助かったわ。もうパソコン教室は廃業だろこれ
0707デフォルトの名無しさん
垢版 |
2023/03/10(金) 20:16:52.26ID:qXeg3GIX
ai のコード生成って結構すごいよね
コパイロット入れてるんだが、マジで打とうとしたコード先読みしてくる
インテリセンスみたいな数文字打って残りの補完じゃなくて、まるまる予測してきて更に当たってるっていう
0708デフォルトの名無しさん
垢版 |
2023/03/15(水) 14:42:36.44ID:o8REigww
ここでいいですか

ttps://qiita.com/Midoliy/items/a033b763399c242dc5c5
C#をスクリプト言語として利用する方法

PowerShell 7.3.3 で、dotnet tool install -g dotnet-script を入力してもエラーになります↓

C:\Users\UserName0\AppData\Local\Temp\47744ec9-ca71-4312-b0e8-3f8bd18d5776\restore.csproj : error NU1101: パッケージ dotnet-scri
pt が見つかりません。ソース Microsoft Visual Studio Offline Packages には、この ID のパッケージが存在しません。
ツール パッケージを復元できませんでした。
ツール 'dotnet-script' をインストールできませんでした。この失敗は次の原因で生じた可能性があります。

* プレビュー リリースをインストールしようとしており、--version オプションを使用してバージョンを指定しなかった。
* この名前のパッケージが見つかったが、.NET ツールではなかった。
* 恐らくインターネットの接続の問題で、必須の NuGet フィードにアクセスできない。
* ツールの名前の誤入力。

パッケージの名前付けの強制を含む他の理由については、https://aka.ms/failure-installing-tool にアクセスしてください
0711デフォルトの名無しさん
垢版 |
2023/03/17(金) 11:52:05.75ID:1OmGmSd0
>>707
コパイロットとやらはインタラクティブシェルでも使える?興味あり
gnureadlineうんこpsreadline最強と思ってたら思わぬ伏兵が…

bingのchatgptが話題になってるし、標準で付いてもおかしくないけど
0712デフォルトの名無しさん
垢版 |
2023/03/17(金) 14:15:57.93ID:piFUHGnm
インタラクティブ(履歴)/スクリプトでもヒューリスティックにコンテキストを読んでくれるのは新しいね、もはや補完ではない気がするが

ところで-UseFussyが超便利
0714デフォルトの名無しさん
垢版 |
2023/03/27(月) 09:23:21.18ID:qNF02T37
f1で直近コマンドの、Alt-hで直近パラメータのヘルプがコマンドラインを汚さずにチラ見出来るけど
常時表示しておきたい
0716デフォルトの名無しさん
垢版 |
2023/03/31(金) 09:29:33.35ID:Hum0KYCd
コマンドプロンプトのstartコマンドのように
新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか
0717デフォルトの名無しさん
垢版 |
2023/03/31(金) 10:04:55.21ID:oEDBXBHf
Add-Type によって、自作のクラスを使う処理を書いて、一応ちゃんと動くのですが
同じことを 何度もやろうとすると 二度目以降は「The type 〜 already exists.」と出て止まってしまいます.
そこで「既に そのタイプが存在しているかどうか」をチェックしたいのですが、これってどう書くんでしょうか
0718デフォルトの名無しさん
垢版 |
2023/03/31(金) 22:12:52.48ID:yFMegc6R
>>717
こんなん
Add-Type @'
public class MyClass {
public void test() {
}
}
'@

if ("MyClass" -as [type]) {
"MyClass is exist"
}
0721716
垢版 |
2023/03/31(金) 22:58:55.98ID:Hum0KYCd
>>717
単純に try { [クラス] } catch { Add-Type 〜 } とか、知らんけど

>>719
Start-Processを使わない場合のように新しいウィンドウなしで起動したいです
0723716
垢版 |
2023/03/31(金) 23:54:48.86ID:Hum0KYCd
>>722
最初はそれでいいと思ったんですが、コンソールの取り合いになります
(Start-Process netsh.exe -NoNewWindow とかで試すとわかりますが、くれぐれもご注意を)
取り合いにならないように -Wait も指定して
(Start-Process netsh.exe -NoNewWindow -Wait -PassThuru).ProcessorAffinity = xxx
とすると、-Wait が効きすぎて ProcessorAffinity をセットできないという罠
0724デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:12:16.16ID:rM0w1xSL
つまり.NETのProcessorAffinityは存在するプロセスにしか適用できないから無理でいんじゃね
知らんけどWin32APIとかで別の方法を探った方がいいんじゃね
0725デフォルトの名無しさん
垢版 |
2023/04/01(土) 00:25:58.89ID:rM0w1xSL
たとえばWin32APIのCreateProcessにCREATE_SUSPENDEDというフラグがある
プロセスをサスペンド状態で作成してaffinity設定してからResumeThreadで開始
これでいけるんじゃね
0727デフォルトの名無しさん
垢版 |
2023/04/01(土) 09:42:35.62ID:nbrNF8T0
Start-Process -NoNewWindow cmd.exe "/c start /affinity xxx /b foo.exe"

これくらいしか思い浮かばなかった
0728デフォルトの名無しさん
垢版 |
2023/04/01(土) 10:09:29.22ID:rM0w1xSL
定義が長くなったからこっちに貼り付けたよ
https://ideone.com/LOSuzD
使い方
bool [Win32API]::CreateProcessWithAffinity(appname, cmdline, affinity)
affinityはプロセスに直接設定するAPIが見つからなかったのでGet-ProcessをResumeThread前に呼び出して指定してる
サンプルはcmdを呼び出してpingをlocalhostに10回打ってる間にプロセス名とaffinity値を出してる
0729727
垢版 |
2023/04/01(土) 10:22:16.44ID:nbrNF8T0
Start-Process -NoNewWindow -Wait cmd.exe "/c start /affinity xxx /b foo.exe"
こうだった
0730デフォルトの名無しさん
垢版 |
2023/04/01(土) 10:27:57.30ID:rM0w1xSL
寝ぼけてた。コールバックの部分下だけで良かったわ
System.Diagnostics.Process.GetProcessById(pInfo.dwProcessId).ProcessorAffinity = (IntPtr)affinity;
0731デフォルトの名無しさん
垢版 |
2023/04/01(土) 10:32:18.54ID:rM0w1xSL
でもう一箇所、appnameに$nullを指定してもC#側型宣言で""に変換されてしまうので、CreateProcessの直前に下を追加しとくとcmdlineだけで動く
if (appname == "") { appname = null; }
0732デフォルトの名無しさん
垢版 |
2023/04/01(土) 10:52:36.56ID:NrUMzMDg
これパイプすればいいんだよ
ポイントは () を使わないこと

(Start-Process).ProcessorAffinity = xxx は NG
Start-Process | ForEach-Object {} で OK
(Start-Process) | ForEach-Object {} は NG
& { Start-Process } | ForEach-Object {} でも OK
0734デフォルトの名無しさん
垢版 |
2023/04/01(土) 11:10:53.22ID:rM0w1xSL
Start-Process cmd.exe -ArgumentList '/c echo hello world & ping 127.0.0.1 -n 10' -NoNewWindow -PassThru | %{ $_.ProcessorAffinity = 1; $_ | select Name, ProcessorAffinity }
0735デフォルトの名無しさん
垢版 |
2023/04/01(土) 14:38:06.95ID:khXUWf7f
Start-Process cmd.exe -NoNewWindow -PassThru | % { $_.ProcessorAffinity = 1 } だと困る
Start-Process cmd.exe -NoNewWindow -PassThru -Wait | % { $_.ProcessorAffinity = 1 } か
Start-Process cmd.exe -NoNewWindow -PassThru | % { $_.ProcessorAffinity = 1; Wait-Process -Id $_.Id }
0736デフォルトの名無しさん
垢版 |
2023/04/01(土) 16:54:32.28ID:SzOWT/hN
717です. 反応してくださったかた ありがとうございました

>>718
if ("MyClass" -as [type]) → なるほど!…これでした!

>>721
私も,とりあえずは
try{ [MyClass] >$null } catch{ Add-Type -Path "〜.cs" >$null }
で 済ませていたのですが
例外に たよる書き方は,なんとなくカッコ悪い感じがして(笑)
0739デフォルトの名無しさん
垢版 |
2023/04/01(土) 22:58:19.34ID:sdpm0Gxz
あ〜、
> コマンドプロンプトのstartコマンドのように
> 新しいウィンドウを作成せず、使うプロセッサを指定して起動するにはどうすれば良いですか
というか
 新しいウィンドウを作成せず、
 コマンドプロンプトのstartコマンドのように使うプロセッサを指定して起動するにはどうすれば良いですか
という感じか。であればこれまでに出てた回答の方が正しいね。
ほぼ同じだけど自分なら
$proc = Start-Process -FilePath 〜 -NoNewWindow -PassThru; $proc.ProcessorAffinity = 1; $proc.WaitForExit();
みたいにするかなぁ。(でもStart-Processじゃなく小回りのきくProcessStartInfoを使うかな?)
0740デフォルトの名無しさん
垢版 |
2023/04/02(日) 00:15:44.70ID:l9+T+h5c
質問です。
外部コマンドの標準出力やエラー出力を一緒に変数に入れたいのですが、
$result=外部コマンド.exe 2>&1
この式で一見動作はしてるようのですが、外部コマンドからエラー出力があった場合に赤い色が付き、powershell的なエラーメッセージも追加されてしまいます。
意図としては色とか追加メッセージとかは不要で、純粋に外部コマンドの標準出力やエラー出力を一緒に変数に取り込みたいだけなのですが、
そういう場合どう記述したら良いでしょうか。
0741デフォルトの名無しさん
垢版 |
2023/04/02(日) 00:47:59.12ID:h0WbN+8B
外部コマンドの引数が不要またはシンプルなら、
簡単で分かりやすいのはcmd上で標準出力にする方法
$result=cmd /c "外部コマンド.exe 2>&1"
0744デフォルトの名無しさん
垢版 |
2023/04/02(日) 11:17:09.81ID:l9+T+h5c
ためしにChatGPTに質問してみたら以下の回答でした
質問「powershell上から外部コマンドを実行し、その標準出力とエラー出力を、powershellによる出力の加工を抑止した状態で1つの変数に入れたい」
$output = & <コマンド> 2>&1 | Out-String
Out-Stringは盲点でした。一応文字列として取得できているのでこれでいいのかな
0745デフォルトの名無しさん
垢版 |
2023/04/02(日) 11:29:33.76ID:yOzYb5by
PowerShellはあてにならないからcmdに頼ることも多いよな

Write-Host Test 1
New-Item -Path target1 -ItemType Directory
New-Item -Path junction1 -ItemType Junction -Value target1
Write-Host Test 2
New-Item -Path test2 -ItemType Directory
Push-Location -Path test2
New-Item -Path target2 -ItemType Directory
New-Item -Path junction2 -ItemType Junction -Value target2

これが失敗するなんて想像してなかった
0747デフォルトの名無しさん
垢版 |
2023/04/02(日) 16:46:18.09ID:yOzYb5by
ジャンクションなら絶対パス必須でもいいけど
シンボリックリンクでは相対パスが使えないと不便

>>745 のテストをシンボリックリンクに変えてもやっぱりおかしい
ターゲットがディレクトリなのにファイルのシンボリックリンクになる
条件次第で逆にすることもできる
タイプ間違いだと補完や削除をするときに困るんだよな
だから最初からcmd.exeでmklinkしてる
0749デフォルトの名無しさん
垢版 |
2023/04/03(月) 07:48:59.39ID:Jr4h81FG
>>739
あの〜、コマンドプロンプトのstartだと1行の
start /B /AFFINITY 1 cmd.exe
のように「新しいウィンドウを作成せず、使うプロセッサを指定して起動する」には
小回りのきくProcessStartInfoを使うとどう書くの?
0751デフォルトの名無しさん
垢版 |
2023/04/03(月) 21:13:34.50ID:d+sLTFCG
例示ではプロセス起動・Process型オブジェクト取得にStart-Processを使ったけど
>>739は普段はProcessStartInfo使ってるってだけじゃないの。
私も引数あるときはStart-Process(-ArgumentList)避けてProcessクラス使う。
0752デフォルトの名無しさん
垢版 |
2023/04/03(月) 21:20:59.87ID:9kyxsKiX
PowerShellってWebスクレイピングには向いてないですか?
Pythonで作った方がいいですか?
PowerShellは職場用のスクリプトを何個か作ったりして少し分かるのですが、Pythonはまったく不慣れなので迷ってます
0754デフォルトの名無しさん
垢版 |
2023/04/03(月) 22:09:14.13ID:FTaZkaBO
Windowsに限ればスクレイピング以外にもブラウザに直接細工する手段が充実してるからライブラリ頼みのpythonより向いてるとも言える
0755752
垢版 |
2023/04/04(火) 10:40:01.35ID:4xPC11r9
>>753
>>754
ありがとうございます
PowerShellでやってみようと思います
0757デフォルトの名無しさん
垢版 |
2023/04/08(土) 23:26:55.43ID:ymsLMaB3
64bit環境用のPersonal CommunicationsのOCXやらが無い場合は32bitのpowershellからCreateObjectするしかないとは思うけど
そのサイトのVBA版では環境に関する言及がないね
32bit版Officeを使っているという前提で書いてるのかもしれないが試してみないと判らないね
0758デフォルトの名無しさん
垢版 |
2023/04/10(月) 20:51:54.13ID:4PCv5Fk3
すいません、当方SEで技術的な質問です
administrator権限のユーザーでLinuxサーバーからパスワード認証でなく、秘密鍵と認証鍵の認証方式でwindowsサーバーにSSHを掛けたいのですが、administrator権限のユーザーですと、パスワードを聞かれてしまいます
他の権限のユーザーは問題無く認証されます
administrator権限では認証方式のSSHは使えないのでしょうか?
0760デフォルトの名無しさん
垢版 |
2023/04/10(月) 21:31:04.64ID:4PCv5Fk3
>>759
ありがとうございます
明日、業務で試してみます
0761デフォルトの名無しさん
垢版 |
2023/04/14(金) 21:40:03.65ID:qiPEiEw+
Windowsのディスプレイ設定で拡大率を100%以外にしてると
フォームの文字がぼやけるんだけど、なにか解決策はありますか?


Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.text= "タイトルはぼやけない"
$label = New-Object System.Windows.Forms.Label
$label.Size = New-Object System.Drawing.Size(300,20)
$label.Text = "ディスプレイ拡大率が100%以外だと文字がぼやける"
$form.Controls.Add($label)
$form.ShowDialog()
0763デフォルトの名無しさん
垢版 |
2023/04/15(土) 13:51:30.62ID:iq3ZlEDB
その辺て外人もあまり正解に辿り着いてない箇所だな
俺も辿り着いたとは言えんけど面倒だった
0765デフォルトの名無しさん
垢版 |
2023/04/15(土) 15:02:15.83ID:cOO792TH
powershellじゃなくてWindowsFormsの問題でしょ
「WindowsForms ぼやけ」で検索したらいくらでも出てきたけど
0768デフォルトの名無しさん
垢版 |
2023/04/15(土) 22:14:25.62ID:raQFwlCG
c:\aaa\bbb\ccc\hhh
c:\aaa\ddd\eee
c:\aaa\fff\ggg(以下続く)
というフォルダ構造があった場合、ccc(サブフォルダhhhも含む)、eee、gggのフォルダを別のフォルダにコピーしたいんですがうまくいきません。

chatGPTに聞いたところ ($rootFolder=c:\aaa、$targetFolderはコピー先)
$targetFolders = Get-ChildItem $rootFolder -Recurse -Directory | Where-Object { $_.FullName -like "$rootFolder\*\*\[ceg]" }
となり、少し変更して
$targetFolders = Get-ChildItem $rootFolder -Recurse -Directory | Where-Object { $_.FullName -like "$rootFolder\*\*" }
としてみたんですが、これだとcccフォルダがコピー先に存在していた場合hhhフォルダがcccフォルダとは別にコピーされてしまいます。
同じフォルダ名があった場合サブフォルダの処理を飛ばしてフォルダ構造したままコピーする方法はないでしょうか。
0770デフォルトの名無しさん
垢版 |
2023/04/15(土) 23:22:30.72ID:iq3ZlEDB
・同じフォルダ名があった場合サブフォルダの処理を飛ばしたい
ってう制約を加えてchatGPTに聞いたらいいんじゃね
0771768
垢版 |
2023/04/16(日) 01:08:07.22ID:i+x2SgN3
>>770
試してますがうまくいきませんね。aaaやbbbが例えであることをうまく理解してくれなくて、
全てのフォルダ名を手入力する必要があるコードしか作ってくれません。○や△みたいな記号に置き換えても同じ。

get-childitemで特定の深さ以下のフォルダ名を取得することができればうまく行きそうですが、
-depthは特定の深さ「まで」のフォルダを検索するオプションですよね?
特定の深さ以下のフォルダを検索する方法はありませんか?
0772デフォルトの名無しさん
垢版 |
2023/04/16(日) 11:56:14.63ID:QYDIaDii
一発でrecursiveでやるのを諦めて泥臭く2重なり3重なりの繰り返し処理にして
自分でフォルダを掘り下げていけばいいんじゃないの
0775デフォルトの名無しさん
垢版 |
2023/04/16(日) 12:38:10.68ID:SPigkToS
>>771
相対パスの概念がないのか?
0776デフォルトの名無しさん
垢版 |
2023/04/16(日) 12:47:20.03ID:SPigkToS
>>768 はネタかもな

コピー先に何があるのかチェックしないという発想は、まったく理解できない。

初心者なら前提条件という概念がないのはわかる。

先にあったらこうする、そうでなかったらこうするなどの条件分岐がないなら、強引にやればいい。

そもそもROBOCOPYコマンドでできることをやろうとしているのは、これ学校の課題なのかなと思いました。
0778768
垢版 |
2023/04/17(月) 01:51:03.87ID:GaP+UugE
>>774
そうなんですが、>>768だとd:\コピー先\ccc\hhhとしたいのにcccフォルダがすでにあると
d:\コピー先\ccc
d:\コピー先\hhhになっちゃうんですよね。

>>772の方法か、もしくは>>776robocopyとforeachで何とかできるか? とりあえず自分であがいてみます。
0780デフォルトの名無しさん
垢版 |
2023/04/17(月) 11:31:05.75ID:udj2SRYX
特定の深度だけ処理してみた
※$Sourceはフルパス指定であること

param(
[string]
$Source,

# $Sourceからの相対深度
[int]
$RelativityDepth
)

# パスを\と/で区切って配列化
$SourceDirSplit = $Source.Split([System.IO.Path]::DirectorySeparatorChar).Split([System.IO.Path]::AltDirectorySeparatorChar)

foreach ($TargetDir in @(Get-ChildItem -LiteralPath $Source -Recurse -Directory))
{
# パスを\と/で区切って配列化
$TargetDirSplit = $TargetDir.FullName.Split([System.IO.Path]::DirectorySeparatorChar).Split([System.IO.Path]::AltDirectorySeparatorChar)

# 指定深度にあるDirを処理
if ($TargetDirSplit.Count -eq ($SourceDirSplit.Count + $RelativityDepth))
{
# 一致したディレクトリを返す
$TargetDir
}
}
0781デフォルトの名無しさん
垢版 |
2023/04/19(水) 22:39:13.81ID:CpwHPFTk
Start-ThreadJob や Register-EngineEvent のスクリプトブロックの中で
キャプチャされずにWrite-Output 相当の出力をする方法はないでしょうか

パイプラインに流したいので Write-Host ではなく Write-Output したいです
別のプロセスを経由する方法は思いついたのですが残念過ぎますし
ForEach-Object -Parallel のようにキャプチャされなければ良いのに

  function hogepiyo {
    begin { 処理本体はここで Start-ThreadJob しておく }
    process { … }
    end { … }
    clean { … }
  }

  なんちゃら | hogepiyo | ぽげむた

のようにしたくて考えてます
要は入出力と処理を非同期にできれば他の方法でもありがたいです
0783デフォルトの名無しさん
垢版 |
2023/04/20(木) 22:40:35.29ID:fUuxiSJs
PowerShellでフォーム作るの割と苦痛なんだけど何かデザインモードとかないの?
0784デフォルトの名無しさん
垢版 |
2023/04/21(金) 05:21:56.20ID:ZJfuu8vu
Where-object多様するスクリプトに数万行のcsv食わせたら処理に1時間くらいかかる…
大量のデータ処理はWhere-object使うなってみかけたけど使わん方がいいのか
0785デフォルトの名無しさん
垢版 |
2023/04/21(金) 07:34:50.39ID:TBBX4m6H
件数が少ないことが確実な時しか使わない。

スクリプトだとほとんど foreach(){} 使ってる。
パイプライン処理したい場合でも &{} や .{} や function の process{} あるいは filter。
0787デフォルトの名無しさん
垢版 |
2023/04/21(金) 11:30:54.75ID:c3fakvC2
>>784
PowerShell スクリプトのパフォーマンスに関する考慮事項
ttps://learn.microsoft.com/ja-jp/powershell/scripting/dev-cross-plat/performance/script-authoring-considerations?view=powershell-7.3
0788デフォルトの名無しさん
垢版 |
2023/04/21(金) 17:50:40.46ID:4gKwO2KA
>>782
出力がコレクションにためられて Receive-Job が必要になるのを回避したい
Start-ThreadJob の -StreamingHost オプションの Write-Output 版な感じ
そんなオプションはないから回避方法を知りたい

Start-TheadJobだけでなくイベントハンドラから出力する場合も同じ
イベント飛ばせばいいかと思ったらハンドラがジョブ扱いされて頭抱えた
どうすれば Receive-Job を必要とせずに Write-Output 相当の出力ができるのだろう
0792デフォルトの名無しさん
垢版 |
2023/04/22(土) 10:34:00.20ID:iFkcYPBt
function target
・入力を読み続ける
・最後に読んだ入力を1秒間隔で出力し続ける
・入力が q なら終了

処理遅延を無視した理想的な使用例が

. { $s = Get-Date; 1; sleep 3; 2; sleep 3; 'q' } | target | % { '{0} {1}' -f (Get-Date) - $s, $_ }

0:00:00.0000000 1
0:00:01.0000000 1
0:00:02.0000000 1
0:00:03.0000000 2
0:00:04.0000000 2
0:00:05.0000000 2

となるような function target はどうすれば実現できますか
処理時間でずれていくのはもちろんかまいませんが
入力待ちにも出力を続ける具体例が知りたいです
0794デフォルトの名無しさん
垢版 |
2023/04/22(土) 16:45:49.14ID:3JkCsMe2
>>792
「qなら終了」が何を示すかによるが、powershellのパイプは途中で打ち切る事は原則できないと考えた方が良い。
(endブロックが呼ばれない不完全なハックならググれば見つかる)
またパイプ処理の待機はpowershellのメインスレッドの待機という意味になるので、
そこに非同期イベントを介入させたい場合はそのイベント用の別スレッドを走らせておく必要がある。
0795デフォルトの名無しさん
垢版 |
2023/04/22(土) 21:39:35.55ID:81urZ/Lj
(New-Object -ComObject Shell.Application).NameSpace(10).MoveHere(ファイルパス)
上記の方法でファイルをごみ箱に移動する場合ファイルが1個なら問題ないんですが、
ファイルパスをを"z:\*"みたいにワイルドカードで指定するとなぜか
ごみ箱でなくC:\Users\ユーザー名にファイルが送られてしまいます。
どうすればごみ箱に送れましょうか?
0796デフォルトの名無しさん
垢版 |
2023/04/23(日) 10:54:07.72ID:ElcI27v7
>>794
q は出力スレッドの停止マークで、入力の最後も意味するつもりだった (その後の入力はない)
という考えをくみ取って欲しくて例を付けたのだが伝わらなくて残念

パイプラインの中断にSelect-Object -First 1する話は知ってる
ていうか本題から話をそらそうとしてません?

知りたいのはメインスレッド以外からプライマリパイプラインに出力する方法
パイプラインの次段に送るにはどうすればいいか具体例が欲しい
0797デフォルトの名無しさん
垢版 |
2023/04/23(日) 15:49:22.67ID:fUzoPDLK
シェルスクリプトやPowerShell が遅いのは、
毎行、何かのプロセスを起動するからじゃないの?
多くはプロセスの起動時間だろう

Ruby は、外部プロセスを起動しなければ、プロセスは1つのまま。
並行処理もあるけど

grep は、1GB を1秒!
0798デフォルトの名無しさん
垢版 |
2023/04/23(日) 16:01:56.38ID:vCOHFjdN
>>796
そもそもパイプは同期的にしか動かないので、次段でいくら細工しても上流が出力を起こしたタイミングに縛られる。
話を単純にするなら不規則な出力を受ける処理と一定間隔で出力する処理は分けるべきだろうね。
0801デフォルトの名無しさん
垢版 |
2023/04/23(日) 16:33:01.94ID:aISPDv4l
>>795
シェル名前空間はバグだか仕様だか判らない所があるから真面目に考えても無駄
もうそういう仕様と考えてファイルは1個1個送れば?
ワイルドカードはgciで展開できるんだし
0802デフォルトの名無しさん
垢版 |
2023/04/23(日) 17:57:33.46ID:ElcI27v7
>>798
サブスレッドがパイプラインに書き込めば次段が動くんじゃないの?
言い換えると >>792 のfunction targetは実現不可能ということ?
0804デフォルトの名無しさん
垢版 |
2023/04/25(火) 01:01:33.91ID:q0KJktEO
最近この言語で書くことあるけど関数の呼び出しを最初に書かないとエラー起こすなんて知らなくて問題解決に時間がかかった
多分ほとんどの人が関数はメインの後に書きたいと思うんだけどファイル分けて呼び出したりしてるの?
0805デフォルトの名無しさん
垢版 |
2023/04/25(火) 07:59:40.97ID:0OU27daL
>>804
> 多分ほとんどの人が関数はメインの後に書きたいと思うんだけど

んなことはない
呼び出される方を前に書かなきゃいけないのは他の言語でも多いぞ
0806デフォルトの名無しさん
垢版 |
2023/04/25(火) 08:14:10.57ID:Q567y34W
>>805
定義を上書きできる言語なら呼び出し順序に意味があると思うけど、そうじゃないならただの手抜き仕様
0807デフォルトの名無しさん
垢版 |
2023/04/25(火) 08:17:30.73ID:0OU27daL
>>806
実行速度が速くなる、スコープが明確になる、などのメリットがあって敢えて採用されてるんだよ
JSとかも古くからあるfunction構文は順序関係ないが今推奨されてるアロー関数だと前に書かなきゃだめだ
0808デフォルトの名無しさん
垢版 |
2023/04/25(火) 08:19:33.10ID:0OU27daL
あとスパゲティを防ぐ効果があるというメリットもあるな
C言語だとそれを目的にプロトタイプを書かない人もいる
0809デフォルトの名無しさん
垢版 |
2023/04/25(火) 08:27:15.73ID:h+X7r+oZ
関数同士の依存関係が明確で前の関数が後の関数に依存しないなら初めてのコードを読みやすくなるというメリットもあるな
0811デフォルトの名無しさん
垢版 |
2023/04/25(火) 09:07:53.85ID:qRrW+mkA
Java隆盛くらいの時代には関数はどこに書いても良いのが当たり前として定着したけど
関数型プログラミングでは関数宣言は変数や定数の宣言と同じようなものだからどうしても順序を意識せざるを得ない
順序の扱いを自動でやってくれる仕組みがホイスティングなんだけど、そのルールの分かりにくさやいやらしさが開発者に嫌われてJavaScriptのvarがletとconstに取って代わられた歴史がある
0812デフォルトの名無しさん
垢版 |
2023/04/25(火) 11:26:54.33ID://VjHWfL
>>804
メインの部分をメイン関数として書いて実行時にメイン関数を呼び出すようにすればよいのでは?PowerShellはシェルとしても動くので実行時に先に関数が定義されていないといけないのは自然な動作のような気もする。
0816デフォルトの名無しさん
垢版 |
2023/05/04(木) 17:38:09.61ID:spWJYsDj
自分のコード見たら別に後から宣言してても実行できてるんだが
コマンドレットの定義だとホイスティングされるとかある?
0818デフォルトの名無しさん
垢版 |
2023/05/04(木) 21:18:57.29ID:FdNSNO1e
>>816
古臭いと言われても、前に書いた方が無駄な混乱をさけられる。
0819デフォルトの名無しさん
垢版 |
2023/05/05(金) 18:03:31.01ID:gmBJZ0Nw
動的言語は第一級関数のクロージャが多いから、
関数外で宣言したローカル変数が、関数内へ持ち込まれるので、
スコープが広くて、ヤバイ

さらに、JS はホイスティングされるから、超ヤバイ

ただし、Ruby の関数だけは第一級関数のクロージャではなく、
関数外で宣言したローカル変数は、関数内へ持ち込まれない

だから他の言語よりも、圧倒的にバグらないので、初心者向き
0820デフォルトの名無しさん
垢版 |
2023/06/29(木) 13:26:04.42ID:GLUt9X10
get-childitem select-object Full name,でownerを追加する方法はありますか?ご存知の方、ご教示願います。
0821デフォルトの名無しさん
垢版 |
2023/06/29(木) 17:48:28.46ID:xt/PffdC
>820
Get-ChildItemだけではowner情報は取れない、Get-Aclで情報取得する必要がある
組み合わせで良ければ以下の様にSelect-Objectでプロパティ追加すれば出来る
Get-ChildItem|Select-Object FullName,@{n="Owner";e={Get-Acl $_.fullname|% {$_.Owner}}}
0822デフォルトの名無しさん
垢版 |
2023/07/07(金) 19:48:22.82ID:5l+s6JZK
Outlook を起動してメールを送りたいのですが
本文のメールのフォントサイズや色の指定が一切無視されます。
Outlook 側の設定なのか、コードが悪いのかもよくわからず。。。
スレ違いならすいません
===================

$outlook = New-Object -comObject Outlook.Application
$mail = $outlook.CreateItem(0)
$mail.Subject = "件名テスト"
$mail.HTMLBody = "<html><head><style type='text/css'>
body {font-size:11; font-family:Meiryo UI;}
</style></head><body>
ああああ<span style='text-decoration:underline; text-decoration-color:red;'>いいいい</span>ううう<br>
</body></html>"
$inspector = $mail.GetInspector
$inspector.Display()
#$mail.Send()
===================
上記のコードだとメイリオは設定されますが、フォントサイズは8.5になるし下線は黒色になります。
なにとぞご教示お願いします
0824デフォルトの名無しさん
垢版 |
2023/07/10(月) 03:13:05.95ID:ixw20e1S
>>823
試したはず・・・と思いつつも確認したら普通に変更されました!!!
11px で確認したのかもしれません。11pt と書いたら普通に反映されました
ありがとうございます

ただ下線は相変わらず赤色にならず、黒色のままです。
#FF0000 も試したけど変わらず・・・
どうやら text-decoration-color がそもそも使えないようでした。
さささ<span style='text-decoration:underline; color:red;'>ししし</span>すすす<br>
とやったら文字も赤くなりましたが下線も赤くなりました。

Outlook に使える html の仕様との戦いな気がしてきた
これはどこで尋ねたら・・・
0825デフォルトの名無しさん
垢版 |
2023/07/10(月) 10:11:13.02ID:CzqO5vr+
後はstyle属性をシングルクォーテーションで括ってるのが気になった
全体の括りをシングルにして属性値をダブルに変更で動くと思うよ
0826デフォルトの名無しさん
垢版 |
2023/07/10(月) 10:51:54.81ID:ixw20e1S
シングルとダブルは変わりませんでした…
実際はPowerShellでメール本文内に変数を当てこむので
シングルのままでいこうと思います

あと下線だけ赤色は私の勘違いでした
赤下線の時は文字も赤くして問題なかったのでとりあえず解決しました

お手数おかけしました
ご助言くださった方ありがとうございました
0827デフォルトの名無しさん
垢版 |
2023/07/13(木) 11:56:03.10ID:cnmTEsiX
二週間ほど前に自分で調べて書いたのに、どうやって書いて動かしたのか全く思い出せなくて困ってます
自分で自分が信じられないんですが、教えてください。

やりたいこと:Read-Hostで指定したフォルダに存在するフォルダを取得し、各フォルダに指定したファイルをコピーする
引っかかっている点:
1)$input = Read-Host "コピー先フォルダを指定"
たとえばここでcopyと入力。規定のフォルダがC:\作業とする。
入力の結果、c:\作業\copyとして、ここにあるサブフォルダを取得したいので
$inputをc:\作業\copyにしたい。
2)Get-ChildItem でディレクトリ名のみ取得するには?
それでforeachでやってたと思うんですが・・・。
0828デフォルトの名無しさん
垢版 |
2023/07/13(木) 13:50:42.52ID:K8IsBXo8
Get-ChildItem -LiteralPath ([IO.Path]::Combine("C:\作業", (Read-Host "コピー先フォルダを指定"))) -Directory -Name
0830デフォルトの名無しさん
垢版 |
2023/07/14(金) 04:02:22.77ID:vOCFwCnb
多分いままで書いてたコードはこれ

# 規定のフォルダのパスを作成
$parent = join-path 'c:\作業' $input

# 上記パスのサブフォルダ作成
$names = ls -pspath $parent -di | % name

下記はエイリアス(関数の別名)
ls := get-childitem
% := foreach-object
0832820
垢版 |
2023/07/18(火) 17:12:35.63ID:jBHsPJa3
>>821
遅くなりました。
set-location -pathで場所を指定したら、指定したフォルダのownerを取得できました。ありがとうございます。
get-Childitem -recruse -file ┃select-Object directoryName ,name ,extension ,Length Creationtime, lastACCESStime ,lastwriteTime, fullname ┃Export‐csv ‐Encodeing default xxx.csv
と一緒にできなかったのが悔やまれます。
0834デフォルトの名無しさん
垢版 |
2023/07/18(火) 20:02:12.51ID:x3+Ehzia
>>821の何がだめで、あるいは何が分からなくて、そのコマンドに組み込めなかったのか分からんな。
起点ディレクトリ自体の情報もCSVに含めたい、って事なのかな。
0836820
垢版 |
2023/07/19(水) 08:31:15.42ID:wWAjwZqt
>>834
そうです。
0837デフォルトの名無しさん
垢版 |
2023/07/19(水) 15:47:04.50ID:mqKqy4GV
ならこんな感じで。

$dirPath = "起点ディレクトリのフルパス"
[IO.FileInfo]::new($dirPath) | %{$_; $_ | Get-ChildItem -Recurse -File} | Select-Object DirectoryName, Name, Extension, Length, CreationTime, LastAccessTime, LastWriteTime, FullName, @{N="Owner";E={($_ | Get-Acl).Owner};} | Export-Csv -Encoding Default xxx.csv

CSVの出力先がフルパスなら、Set-Locationはいらない。
0838820
垢版 |
2023/07/24(月) 18:16:28.42ID:yY3fBN5A
>>837
ありがとうございますm(_ _)m
とりあえずownerを取得できました。列の入れ替えはPowerQueryで対処します。
neme,Extensio,owner,...したかったのですが。
0839デフォルトの名無しさん
垢版 |
2023/08/02(水) 23:31:49.70ID:8Lc0dkYb
Pythonでやったら楽なのに…と思う処理も他のメンバーに配る可能性を考えると泣く泣くpowershellでやることになる
嫌いな言語ではないけど凝った処理を書こうとすると見た目の癖が強いソースコードになりがち
0842デフォルトの名無しさん
垢版 |
2023/08/06(日) 22:29:47.72ID:5CExyS7F
質問なのですがパイプラインの結果を関数に渡して先頭からk番目を取り出すには一体どうすればorz
やりたいことはパイプラインの結果を検証する処理をサブルーチン化したい(k番目を取り出すのはその第一歩)

とりあえず書いたがうまく行ってないやつ:
function Test-RegEnt($reg_query_result, $exp_type, $exp_value) {
$reg_query_result | Select-Object -Index 2
}
Write-Output ("Test_A1:" + ($result | Select-Object -Index 2)) # 2行目が意図通りselectされる(" RegisteredOwner REG_SZ Admin")
$result2 = Test-RegEnt($result, 'REG_SZ', 'Admin')
Write-Output ("Test_A2:" + $result2)        # A1と同じ結果になるかと思いきや、'Admin' になる
0843デフォルトの名無しさん
垢版 |
2023/08/06(日) 22:31:40.76ID:5CExyS7F
先頭3行抜かしましたorz
$result = reg query 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion' /v 'RegisteredOwner'
$cnt = 0
$result | ForEach-Object{ "TEST[$cnt}:" + $_; $cnt++ }
この次に>>842のコード。
0844デフォルトの名無しさん
垢版 |
2023/08/06(日) 22:48:34.72ID:5CExyS7F
んまーなんかこれだとうまく行ったけんども思ってたのと違う……
function Test-RegEnt($exp_type, $exp_value) {
$Input | Select-Object -Index 2
}
$result = reg query 'HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion' /v 'RegisteredOwner'
$cnt = 0
$result | ForEach-Object{ "TEST[$cnt}:" + $_; $cnt++ }
Write-Output ("Test_A1:" + ($result | Select-Object -Index 2))
$result2 = ($result | Test-RegEnt('REG_SZ', 'Admin'))  # パイプラインの結果を引数ではなくパイプで渡す
Write-Output ("Test_A2:" + $result2)

実はパイプラインの結果(オブジェクトの配列)は関数引数に渡せなかったりするので?
つなみにfunctionの引数部分で [array]$reg_query_result としてみてもうまく行かなかった。
0845デフォルトの名無しさん
垢版 |
2023/08/07(月) 03:16:48.48ID:SSXgsNNw
文法が違う。
Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin'
とか
Test-RegEnt $result 'REG_SZ' 'Admin'
とか。
または
function Test-RegEnt {
  Param (
    [Parameter(ValueFromPipeline=$true)]
    [string] $reg_query_result,
    [string] $exp_type,
    [string] $exp_value
  )
  Begin {
    $cnt = 0
  }
  Process {
    $cnt++
    $idx = $cnt - 1
    if ($idx -eq 2) {
      $reg_query_result
      return
    }
  }
}
$result | Test-RegEnt -exp_type 'REG_SZ' -exp_value 'Admin'
0846デフォルトの名無しさん
垢版 |
2023/08/07(月) 06:50:14.57ID:L1yQ0BJe
>>845
レス㌧クス
$Input利用(>>844)とBegin { } Process { }利用の違いはわかりた
$resultが数億オブジェクトだったりしたら後者の方がパイプラインがスムーズに流れてよさげ(未検証

一方、
>実はパイプラインの結果(オブジェクトの配列)は関数引数に渡せなかったりするので?(>>844)
については関数の呼び出し箇所が
 $result | Test-RegEnt -exp_type 'REG_SZ' -exp_value 'Admin' # (1) OK
 Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin' # (2) NG (エラー)
やったから、これは「パイプラインの結果は関数引数には渡せない」((1)のように書くしかない)ということでFA?
0849デフォルトの名無しさん
垢版 |
2023/08/07(月) 07:04:28.71ID:FZVMVghc
>>842
> $result2 = Test-RegEnt($result, 'REG_SZ', 'Admin')

$result2 = Test-RegEnt $result 'REG_SZ' 'Admin'
でやりたいことはできるのではないでしょうか
0850デフォルトの名無しさん
垢版 |
2023/08/07(月) 22:40:57.49ID:SSXgsNNw
パイプラインと引数のどちらでも動くようにしたいなら
function Test-RegEnt {
  Param (
    [Parameter(ValueFromPipeline=$true)]
    [string[]] $reg_query_result,
    [string] $exp_type,
    [string] $exp_value
  )
  Begin {
    $cnt = 0
  }
  Process {
    foreach ($item in $reg_query_result) {
      $cnt++
      $idx = $cnt - 1
      if ($idx -eq 2) {
        $item
        break
      }
    }
  }
}

あくまでシンプルめのサンプルなんでSelect-Object -Index 2と全く同じ挙動とか期待しないように。
※作りこむならパイプが繋がってるのかチェックして分岐の処理書いたりする。

なお、大量のデータをパイプラインに流すのはお勧めできない。
パイプラインは途中での打ち切りとか難しいし、
結局は普通にループ処理書いた方が速いし制御しやすいし分かりやすい事が多い気がする。
0851デフォルトの名無しさん
垢版 |
2023/08/10(木) 07:01:52.35ID:3iQsMBl9
レス㌧クス、しかしながら大量データを引数で関数に渡すのはメモリ消費量、応答速度ともに悪くなることがわかったからやめるわサーセン;;;
どういうことかというと、bigfile.txtが(1行何か書いたいた後 Ctrl+A Ctrl+V Ctrl+V を22回反復とかで作った)
4194305行の巨大なテキストファイルだったとして、
  function Test-FileContent([string[]] $lines) { $cnt = 0; foreach ($line in $lines) { $cnt++; Write-Host "cnt=" $cnt } }
  $lines = Get-Content .\bigfile.txt # (1)
  Test-FileContent($lines) # Get-Content完了後の結果を引数で渡す
とするとお、「cnt= 1」が表示される前に(1)で永劫の時間待たされるますが、
  function Test-FileContent() { $cnt = 0; foreach ($line in $Input) { $cnt++; Write-Host "cnt=" $cnt } }
  Get-Content .\bigfile.txt | Test-FileContent  # Get-Contentが読んだら即パイプで渡す
とすると*即座に*「cnt= 1」以降のカウントが始まる
0852デフォルトの名無しさん
垢版 |
2023/08/10(木) 07:07:45.76ID:3iQsMBl9
つなみに
>$resultが数億オブジェクトだったりしたら後者の方がパイプラインがスムーズに流れてよさげ(>>846)
も検証すた、
>>846のレスポンスが即時のコードと似通っているが関数内でBEGIN { } PROCESS { }でなく$Inputをforeachループで回した場合、
すわなち
  function Test-FileContent() { $cnt = 0; foreach ($line in $Input) { $cnt++; Write-Host "cnt=" $cnt } }
  Get-Content .\bigfile.txt | Test-FileContent
とすると、、「cnt= 1」が表示される前に永劫の時間待たされる、、、

というわけで、パイプライン(の後段まで)に大量のデータを無駄に流すなというのは真やが
生じてしまった大量のデータはむしろパイプラインにしか流さないのが正義……
0853デフォルトの名無しさん
垢版 |
2023/08/10(木) 07:10:57.08ID:3iQsMBl9
>>851の肝心のところに誤記が合ったスマンヌorz
*即座に*「cnt= 1」以降のカウントが始まるコードは正しくはこれ↓
  function Test-FileContent() { BEGIN { $cnt = 0 } PROCESS { $cnt++; Write-Host "cnt=" $cnt } }
  Get-Content .\bigfile.txt | Test-FileContent
0854デフォルトの名無しさん
垢版 |
2023/08/11(金) 18:46:06.42ID:I7dwFhkG
パイプの利点は個数を意識しなくて済むことだけど中断が一切できないしデメリットの方が多い
よっぽどの事情でもない限りコマンドレット自作しても遅いだけで良い事なんて1つもない
公式のselect -firstなんかはパイプの流儀に従ってないから似た事をしようとしてもあれ?って自らの間違いに気付くんだよ
powershellの深遠を覗くとそのいい加減さにガッカリするだけ
0859デフォルトの名無しさん
垢版 |
2023/08/11(金) 20:07:52.72ID:PQblbJTG
一番良いのは、Windowsを使わない
これにかぎる
こんなクソなOSを世界中から捨てるべき
0861デフォルトの名無しさん
垢版 |
2023/08/11(金) 20:27:11.32ID:SL3m3m5F
メモリ効率とスループットは交換できるようなものではない
手軽さが不要ならPythonでも使っておけばいい
0863デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:05:41.72ID:FP8PIUGD
>>842の質問に戻るのですだが、動かなかったのは単純だが根本的な誤解してたのが原因……
C/C++と同じだろうというつもりで
>$result2 = Test-RegEnt($result, 'REG_SZ', 'Admin')
という呼び出し方に書いたが、これだと「Test-RegEntの第一引数$reg_query_resultに「配列」@($result, 'REG_SZ', 'Admin')を渡す」という意味になる
ので、関数内で
>$reg_query_result | Select-Object -Index 2
とやったら当然そのindex=2の要素 'Admin' が関数の出力となってた、というしくみ
0864デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:07:08.58ID:FP8PIUGD
正しくは>>845式に
>Test-RegEnt -reg_query_result $result -exp_type 'REG_SZ' -exp_value 'Admin'
またはその省略表記としては
>Test-RegEnt $result 'REG_SZ' 'Admin' # カンマ区切りではなくてスペース区切り
にせねばならなかった
ことがわかったorz
止むにやまれない事情で昨日一日で1500行書いてデバッグしたらその過程でわかった|||。n_
0865デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:11:54.59ID:FP8PIUGD
あと他のスクリプトをincludeするときの欠き方が気づかないとわかりにくい……
util.ps1 を同じフォルダにある someapp.ps1 からインクルードする場合は
'.\util.ps1'
ではダメで、
.'.\util.ps1'
にしないとutil.ps1で定義した何物も呼び出せないorz
ここで先頭の「.」はutil.ps1のスクリプトスコープを呼び出し元のスコープと同じにするという意味やがちょう紛らわしい……
0866デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:20:54.21ID:FP8PIUGD
あと関数内においては代入文、[void]にキャストした文、if文とかの条件式 を除く全ての文が出力を持つ、
という仕様のせいで危うく恐ろしいバグを作り込むところやった;;;
function Show-ErrDlg($msg) {
  $wsobj = new-object -comobject wscript.shell
  $wsobj.popup($msg, 0, 'エラー', 0 -bor 16)
}
function Test-Equipment1() {
  $result = (何かのテスト)
  if (!$result) { Show-ErrDlg('何かのテスト failed.') }
  return $result
}
でとするとテストが失敗したときも
0867デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:25:27.54ID:FP8PIUGD
  if (!(Test-Equipment1) { exit 1 }
  (テスト正常終了の表示処理)
でテスト正常終了の表示が出るorz

これは何でかというと$wsobj.popup($msg, 0, 'エラー', 0 -bor 16) 」がクリックされたボタンの番号を出力する結果、$resultがまたしても配列
 @( (「なんかのテスト」の結果), ($wsobj.popup()でクリックされたボタンの番号) )
となりこれが Test-Equipment1() の戻り値となり、それをif文で評価したら最後の要素
0868デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:27:54.43ID:FP8PIUGD
(OKボタンのコード6)と評価されるため、!6なので常に偽になるというしくみ、、、、
こう修正すたら直った
function Show-ErrDlg($msg) {
  $wsobj = new-object -comobject wscript.shell
  [void] $wsobj.popup($msg, 0, 'エラー', 0 -bor 16) # [void]付ける
}

わかるかこんなもん……
および原理的にlint的な機械的チェックもできない…… 
0869デフォルトの名無しさん
垢版 |
2023/08/11(金) 23:35:32.35ID:FP8PIUGD
これはデフォルトで出力無しとして、
なんかの接頭辞を付けた文だけが結果がパイプに出力されるるようにする仕様であるべきだった希ガス
(出力が無いというミスはすぐ気づける
てかWrite-Outputを省略可能としているのがそもその誤り……
※ 個人の感想です

いっぱい連投したがTeamsのつもりでShift+Enterしたら投稿されてしまったせいやスマンヌorz
いじょ
0870デフォルトの名無しさん 転載ダメ
垢版 |
2023/08/12(土) 00:58:59.52ID:H+b+A9qi
============================
function Hoge([int]$num) {
echo "Debug"
return ($num + 1)
}

$a = Hoge(1)
echo $a
============================
こうすると $a には Debug と 2 の2つが入る

============================
function Hoge([int]$num) {
.{
echo "Debug"
} | Out-Null
return ($num + 1)
}

$a = Hoge(1)
echo $a
============================
こうすると $a には 2 の1つしか入らない
不要なところは 「 .{ ~~~ } | Out-Null 」で表示を抑制したら楽になるかも
0871デフォルトの名無しさん
垢版 |
2023/08/12(土) 01:19:17.04ID:DbL0Mu2X
>>842に言える事はパイプで何番目とかいう考えは捨てた方がいい
パイプは途中で処理を打ち切る機能が欠落してるから何番目だけに用があろうが全ストリームを読み終わるまで終わらない
0872デフォルトの名無しさん
垢版 |
2023/08/12(土) 08:19:31.33ID:IRt4i0hm
ほぼ誤差だが |Out-Null より $null= で処理した方がパフォーマンスがよく、可読性も高い
0874デフォルトの名無しさん
垢版 |
2023/08/12(土) 22:00:12.59ID:pISu+im0
>>871
わかりた
パイプラインの打ち切りは、実現方法はあるが円満な解決方法はなさげ(どれもこれもなんかしらのミソがつく

パイプで$n番目、というだけならSelect-Objectしたらv3以降ならn+1番目以降を打ち切ってくれる
  $n = 2
  Get-Content .\bigfile.txt | Select-Object -Index $n | Foreach-Object { Write-Output "cnt=${n}: $_" } # bigfile.txtが1億行あっても瞬時に戻って来る
が、これは「Select-Object -Index ~」部分を関数化したら元の木阿弥になる
  function Select-Nth($n) { $Input | Select-Object -Index $n | Foreach-Object { Write-Output "cnt=${n}: $_" } }
  Get-Content .\bigfile.txt | Select-Nth(2) # bigfile.txtを1億行全部読み込んでからおもむろに出力する
構文的に$_を使った関数やフィルタとしては書けない

データを見て条件が成立したら打ち切り、というのになるともっとマンドクセ……
https://winscript.jp/powershell/308
0875デフォルトの名無しさん
垢版 |
2023/08/12(土) 22:23:22.94ID:pISu+im0
>>870
それな!
ワカル
㌧クス、

>>872
わかりた
function Hoge([int]$num) {
[void].{
echo "Debug"
}
return ($num + 1)
}
$a = Hoge(1)
echo $a
でも逝けた
0876デフォルトの名無しさん
垢版 |
2023/08/12(土) 22:55:15.75ID:zGmVrirz
関数の出力が意図せず(うっかり)複数個所から行われ分かりにくい点は
バッチとかシェルスクリプトの挙動に合わせすぎた為だろうね。

例えばping.exeを対象2か所に実行するバッチ(.bat)をパイプで繋げたら、
バッチ1つの実行で、ping2回の20行程度がパイプに流れる。

PowerShellスクリプトや関数もこれと同じだと考えればそんな違和感ないはずなんだけど、
元々他の言語なんかで「関数の戻り値は1つ(明示的な1つor関数末尾の1つ)」とか
「明示的に変数格納や出力などしなければ、メソッドや関数の戻り値は捨てられる」
って事に慣れてるし、PowerShellも同じ文法だから同じ挙動を期待しちゃう。

上でも出てるけど、標準ではパイプに流さない仕様とした方が
敬遠される点が減ったと思う。
0877デフォルトの名無しさん
垢版 |
2023/08/14(月) 13:31:51.80ID:4NX3l0Vm
パイプはスレ違いのバッチスレでドヤ顔ワンライナーするぐらいしか能が無いと言っても過言
0879デフォルトの名無しさん
垢版 |
2023/08/15(火) 05:53:15.07ID:WIzBRZyi
バッチファイルのパイプはメカニズムが違う
あれは実質一時ファイルを作って次段に渡しているだけなので遅い、と言おうと思ったが
"*<CR><LF>" を2^23個書き並べたbigfile.txtに対してコマンドプロンプトで
  type bigfile.txt | find /C "*"
とやったら「瞬時に」
  4194304
と返って来るのに、PowerShellで
  Get-Content .\bigfile.txt | find.exe /C "*"
とやったら永劫の時間待たされた後
  FIND: パラメーターの書式が違います
と言われた後Ctrl+Cにも応答しなくなた……どうなってるのこれ……
0880デフォルトの名無しさん
垢版 |
2023/08/15(火) 14:11:57.72ID:e55ZiwZ3
そりゃパイプで外部コマンドに送ったら1行ずつfind.exe実行して終了するだろうから
おかしなことにもなるだろうよ
0881デフォルトの名無しさん
垢版 |
2023/08/15(火) 15:18:16.71ID:qi/dYdNU
> あれは実質一時ファイルを作って次段に渡しているだけなので遅い

それはシングルタスクだったDOS時代の話だろ
NTのcmd.exeには当てはまらない
0882デフォルトの名無しさん
垢版 |
2023/08/15(火) 15:39:41.88ID:LS4gbGEC
cmd.exeはパイプやfor /Fのコマンドとかワーカースレッドを生成して
別タスク(子環境)としてデータの送り手や受け手を作ってるかな
0883デフォルトの名無しさん
垢版 |
2023/08/24(木) 22:36:16.57ID:W+JHQ2GG
Get-WinEventでSystem.evtxだかのファイルを処理させるとコマンドレットが終了しても一定時間プロセスがファイル掴みっぱなしになるのどうにかしてくれ
わざわざ別プロセスでGet-WinEvent用のpowershell起動させる間抜けなコードになったぞ
0884デフォルトの名無しさん
垢版 |
2023/08/25(金) 11:28:27.28ID:WAOpDjEy
処理速度都合なのかな〜って思ってるけど閉じる手段は提供して欲しい。

自分は.NETのクラス使って処理書いちゃった。
0885デフォルトの名無しさん
垢版 |
2023/09/04(月) 19:42:45.42ID:hSX1x29k
エクスプローラでファイル選択してコピーして

(Get-ClipBoard -Format FileDropList).GetType().ToString()
→ System.Collections.Generic.List`1[System.Management.Automation.PSObject]
うん。

Get-ClipBoard -Format FileDropList | %{$_.GetType().ToString()}
→ System.Collections.Generic.List`1[System.Management.Automation.PSObject]
うn?

foreach( $info in Get-ClipBoard -Format FileDropList ){ $info.GetType().ToString() }
→ System.Collections.Generic.List`1[System.Management.Automation.PSObject]
えぇ…

Get-ClipBoard -Format FileDropList | %{$_} | %{$_.GetType().ToString()}
→ System.IO.FileInfo


[System.IO.FileInfo[]](Get-ClipBoard -Format FileDropList) | %{$_.GetType().ToString()}
→ System.IO.FileInfo
うーん…

$list = Get-ClipBoard -Format FileDropList
$list | %{$_.GetType().ToString()}
→ System.IO.FileInfo
まぁ…

なんか不必要に使いづらい気がするのは自分だけかな。
0886デフォルトの名無しさん
垢版 |
2023/09/06(水) 19:07:34.39ID:1kNnDW8h
$(Get-ClipBoard -Format FileDropList) | %{$_.GetType().ToString()}
→ System.IO.FileInfo
バッドノウハウの領域だなー
0887デフォルトの名無しさん
垢版 |
2023/09/12(火) 10:37:58.96ID:EIIMdpOe
隠し属性が設定されたファイルが排他されてるとかで読めない状況のときに
-ForceついたGet-Contentで読もうとすると隠し属性解除されるのは理由あるんだろうか
0888デフォルトの名無しさん
垢版 |
2023/09/12(火) 13:50:19.66ID:KE5ufRbn
質問で申し訳ない
AccessでエクスポートしたxlsxをPowershellでComObjectを作成してOpenしたいんだけど
破損している云々で発行元を信用しますか?ってダイアログのせいでOpen出来ない

https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbooks.open
ここによると15個目の引数で1を指定(xlRepairFile)すれば良さそうなんだけど
Powershellで実行するとOpenプロパティが無いよって怒られる。

実際のコードはこう
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $True
$fileName = (Get-ChildItem "test.xlsx").FullName
$book = $excel.Workbooks.Open($fileName, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, [System.Type]::Missing, 1)
0890デフォルトの名無しさん
垢版 |
2023/09/12(火) 17:47:39.83ID:EIIMdpOe
とりあえずこうすると回避できた。

using namespace Microsoft.Office.Interop.Excel

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $True
$fileName = (Get-ChildItem "test.xlsx").FullName

$param = @([Type]::Missing) * 15
$param[0] = $fileName
$param[14] = [XlCorruptLoad]::xlRepairFile
$workbooks = $excel.Workbooks
$book = $workbooks.Open.Invoke($param)
0897デフォルトの名無しさん
垢版 |
2023/09/16(土) 23:53:08.17ID:DkE7QlfD
PowershellのGUI使って簡単な時報を作りたい。
System.Windows.Forms.Timerを使って作ったんだが今何時判定で$Aの数字が毎回リセットされるんでIntervalの回数だけ別ウィンドウが開きまくる。
使い方間違ってるか?教えてくれさい。

$timerTestTick {
【適当に現在時表示】
  if(【指定した時間になったら】-and【$Aがtrueなら】){
  start-prosess 【音楽ファイルを別ウィンドウで再生して処理継続】
  $A = false
}
}
$timerTest.Add_Tick($timerTestTick)
$timerTest.Interval = 200
$timerTest.Enabled = $TRUE
$timerTest.Start()

【適当にフォーム作って表示】
0898デフォルトの名無しさん
垢版 |
2023/09/17(日) 01:59:03.31ID:ENG0J7cr
>$Aの数字が毎回リセットされるんで
それ$Aを更新しようとする度に毎回スクリプトブロックで別の$Aが生成されるからやね
([ref]$A).Value = $false
と書けば元の$Aを探しにいくから更新できると思う
Powershellのはまりポイントの1つやね
0900デフォルトの名無しさん
垢版 |
2023/09/17(日) 05:45:06.34ID:5It5oWIy
>>898
スクリプトブロックていうのが働いてるのか。とりあえず試してみるありがとう。

>>899
宗教的理由というより書けないから出来ることで色々やってみてた。
というかPowerShell単体でC#つかえるの?
0901デフォルトの名無しさん
垢版 |
2023/09/17(日) 09:35:27.80ID:LYUgOkBe
PowerShellでGUI作れるんか! 
知らんかった これは興味ある
0903デフォルトの名無しさん
垢版 |
2023/09/17(日) 13:31:47.95ID:LJFSWd1b
GUI作れるとかマジか
ワザワザHTMLソース内部に仕込んでWEBベースでやりとりしてた俺は一体・・・
0904デフォルトの名無しさん
垢版 |
2023/09/17(日) 14:04:19.59ID:ENG0J7cr
一応.NET言語の1つではあるからGUIは普通に作れるが
俺はC#コード埋め込んでFuncやAction経由で必要時にpowershellと連携する感じの使い方だな
Powershellのコードだけで作るの自体が割と面倒なのや型チェックが働かない辺りとかかあんまメリットを感じない
0905デフォルトの名無しさん
垢版 |
2023/09/26(火) 21:32:36.63ID:cR6Dxv5m
htaの代わりとしてforms呼び出して組んでたけどcssが便利すぎて最近は使ってないな...
wpfはどうなんだろうか...
0907デフォルトの名無しさん
垢版 |
2023/10/06(金) 21:47:54.00ID:ESX4xHYZ
日付を元に指定範囲内の一意の数字を出すってできる?
200ぐらいある今日の一言的なものを毎日ランダムで出したいんだがアプリケーションを再起動すると変数リセットされて別の単語出てしまうのを抑止したい。
0908デフォルトの名無しさん
垢版 |
2023/10/06(金) 22:00:29.66ID:7j+1PDTD
その日の初回の結果をファイルに出力して
2回目以降はそのファイルを読み込みに行けば良いのでは
0909デフォルトの名無しさん
垢版 |
2023/10/06(金) 22:04:29.98ID:ESX4xHYZ
>>908
それしかないかなぁ
ファイル出力を避けたかったんだが
0910デフォルトの名無しさん
垢版 |
2023/10/06(金) 22:35:50.48ID:ESX4xHYZ
>>908
できそうだからファイル出力の方向でやってみるありがとう。
0911デフォルトの名無しさん
垢版 |
2023/10/06(金) 22:36:00.82ID:ESX4xHYZ
>>908
できそうだからファイル出力の方向でやってみるありがとう。
0912デフォルトの名無しさん
垢版 |
2023/10/06(金) 23:26:20.49ID:WmRjQTiM
その条件なら日付をシード値とみなせるんだから
別の単語が出てくる方がおかしいんじゃないのか
基礎的な論理思考力が欠けているね
0913デフォルトの名無しさん
垢版 |
2023/10/06(金) 23:44:27.78ID:7j+1PDTD
あ、-SetSeedって完全固定の疑似乱数なのか。
再起動したら変わると思ってた。
0917デフォルトの名無しさん
垢版 |
2023/10/08(日) 20:27:09.33ID:bO8eXdHU
>>905
wpfも普通にいけるけど、vsのデザイナーがないと厳しいから、じゃあc#でいいかとなりがち

htaの代替としたらwpfかwinformで枠だけ作ってwebview2埋め込むのがおすすめ

qiitaでも記事があったはず
0919デフォルトの名無しさん
垢版 |
2023/10/20(金) 16:26:02.69ID:3co0KDj6
こんにちは
フォルダの配下のすべてのテキストファイルを結合した文字列を出力したいです
フォルダ直下のファイルだけなら

Get-Content *.txt

でできました
該当するファイルの一覧は

Get-ChildItem -Recurse -Filter "*.txt" -Name

でできましたが

Get-ChildItem -Recurse -Filter "*.txt" -Name | Get-Content

としてもエラーになります
0924デフォルトの名無しさん
垢版 |
2023/10/31(火) 16:59:01.62ID:sGPoKgPO
この言語って3次元以上の配列って出来ないって認識であってる?
二次元は
$array[0,0]で良いんだよね?
三次元というかジャグ配列?はとりあえず使えるから
$array[0][0,0]
でやってるんだけど中の2,3次元目とか中の要素数カウントが出来なくて結構困ってる
0925デフォルトの名無しさん
垢版 |
2023/10/31(火) 18:05:21.98ID:BgNWqm6B
ジャグ配列で良いんだったら$array[0][0][0]…といくらでも入れ子にすれば良かろうに
0926デフォルトの名無しさん
垢版 |
2023/10/31(火) 19:44:43.60ID:CQ6pveQE
多次元配列はこうじゃない?
$array = [Object[,,]]::new(4,5,6) # 3次元、4×5×6
$array[0,0,0] = "(0, 0, 0)"
$array[0,0,1] = "(0, 0, 1)"

# 参照は「$arraya[0,0,0]」だと配列スライスと間違えそうだから「$array.Get(0,0,0)」の方が安全かも。
0928デフォルトの名無しさん
垢版 |
2023/10/31(火) 19:54:44.51ID:sGPoKgPO
あぁそっか普通に出来るのか初期化の仕方が悪かったみたい
普通の初期化でも3次元出来るんだね
調べたらジャグ配列のが処理早いそうなので結局そっち採用すると思う
レスしてくれた方有難う
0931デフォルトの名無しさん
垢版 |
2023/11/11(土) 09:43:40.20ID:FLa2E6qS
Ideally に進んで今月中の GA に期待

ところで [console]::OutputEncoding って shift_jis と utf-8 のどっちにしてます?
0932デフォルトの名無しさん
垢版 |
2023/11/11(土) 16:23:53.35ID:CPZqzXvF
7入れて何かいい事あんの?
それ、OS標準の5.1でできますよね?
もしかして、デベロッパーのオナニーに付き合わされていませんか?
0933デフォルトの名無しさん
垢版 |
2023/11/12(日) 04:03:18.80ID:jdIWedpQ
powershellでデフォルトの環境に手を加えないとできないことは他のPG言語に任せるべきだと思う
0934デフォルトの名無しさん
垢版 |
2023/11/12(日) 12:28:59.88ID:mJhoQ9VQ
Windows PowerShell 5.1 と PowerShell 7.x の相違点
ttps://learn.microsoft.com/ja-jp/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.3

入れる入れないは個人の自由
5と7は共存できるし別にデメリットないから7入れてるよ
0935デフォルトの名無しさん
垢版 |
2023/11/12(日) 16:32:02.61ID:K6g/AyoW
スクリプト言語としてならどっちでもいいけど
インタラクティブなコマンドラインシェルとしてなら7が圧倒的に便利
sjis出力コマンドとutf-8出力コマンドの混在環境なら7.4でさらに便利
0939デフォルトの名無しさん
垢版 |
2023/11/15(水) 23:40:29.80ID:Ik7Afwvr
aに1代入したいんですがどうすればいいですか?

function hoge(){
[int]$a;
function moge(){
$this.a = 1;
}
moge;
return $a;
}

hoge #
0940デフォルトの名無しさん
垢版 |
2023/11/16(木) 09:22:30.17ID:HndTNurg
・classのメソッドとして書く(何か知らんがレキシカルスコープになる)
・javascriptを使う
0942デフォルトの名無しさん
垢版 |
2023/11/16(木) 12:06:19.94ID:HndTNurg
ref[]はpowerahellにおいてCポインタ程度には重要知識なのに
界隈で然程語られる事もなく知られていない
知られてはいけないとでも言うのだろうか…
0944デフォルトの名無しさん
垢版 |
2023/11/16(木) 13:38:46.26ID:WvJyjQhC
>>940
とあるオブジェクトの初期設定にこんな感じで書いてたんですが無理そうですか
了解しました
class hoge:object{
[object]$o_a;
[object]$o_b;
hoge (){
[int] $cnt;
function object_a_init(){
$this.cnt = 1;
}
object_a_init;
}
}
0947デフォルトの名無しさん
垢版 |
2023/11/16(木) 17:15:32.66ID:JFk7nC9m
横からすいません
なんでこれはエラーになるんでしょうか
pwsh -nop -c "[System.Text.Encoding]::GetEncoding(932)"

-c を使わずに pwsh -nop と起動して
[System.Text.Encoding]::GetEncoding(932)
を入れると動くのもわからない・・・
0949デフォルトの名無しさん
垢版 |
2023/11/16(木) 20:12:17.64ID:JFk7nC9m
MethodInvocationException: Exception calling "GetEncoding" with "1" argument(s): "No data is available for encoding 932. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method."

だそうです
0951デフォルトの名無しさん
垢版 |
2023/11/16(木) 22:05:45.00ID:wYK3pDi3
>>939を動くように直したげたよ
function hoge(){
[int]$a = "1" # $aを値で初期化しつつ型を強制。型宣言というよりキャストに相当。[int]に強制されるので値が文字列でも$aにはSystem.Int32に変換された値が入る
$a.GetType() | Write-Host # $aの値の型をコンソールに出力 System.Int32
function moge(){
([ref]$a).Value = 1 # >>941-942の言うブロックで変数を生成せず既存の変数を参照して値を代入する記法
}
moge
$a # 関数の打ち切りの意図を除きreturnキーワード不要。powershellのfuncitonは最後に限らず値を返す式は全部返そうとする
}
hoge
0954デフォルトの名無しさん
垢版 |
2023/11/17(金) 20:30:46.86ID:Wtzmq/3L
リンク先読んでないけど、.exeにパイプしたときに早くなる(普通になる)のかな
0955デフォルトの名無しさん
垢版 |
2023/11/20(月) 14:11:07.62ID:HI5+Omcp
文字列を8文字ごとに分割して配列に格納したいのですが
文字列が8文字以下だと1文字ずつ分割されてしまいます。

$nums = @()
$nums = $num -split '(.{1,8})' | Where-Object{$_}

上記を実行すると、
$num = 12345678 のとき、$num[0] は 1が格納されるのですが、
12345678が格納されるようにするには、どうすればよいでしょうか。
0956デフォルトの名無しさん
垢版 |
2023/11/20(月) 14:50:35.31ID:HI5+Omcp
>>955
すみません。誤字です。

誤: $num[0] は 1が格納されるのですが、
正: $nums[0] は 1が格納されるのですが、
0957デフォルトの名無しさん
垢版 |
2023/11/20(月) 15:52:48.41ID:fHSnLnjq
$numsには文字列の"12345678"が代入されてるから
$nums[0]だと"12345678"の1文字目の1が返る

1行目を [string[]]$nums = @() とするか
2行目を $nums = @(12345678 -split '(.{1,8})' | Where-Object{$_}) とすればOK
0958デフォルトの名無しさん
垢版 |
2023/11/20(月) 17:23:25.47ID:HI5+Omcp
>>0957

ありがとうございます!
できました。
0959デフォルトの名無しさん
垢版 |
2023/11/21(火) 21:09:20.96ID:qJoihvDX
PowerShell 7.4 だと

PS> python -c 'print("\\")'
\

と期待通りになるけど Windows PowerShell 5.1 だと

PS> python -c 'print("\\")'
 File "<string>", line 1
  print(\)
      ^
SyntaxError: unexpected character after line continuation character

となるのは何が起きてるの?
7.4 でも $PSNativeCommandArgumentPassing を Legacy にすると同じみたいだけど
具体的にどうなってるのか今更だけど知っておきたい
0962デフォルトの名無しさん
垢版 |
2023/11/21(火) 22:57:00.47ID:wGZJ97Pn
コマンドラインのパース内容をデバッグできるコマンドレットがあって
inactionで紹介されてた気がするけど何か思い出せない
0963デフォルトの名無しさん
垢版 |
2023/11/22(水) 00:52:11.84ID:z2bY/yQG
$PSVersionTable
PSVersion 5.1

Ruby の1-liner では、%Q 記法があるから大丈夫

ruby -e 'print %Q(\\)'
\

ruby -e 'print %Q(あaい)'
あaい
0964デフォルトの名無しさん
垢版 |
2023/11/22(水) 04:23:14.63ID:nZzIGDLb
>>962
Get-Command | sls "breakpoint|callstack"

デバッガーについて - PowerShell | Microsoft Learn
ttps://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_debuggers?view=powershell-5.1
0965デフォルトの名無しさん
垢版 |
2023/11/22(水) 10:26:54.20ID:Yh77KGhz
>>964
回答ありがとう、でも思い出せないのは>>959の流れからの「コマンドラインのパース」自体の事だったんだ。

in Action引っ張り出して確認したが↓の事で、これで違いが分かるかも。(v7.4で確認してない。)
Trace-Command -Option All NativeCommandParameterBinder -PSHost {python -c 'print("\\")'}
0967デフォルトの名無しさん
垢版 |
2023/11/22(水) 14:18:25.39ID:W8vcuvaF
PowerShell 7.4 だと python -c 'print("\\")' ですむことを
Windows PowerShell 5.1 だとどう書けばいいんだ
--% を使っても使わなくても分からん
0971デフォルトの名無しさん
垢版 |
2023/11/22(水) 20:54:48.61ID:5rDf7evN
pythonの引用符はシングルもダブルもエスケープシーケンス展開されるからおかしな解釈になってるだけだな
pythonの仕様を呪うがいい
0972デフォルトの名無しさん
垢版 |
2023/11/22(水) 22:06:38.07ID:W8vcuvaF
pythonは例として使っただけだしどうでもいいよ
あくまで興味の対象はPowerShellのコマンドラインのパース
やっぱ 7.4 すげぇで終わってもいいんだけど

なんか 7.4 の --% が腐ってる気がする
5.1 の想定通りの --% と違って勝手に引用符加えてぶっ壊してる感じ
はやいとこ直して欲しい
0974デフォルトの名無しさん
垢版 |
2023/11/23(木) 17:39:38.00ID:Rimm12ii
いやわかんないなら別にいいけど一応書いとくわ
もちろん 7.4 を Windows で使う話

stop-parsing token (--%) は以後のパースをしないはずなのに
引用符無視して空白で引数を分割してコマンド起動してるっぽい
CreateProcessまでに引用符が変に補完されるから意図通り動かない

--% が出てきたら引数の分割はネイティブコマンドに任せないとあかん
$PSNativeCommandArgumentPassing が Legacy の時と同じ処理な

そういうわけで Legacy 扱いされる .cmd とかでは問題ない
おかしいのは Standard 扱いされる .exe なんかの場合だけ

PSNativeCommandArgumentPassing の説明
>この実験的な機能が有効になっていると、PowerShell は、ネイティブの実行可能
>ファイルを呼び出すときに、文字列を再構築する現在の機構ではなく、
>StartProcessInfo オブジェクトの ArgumentList プロパティを使用します。

にある、文字列を再構築するのが Legacy、Argumentlist を使うのが Standard
という違いがわかれば理解できる話なんだが期待はしてない
0975デフォルトの名無しさん
垢版 |
2023/11/23(木) 22:03:41.74ID:KHOftQWe
Powershellを体系的に学ぶにあたっておすすめの本ってありますか?
やりたいことをググってコードをコピペして使用してる状態で、コードの理解度が深まらないと思ったので体系的に学びたいと思いました。
自分のPowershellの用途は、日常的な作業の自動化(テキストファイルの読み書き、ファイルの起動やタスキル、アクティブウィンドウの切り替え、robocopyでのバックアップなど)で使っています。
0977デフォルトの名無しさん
垢版 |
2023/11/23(木) 23:00:45.15ID:09UkZirn
Windows PowerShell in Action Third Editionは読んだかね
https://sd.blackball.lv/library/Windows_PowerShell_in_Action_3rd_Edition_(2017).pdf
ただしこの本は6年前の情報。英語PDFだけど今は色々と翻訳手段もあるから読めると思う
powershellならWindows上の事であれば大抵の事はできるけど
本当に便利に使うならC#や.NETの前提知識があった方がいいだろうね
C#関連で可能な事ならほぼpowershellに置き換え可能だから
0978デフォルトの名無しさん
垢版 |
2023/11/24(金) 00:12:01.77ID:kL+9jaCp
Powershell で複雑なものは書けないから結局、Ruby になる。
WSL2, Linux側からなら、Windows側をいじれるし
0980デフォルトの名無しさん
垢版 |
2023/11/24(金) 05:42:11.56ID:IciYTcVm
>>975
コードをコピーしてchatGPTかPerplexityで「PowerShellで"〜〜〜"はどういう意味?」を聞けばいい
0981デフォルトの名無しさん
垢版 |
2023/11/24(金) 13:14:03.37ID:4NGqTzL9
>>975
「PowerShell実践ガイドブック」は、PowerShellの動作の仕組みが詳しく解説されていてよかった
謎に思える挙動についても説明がある
ちょっと古いが(5年半前に出版)
0982デフォルトの名無しさん
垢版 |
2023/11/25(土) 12:02:22.73ID:pLnatqec
microsoft learn じゃダメなの?
ttps://learn.microsoft.com/ja-jp/powershell/scripting/how-to-use-docs?view=powershell-7.4
ttps://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about?view=powershell-7.4
0985デフォルトの名無しさん
垢版 |
2023/11/25(土) 18:53:18.66ID:Q+kYJTm7
975です。おすすめのドキュメント教えてくれた方ありがとうございます。
一つ気になったのですが、学習の順番としてはC#もしくは.NETから入ったほうが効率的ですか?
自分がPowershell始めたきっかけがグローバルホットキーをうまく使いたいというのが始まりで、
後述URLのコードをベースに継ぎ足しで書き加えている状態です。

PowerShellとC#でグローバルホットキーを登録する
https://qiita.com/minr/items/72b02d673727f9eb4c37

※自分のC#のレベルはHelloWorld出したぐらいまで、.NETについても知識としてほぼ白紙です。
0987デフォルトの名無しさん
垢版 |
2023/11/25(土) 21:21:00.31ID:2+5b9joX
ダブルクリックで実行できたWSHはLOVELETTERワームやら何やらでセキュリティが低いとみなされて非推奨になりましたとさ
めでたしめでたし
0988デフォルトの名無しさん
垢版 |
2023/11/26(日) 00:07:05.46ID:tHVdGucZ
例えば、デスクトップにショートカットを作って、リンク先を以下のようにすると、
ダブルクリックでPowershell を起動して、Ruby でスクリプトを実行する

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "ruby C:/Users/Owner/Documents/Ruby/a.rb"

初心者はRuby で始めるべき。
C# はRubyの10倍、時間が掛かるし難しい
0990デフォルトの名無しさん
垢版 |
2023/11/26(日) 07:10:42.58ID:forkl5ep
同じ民族同士、分断せずに仲良くしろよ

DevBlogs - Microsoft Developer Blogs
ttps://devblogs.microsoft.com/
0991デフォルトの名無しさん
垢版 |
2023/11/26(日) 10:47:01.19ID:d/KzVdDP
MatzはWindowsやC++に興味無いから
よほどエゴサでもしないかぎり気の毒なことにはならないわ
知らぬが仏
0994デフォルトの名無しさん
垢版 |
2023/11/26(日) 15:37:23.40ID:tLrTLV3h
というか、Windowsの日本語localizationのデフォルトが未だにクゾだから、
「☑ベータ: ワールドワイド言語サポートを Unicode UTF-8 を使用」
を最初から標準にしていないかぎり、Windowsを日本語で使うこと自体、クソということになる
0995デフォルトの名無しさん
垢版 |
2023/11/29(水) 13:21:53.02ID:FINewHXp
外部コマンドを実行するときに外部コマンド自体は正常な戻り値を返してるのにpowershellで動かすとNativeCommandErrorって例外が出るんだけどなんでだかわかる人おる?
0998デフォルトの名無しさん
垢版 |
2023/11/29(水) 17:02:28.41ID:FINewHXp
>>997
多分それですありがとうございます
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 654日 0時間 45分 29秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はUPLIFT会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《UPLIFT会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
4 USD/mon. から匿名でご購入いただけます。

▼ UPLIFT会員登録はこちら ▼
https://uplift.5ch.net/

▼ UPLIFTログインはこちら ▼
https://uplift.5ch.net/login
レス数が1000を超えています。これ以上書き込みはできません。

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