PowerShell -Part 6at TECH
PowerShell -Part 6 - 暇つぶし2ch1:デフォルトの名無しさん
22/02/13 18:36:12.07 LaQ04ZoE.net
前スレ
PowerShell -Part 5
スレリンク(tech板)
次スレは>>980が立ててね!!

2:デフォルトの名無しさん
22/02/13 19:10:00.19 DaRcZGJS.net
>>1

3:デフォルトの名無しさん
22/02/15 11:59:52.53 5Cl7umfN.net
>>1posh

4:デフォルトの名無しさん
22/02/15 16:10:21.28 8dPt5mlU.net
>>1
BathyScaphe利用開始記念書き込み


5:デフォルトの名無しさん
22/02/17 00:21:49.24 CBYlGRMr.net
今までコマンドプロンプトを使っていましたが、windows power shellに乗り換えました。
コマンドプロンプトでは、エクスプローラーからドラッグ&ドロップでファイルパスが入力できましたが、
windows power shellではできませんでした。
ファイルパスを楽に入力する方法はないんでしょうか

6:デフォルトの名無しさん
22/02/17 09:30:47.39 zynXt0BH.net
普通にできるけど

7:デフォルトの名無しさん
22/02/17 15:17:37.72 1Rki5Xrp.net
ドラッグ&ドロップを扱うのはコンソールの仕事なんじゃ?
conhostで試してみたけどcmd/pwsh/windows powershellどれでもいけた
あんまり設定弄ってないはずだけど、左上クリックして出てくるメニューのプロパティからコピペ関連の項目があるので触ってみては
wtで試すと何れのシェルでもファイルのD&Dは受け付けなかった、異常に高機能なのに意外
wtのことならwtスレで聞くといいかと

8:デフォルトの名無しさん
22/02/17 15:25:50.87 1Rki5Xrp.net
追伸
wtはexplorer上でファイルをコピーしてctrl+[shift+]vでペーストするとファイル名が入力される
D&Dにこだわる理由がないなら慣れた方が早そう、労力は大して変わらないだろう

9:5
22/02/17 19:52:12.95 CBYlGRMr.net
>>6-8
power shellはwindowsボタンを右クリックして起動するやつを使いました。
今試したら、D&Dできないのは「管理者として実行」する方で、通常モードならD&Dできました。
管理者モードかどうかで挙動が変わるんですね・・・。

10:デフォルトの名無しさん
22/02/17 22:56:43.04 urCZGbW+.net
UIPIって仕組みで権限またぎのドラッグアンドドロップは禁止されてるみたいね

11:デフォルトの名無しさん
22/02/19 09:43:41.33 Z9XVFihU.net
wtスレってどこだよ
勝手が違うから戻してほしいしこんなの作る前に非コンソールのpowershell出せよ

12:デフォルトの名無しさん
22/02/19 10:18:51.14 Klz8S7Ad.net
まるでスマホの使い方がわからず店頭でキレて周りに介助してもらおうとするおじいちゃんと同じ言動で草
wtにファイル名をドロップできないのは誤解で、cmdと同じ管理者モード間のOSによるセキュリティ機構のUIPIが原因だった
wtはcmdよりよっぽど癖がない良アプリ
Powershellのほうがよほど癖強い
あとwtは普通に元に戻せる

13:デフォルトの名無しさん
22/02/19 14:02:07.12 x/upE6G9.net
>>10
あれなんでだろうね
打ち直せば入力できちゃうんだしよくわからん

14:デフォルトの名無しさん
22/02/19 15:57:35.72 22rkCkNI.net
>>13
ドラッグアンドドロップという操作が危険だから狙い撃ちで制限されているというわけではなくて、プロセス間のメッセージ通信に対して制約が掛けられた結果ドラッグアンドドロップも使えなくなった

15:デフォルトの名無しさん
22/02/19 16:04:56.07 x/upE6G9.net
>>14
ああなるほど、それなら納得

16:8
22/02/22 02:53:21.18 LHZaRsEg.net
>>14
ああ、conhostをadmin専用にしてて、そこから各シェル立ち上げたと思うわ
俺環でテキトーな検証してごめん

17:デフォルトの名無しさん
22/02/22 08:44:56.08 mFRfNBZm.net
Allow dragging files or folders into Terminal's Command Prompt window to display their path #12377
URLリンク(github.com)

18:デフォルトの名無しさん
22/02/22 20:22:44.35 wkvlg9SU.net
前スレの質問者に本当に必要だったものは、たぶんこういうのだと思うんだ…
class node {
[node]$val;
[node[]]$children;
}

19:デフォルトの名無しさん
22/02/22 20:24:23.06 wkvlg9SU.net
まちがえた→[object]$val
教えたがりおじさん見苦しい

20:デフォルトの名無しさん
22/02/22 21:34:19.39 5aCEOBVD.net
昔csvdeのエクスポートデータをVBSで木構造に変換したりしたけどその時はジャグ配列でなんとかなった
powershellだと配列に色々罠があるから大変そう
コマンドレット化されてるデータ構造を扱う事は得意でもテキストを1から解析して階層データとして扱うのには向かない気がする

21:デフォルトの名無しさん
22/02/22 22:00:01.99 LHZaRsEg.net
木のテキスト表現がカッコや""等ならbalancing groupでパースするのが便利だよ
perl/Pythonよりdotnetのパターン言語の方が強い(丸パクリだから当然だけど)

22:デフォルトの名無しさん
22/02/22 22:10:34.21 LHZaRsEg.net
組み込み型はスプラッターしちゃうとか罠多いから、内部でキッチリ階層持ちたいなら>>18みたいなロートルな手段が堅牢だったり
仕様覚えるという道もあるけど俺は諦めた

23:デフォルトの名無しさん
22/02/22 22:27:40.62 U3xoo538.net
逆説的だけど、.NETに詳しくない俺みたいな人ほどテキスト処理は抑えておくべき
なんか良く分からん物が返ってきても、オブジェクトの印字表現をOut-Fileで捕まえてテキスト処理にフォールバックできる()

24:デフォルトの名無しさん
22/02/22 22:59:38.55 LHZaRsEg.net
-match一発でパースが済まない木の表現は、段落を使って木を表現するyamlみたいなやつ
balancing group+複数行マッチで頑張れるかもしれないけど、地道にインデント数えてるわ

25:デフォルトの名無しさん
22/02/22 23:31:15.02 +zCOrMmD.net
一見不器用でもインデントレベルは素直に数えるのが正解
例えばpythonインタプリタもカウンタを使って構文をパースしてる
yaml系のシリアル化フォーマットは、インデントを数えるだけでパーサが書ける移植性が売り

26:デフォルトの名無しさん
22/02/23 20:35:53.13 KVH3xsak.net
Chromeでもパスワードにメモを付けて保存できるようになるみたいね

27:915
22/02/25 01:33:26.38 wLKzA9jy.net
変数を文字列の中に入れ込んでしまって、消せないフォルダが出来てしまいました
C:\works\+ $a
削除もリネームもフォルダ移動すら出来ません
どうすれば削除出来ますでしょうか?
お知恵を貸してください

28:デフォルトの名無しさん
22/02/25 02:07:17.42 3hSRN4MI.net
ファイル名に$が入って、$aが展開されちゃう的な?ならエスケープすればいいだけでは
`$a
意図を汲めてるかちょっと自信ないけど

29:915
22/02/25 07:49:52.49 wLKzA9jy.net
>>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で作成
細かい所はあまり覚えてませんがこんな感じです

30:デフォルトの名無しさん
22/02/25 08:55:58.66 Ex9z+jLY.net
うちの環境では削除できた
なんかのプロセスにロックされてるんじゃないの?

31:デフォルトの名無しさん
22/02/25 09:22:05.48 Ttq2k6xT.net
エラーメッセージを貼らない奴の相手してもしょうがない

32:915
22/02/25 11:29:32.26 omaqMYjV.net
>>31
これは失礼しました
エラーは下記です。普通の名前のフォルダは削除出来ます
Remove-Item : 引数 '$null' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:1
+ Remove-Item + $a
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

33:915
22/02/25 11:32:06.01 omaqMYjV.net
ちなみにフォルダを右クリックして出てくるプロパティ→セキュリティのタブには
「要求されたセキュリティ権限は利用できないか、または表示されません。」
とのエラーも出てます

34:デフォルトの名無しさん
22/02/25 11:40:38.52 Ttq2k6xT.net
>>32
> ’C:\works\ + $a‘ としてしまった
んなら
Remove-Item ’C:\works\ + $a‘
ってやれよ…

35:915
22/02/25 12:06:55.57 omaqMYjV.net
>>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

36:デフォルトの名無しさん
22/02/25 12:16:43.02 SH4WT7RG.net
コマンドプロンプトを管理者権限で起動
rd /s /q エクスプローラーから対象フォルダをD&D
これで無理なら排他制御キャンセルするソフト使うかPCを一旦再起動

37:デフォルトの名無しさん
22/02/25 12:24:59.94 Ttq2k6xT.net
>>35
> Remove-Item : パス 'C:\works\ + $a '
$a の後ろの空白

38:915
22/02/25 12:30:35.39 omaqMYjV.net
>>36
ありがとう御座います
「指定されたファイルが見つかりません」
と返されました。再起動も状況変わらず
Dirコマンドでは+ $a は表示されておりエクスプローラでも見えてるのですが何故か認識されないです

39:デフォルトの名無しさん
22/02/25 12:36:38.88 yKl3/QUV.net
コマンドで消したいだけならワイルドカードやタブ補完で選択すればいいじゃない
再起動後エクスプローラーから消せないか試したの?
何がしたいのか分からん

40:915
22/02/25 12:42:21.42 omaqMYjV.net
>>37
空白で思い出しました
試行錯誤してて
'"C:\works\' + $a + '\"'
のような事もやってました
なので(なのかどうかも分かりませんが)フォルダの名前には + $a と後ろにも空白が入っています

41:915
22/02/25 12:44:41.55 omaqMYjV.net
>>39
エクスプローラからの削除だと削除後も+ $a フォルダが残り続けます
やりたい事: + $a フォルダを削除したい

42:915
22/02/25 12:48:15.22 omaqMYjV.net
追記正確なフルパス名
[]は半角スペースです
C:\works\[]+[]$a[]

43:デフォルトの名無しさん
22/02/25 12:55:42.52 SH4WT7RG.net
その親フォルダにカレントディレクトリを移動して他に$付くフォルダが無い、或いは削除してしまって良いなら
for /d %a in (*$*) do rd /s /q "%~a"

44:デフォルトの名無しさん
22/02/25 13:03:31.62 SH4WT7RG.net
もし>>43で駄目だったら最後のとこ
"%~sa"
を試してみて

45:デフォルトの名無しさん
22/02/25 13:04:14.85 AEqwOQnl.net
C:\worksごと消せばいい

46:915
22/02/25 13:06:19.04 omaqMYjV.net
>>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→「指定されたファイルが見つかりません」

47:915
22/02/25 13:07:15.53 omaqMYjV.net
上記 $y → $a です
すみません

48:915
22/02/25 13:10:23.66 omaqMYjV.net
>>44
saでも変わらずでした
>>45
>>46の1.1と同じでした

49:デフォルトの名無しさん
22/02/25 13:11:33.74 AEqwOQnl.net
フォルダが消したいだけならPowershell関係ないからこちらでどうぞ
Windows 10 質問スレッド Part82
スレリンク(win板)

50:デフォルトの名無しさん
22/02/25 13:17:48.06 MEIpOner.net
\\?\C:\fogo

51:デフォルトの名無しさん
22/02/25 15:04:10.02 gazry23L.net
>>47
> 上記 $y → $a です
> すみません
だからさあ、入力した内容とエラーメッセージをそのまま貼ってくれよ…

52:デフォルトの名無しさん
22/02/25 20:57:30.79 FVUZxr5Y.net
dir "*a*" などとして対象のフォルダだけ表示されることを確認して
dir "*a*" |

53:デフォルトの名無しさん
22/02/25 20:58:43.73 FVUZxr5Y.net
dir "*a*" | % {remove-item -LiteralPath $_.Name}
でどうだろうか

54:デフォルトの名無しさん
22/02/25 21:06:53.72 zbdaU1gm.net
dir /x
で8.3形式のファイル名があるなら、それで消してみる
だめなら、>>50の形式でフルパスを指定する

55:915
22/02/26 12:47:40.66


56:AL/cEm3C.net



57:915
22/02/26 12:47:51.62 AL/cEm3C.net
>>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
使い方が分からず試せてません

58:デフォルトの名無しさん
22/02/26 13:19:35.91 zbGeAZZp.net
Win10の質問スレ行けって言ったのに何故行かないのかな?
powershellに拘る理由がわからないよ
仕方ないのでこっちで回答するわ
Poweshell関係ないけど
URLリンク(itojisan.xyz)パソコンのトラブル/windows10でフォルダ・ファイルを削除できない/
これ全部試せ

59:デフォルトの名無しさん
22/02/26 13:34:00.21 DA2+bsLA.net
これ本来含まれないはずの+が含まれてるから消さないんでしょ
ディスクエディタかなんかで強制的に消せる名前にリネームするしかないのでは?
(FAT時代にしかやったことないからNTFSでできるかは知らん)
曖昧な記憶のスクリプトを正確に思い出せればなんとかなるやもしれんが
普通の方法では+がファイル名かフォルダ名の一部と解釈されないから消すのは無理だと思う
なかなかコーナーケースのバグ見つけたなw
多分PSでどうこうできる領域じゃない
再インストールが一番早いかもw

60:デフォルトの名無しさん
22/02/26 13:36:55.01 +OtunY2h.net
当てずっぽうで試す前に、まずabout_Quoting_Rulesを読んでくれ
何かおかしい文字が入ってるのかは、[byte[]]にキャストすれば分かるから
それ見て正しくクオートして入力してくれ

61:デフォルトの名無しさん
22/02/26 14:08:05.70 +OtunY2h.net
>>58
+を特別扱いするのはNTFSじゃなくて、特定のコマンドの仕様では?(copy fi+le等)
色んなコマンドが内部で引いてる可能性があるから避けたほうが無難な文字とは思うけど
$もNTFS的には合法だけど、予約名のプレフィックスにする慣習なので、なので避けたほうがいいのは確か
undocumentedなのもいっぱいある

62:デフォルトの名無しさん
22/02/26 14:54:37.65 +OtunY2h.net
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
うーん?

63:デフォルトの名無しさん
22/02/26 15:18:46.03 1IWc50so.net
cmdを起動して
rd "\\.\C:\works\ + $a "

64:デフォルトの名無しさん
22/02/26 15:22:25.68 1IWc50so.net
ダメなら引用符ありなしと、//./ と //?/ を変化させて試してみて

65:デフォルトの名無しさん
22/02/26 15:46:10.03 EUVpr27z.net
検証した
cmdを起動して rd "\\?\C:\works\ + $a " が正解だった
このやり方はPowershell経由では消えない
末尾スペースが再現できなかったから md "\\?\C:\works\ + $a " で作った

66:915
22/02/26 16:01:12.94 AL/cEm3C.net
>>62
>>64
消えました!!凄い!!!
ご教示頂きました皆さん本当にありがとうございます!

67:915
22/02/26 16:04:31.69 AL/cEm3C.net
因みに rd “\\?\〜“ってどんな意味でしょうか?

68:デフォルトの名無しさん
22/02/26 16:07:54.37 EUVpr27z.net
文字列解析を無効化する名前空間
URLリンク(docs.microsoft.com)

69:デフォルトの名無しさん
22/02/26 16:49:18.98 +OtunY2h.net
ずこー
ファイル名に末尾スペースはNTFS的に非合法のはずなのに、なんで作れちゃうかな
闇が深い

70:デフォルトの名無しさん
22/02/26 16:54:25.81 +OtunY2h.net
一応補足しとくとシェルは関係ない、pwshから非合法パス名へアクセスするのにも(ri)Remove-Item "\\?\~"は使える(使えてしまう)

71:デフォルトの名無しさん
22/02/26 19:13:10.48 kQiC9zng.net
-LiteralPathが多分必要

72:デフォルトの名無しさん
22/02/26 20:14:14.01 +OtunY2h.net
ri -lp '\\?\C:\Users\ore\sandbox\trailing 'で消せた
そもそも-literalpath指定無しには正しくない名前のファイルは作れないようになってる
標準のFileSystemプロバイダは静かに切り詰めるようだけど、できればエラーにしてほしいところ

73:デフォルトの名無しさん
22/02/26 20:16:53.67 +OtunY2h.net
当たり前だがext4上では合法だから普通に作れるな
プロバイダ依存きをつける

74:デフォルトの名無しさん
22/02/26 20:28:51.97 HRmzshO4.net
各々のプログラムのモラルに任せられてるのが残念なところ
pwshからコマンドレットを使う限りはうっかり変なもの作るの阻止してくれるのが救いか
linux/mac上ならそもそもOSがハネてくれるのでpwshで余計なチェック挟む必要もないのだけど

75:デフォルトの名無しさん
22/02/26 20:33:36.43 7VK+waus.net
Mac特有の濁点ユニコードもそのまま入るし互換性のためだろう

76:デフォルトの名無しさん
22/02/26 20:34:30.39 HRmzshO4.net
いや
>>29によるとコマンドレットで作れてしまったのか
それはちょっとまずい気がする

77:デフォルトの名無しさん
22/02/26 23:23:38.20 U2u/902M.net
いや真似しても普通には再現できなかったよ
\\?\ でなんとか作った
条件もわからんしいたずらに憂いてもしょうがない

78:デフォルトの名無しさん
22/02/28 02:46:56.51 RHAmUG8r.net
APIで普通に作れるから対策したつもりてもコマンドを適当に組み合わせたら偶然できるようなレベル
web上に消し方の情報が沢山あるのはそういう理由

79:デフォルトの名無しさん
22/02/28 10:01:03.24 1ziskyp5.net
>>77
76は>>75への返信

80:デフォルトの名無しさん
22/02/28 13:10:38.48 5+6VAuli.net
試す気はないけど
>>64で再現できるんでね?

81:デフォルトの名無しさん
22/02/28 14:17:24.11 9W2zYqHy.net
そりゃあえて迂回したらな
Test-Path -IsValidは信頼できるのだろうか?
中身分からものに頼るよりendswith(". ")とかで自分でバリデーションするべきか

82:デフォルトの名無しさん
22/02/28 14:24:32.38 9W2zYqHy.net
任意文字列渡されてもそのまま作らせない、あるいは勝手に置換+ユニークIDにリネームが現実的な防御策か
ファイルシステム移行で問題起こす事もあるし、どこでも合法なファイル名に正規化しておいた方が後のため

83:デフォルトの名無しさん
22/02/28 15:01:04.99 Xoh24ILj.net
>>79
ID変わってるけど64と78は同一人物です
psを普通に使う範囲までこのOSの瑕疵を気のするのは過剰品質だと感じるし、日本の安心安全神話で生産性クソ低い件を連想してしまう

84:デフォルトの名無しさん
22/02/28 15:11:14.28 NrGkgOto.net
bashとか平気で不正ファイルポンポン作るからヤバい
OSが拒否するのを期待してるからそれ自体が悪い訳ではないのだが、安易にwindowsで使うのは本当にヤバい

85:デフォルトの名無しさん
22/02/28 15:27:14.93 9W2zYqHy.net
win版のgitに付いてくるの使ってるけど、unix系ツールはファイルシステムに気を使う移植は見たことがない
仮想ドライブに隔離してしまうのが手っ取り早くて安全そう

86:デフォルトの名無しさん
22/02/28 15:40:26.92 9W2zYqHy.net
>>82
これな
考えれば考えるだけボロが出てくるし思考放棄することにした
行儀悪いプログラムの後始末のやり方だけ知っときゃいいのよ
(真剣な仕事でなければ)

87:デフォルトの名無しさん
22/02/28 15:51:52.53 9W2zYqHy.net
win11ではこっそり治ってたりしねーかなこれ、なければwin12に乞うご期待…

88:デフォルトの名無しさん
22/03/01 03:09:34.84 L/ghTddK.net
>>82
これは瑕疵ではない、仕様とMSは一応言ってるんじゃね?
>>67によると ↓ だそうだから、自分でちゃんとチェックしろ、対処しろということだろうし
ファイル i/o の場合、 \ \ パス文字列の "? \ " プレフィックスは、すべての文字列解析を無効にし、その後に続く文字列をファイルシステムに送信するために、Windows api に指示します。
↑こう書くのはおそらく他OSのコードをそのまま移植しやすくするため、なんでね?
つまり何もチェック(今回の例なら末端にスペース入ってないか)せずにAPIに渡すと
結果として>>29のようなことが起き得ると

89:デフォルトの名無しさん
22/03/01 03:14:07.19 L/ghTddK.net
あ、>>29では>>64の書式では書いてないのか
>>64の動作は仕様だと思うけど>>29でなったのならバグだな(試す気はない)

90:デフォルトの名無しさん
22/03/01 13:31:53.46 fDW5QBJr.net
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オプションでも同じだった

91:デフォルトの名無しさん
22/03/01 13:42:53.50 fDW5QBJr.net
ファイル名の末尾の英字取って
3---.txt
3-1-.txt
4---.txt
4-1-.txt
としたら
3---.txt
3-1-.txt
4---.txt
4-1-.txt
になったけど意味が判らない
変なバグに遭遇した気分

92:デフォルトの名無しさん
22/03/01 16:20:44.39 XlErARwx.net
最近のWindowsは9.txtの後ろに10.txtが並ぶように数の大小を考慮したソートを標準で行うからそのアルゴリズムが生む微妙な綾じゃね
レジストリによって挙動が変わるはず
文字コード順を順守させたいならファイル名標準のソートにならないように、ハッシュテーブルの引数なんかを使って単なる文字列としてソートしてあげればいいんじゃないかな

93:デフォルトの名無しさん
22/03/01 22:49:13.37 qg4SVCg0.net
テストしてないし遅い気がするけど
下準備なしがよければ
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)})

94:デフォルトの名無しさん
22/03/02 17:07:09.87 HFEr6ITo.net
>>92
めっちゃ参考になった
ありがとう

95:デフォルトの名無しさん
22/03/02 17:54:20.18 qWIZmWPY.net
>>89
PowerShell 5.1だと確かにそうなるけど
PowerShell 7.2.1だとgci | sort で期待通りの結果になったよ
最新バージョン使った方が良いんでない?

96:デフォルトの名無しさん
22/03/02 21:57:02.42 Gj5Erajd.net
PowerShellでSQliteのデータベースに追記操作しようと思っていますが
テーブル名を変数にし、カラムと追記したい内容を配列で操作しようとすると上手くいきません。
一括で出来ないなら配列内ループでと思いやってみましたが、そちらもうまくいきませんでした。
配列でINSERTするには、以下のサンプルだとどういった記述をすればよいのでしょうか?

97:デフォルトの名無しさん
22/03/02 21:57:57.51 Gj5Erajd.net
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

98:デフォルトの名無しさん
22/03/02 21:59:03.05 Gj5Erajd.net
$Table = "List"
$ArrCol = @("No","Name","Gender")
$ArrRecord = @("1","山田","男")

99:デフォルトの名無しさん
22/03/02 21:59:46.03 Gj5Erajd.net
# レコードの追加
$cmd.CommandText = @"
INSERT INTO $Table ($ArrCol) values ($ArrRecord)
"@

100:デフォルトの名無しさん
22/03/03 00:11:25.85 Ai6V8ofW.net
どこでどんなエラーが出てるのか分からないし試してないけど
文字列の中で配列変数をそのまま展開してるのが原因なんじゃないかな。
$cmd.CommandText = @"
INSERT INTO $Table ($($ArrCol -join ', ')) values ($($ArrRecord -replace '^|$', "'" -join ', '))
"@
※余計なお世話だろうけどインジェクション対策がないので必要なら入れてね。
 (SQLiteがサポートしてるか知らないけど通常はSQLパラメータを使用。)

101:デフォルトの名無しさん
22/03/03 07:55:37.70 vKIVQ1+Z.net
>>99
ありがとうございます。
一回やってみます

102:デフォルトの名無しさん
22/03/03 22:26:57.79 vKIVQ1+Z.net
すみません、色々試したのですがわからずまた質問させてください
$Table = "2022"
$ArrCol = @("No","Day","Name")
$ArrRecord = @("1","2022/03/03","山田")
だとして

103:デフォルトの名無しさん
22/03/03 22:35:42.15 vKIVQ1+Z.net
cmd.CommandText = @"
INSERT INTO "2020" ("No","Day","Name") values ("1","2022/03/03","山田")
"@
だとエラーなくデータベースに追記出来るのですが

104:デフォルトの名無しさん
22/03/03 22:37:17.23 vKIVQ1+Z.net
$cmd.CommandText = @"
INSERT INTO [string]$Table ("No","Day","Name") values ("1","2022/03/03","山田")
"@
だと"0"個の引数を指定して"ExecuteNonQuery"を呼び出し中に例外が発生しました"SQLite error near "2022":syntax error"

105:デフォルトの名無しさん
22/03/03 22:37:58.49 vKIVQ1+Z.net
あと
$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"
とエラーが出てデータベースを変更できませんでした
色々試したのですが理由がわからず申し訳ございませんが教えたもらいたく

106:デフォルトの名無しさん
22/03/03 22:42:34.74 vKIVQ1+Z.net
すみません
5chだとSQL関係で書き込めなかったのですが
$cmd.え(E)xecuteNonQuery() | Out-Null
も各場所で記入しています

107:デフォルトの名無しさん
22/03/04 01:01:51.54 rY0dcLRW.net
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, 山田)

108:デフォルトの名無しさん
22/03/05 08:12:15.74 UxduI4YM.net
PowerShell and OpenSSH team investments for 2022
URLリンク(devblogs.microsoft.com)
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.

109:92
22/03/05 11:18:59.79 2eHlJFPP.net
>>92
1つ目の例のUnicodeはUTF-16LEの事だからだめだったね。
BigEndianUnicode(UTF-16BE)にする必要があったし、
そもそもbyte型にしてエンディアン気にする必要もないから、
gci | sort {[int[]][char[]]$_.Name | %{'{0,5}' -f $_}}
でよいはず。
※全く関係ない別の作業中になんか急に気づいた。

110:99
22/03/05 11:34:56.78 2eHlJFPP.net
SQLiteがカラム名等を「"」で括る事を要求しているなら
$cmd.CommandText = @"
INSERT INTO "$Table" ($($ArrCol -replace '^|$', '"' -join ', ')) values ($($ArrRecord -replace '^|$', '"' -join ', '))
"@
かな。>>106さんの言う通りなので確認してみて。
これもだめなら、成功例と、失敗例や変数値のテーブル名が違うからそこかも。

111:デフォルトの名無しさん
22/03/05 17:03:38.16 aFkos6IC.net
>>107
もう開発やめりゃいいのにな
これまでWindowsに入ってるから採用されてきただけで、わざわざ入れて使うならPowerShellなんか選ばれるわけがない
コマンドレットで簡単に導入できるようにするならPowerShellじゃなくてPythonにでもしたほうがいいんじゃないか

112:デフォルトの名無しさん
22/03/05 22:04:13.92 BfpuuE1g.net
インストールしてなくてもpythonコマンドでMSストア版pythonのダウンロードページに飛ばされるから、既にpwsh7よりも導入が楽という悲しみ

113:デフォルトの名無しさん
22/03/05 22:12:35.50 vfk/Azs+.net
PowerShellってそんな残念なプログラム言語なんですか?
がんばって勉強したのに納得できません

114:デフォルトの名無しさん
22/03/05 22:41:29.84 ws14fGQi.net
PowerShell5系は向こう10年は大丈夫
6以降はAzure以外では全く使われておらず、Azureに生涯を捧げるのでない限りは完全無視でOK

115:デフォルトの名無しさん
22/03/06 11:25:06.52 2dMAfvhM.net
メインは蛇使いだけど
色々インポートしなくてもそこそこ戦えるのでregex、小規模データ処理、重くない数値計算がシェルから直接引けるpwshは有り難い
ネイティブライブラリ揃ってないからパワーが居るのはPython、まあPython自体はpwshとドングリ背比べ(処理速度、標準ライブラリもほぼ等価)だけど、やはりライブラリが強い

116:デフォルトの名無しさん
22/03/06 11:37:06.16 Ou5vEvLf.net
蛇使いwww
蠍と射手の間かよwww

117:デフォルトの名無しさん
22/03/06 14:35:41.73 2wKnUbYj.net
Pythonは.NETを使えないから糞

118:デフォルトの名無しさん
22/03/06 15:35:16.76 +PaQnGDE.net
PowershellとPythonだと得意分野が違うよね

119:デフォルトの名無しさん
22/03/06 16:40:58.28 N33QeZ0g.net
ちょっと詳しい人に聞きたいんだけど開発環境で使用しているSDKのコマンドがcmdだと実行可能だけどPowershellだと一切認識されませんてエラーがでるんだけどこの理由はなぜ?
WIndows 11だとターミナルのデフォがPowershellなのにもやもやする、この解決方法はある?
もう一つ、ファイル名を指定して実行で起動したcmdからはSDKのコマンドが実行できるのに、Terminal(wt.exe)の既定のcmdからコマンドを実行すると認識されていませんエラーが出るんだけどこの原因もなぜ?解決方法はある?
cmdとpowershellとterminalと複数のshellを用意してMSは何がしたいのかマジで意味がわからない
WSLとか作っててOSSに寛容になったんだからさっさとデフォのShellをbashかzshにしてくれれば開発環境としてより便利なのに・・・

120:デフォルトの名無しさん
22/03/06 16:49:05.43 4qF5AnI1.net
しかもそのデフォルトで開くPowerShell、既に非推奨のバージョンなんだぜ
もう完全に破綻してるからWSLだけ使えばいいのよ

121:デフォルトの名無しさん
22/03/06 17:14:53.35 Y34SWeR7.net
>>118
情報少なくてわかんないけど、カレントフォルダに対して「.\ファイル名」の記法で書いてないとかはない?
ファイル名に特殊記号を含むとか

122:デフォルトの名無しさん
22/03/06 19:53:05.95 +PaQnGDE.net
bashとかは言語的にはPowershellに比べて時代遅れ過ぎるわ
さっさとPowershell7に統


123:一したほうが遥かにマシ



124:デフォルトの名無しさん
22/03/06 20:11:36.59 GpPJTCKS.net
10や11に標準で入ってる5.1で動くようにしてる人が大半じゃないの
機能的にも特にこれ以上期待するものはないんだけど

125:デフォルトの名無しさん
22/03/06 20:14:22.19 N33QeZ0g.net
>>119
いやマジでそれでしたwww
PS7をインストールしてPS7で実行したらCLI認識しましたイミフwww
そしてPS7をインストールしてもアップデートされずWin11デフォのPS5がそのままアンインストールもできず鎮座してるくそすぎて草

126:デフォルトの名無しさん
22/03/07 00:21:21.62 M26ldpDZ.net
>>106
デバックで出力したとき文字列だから勝手に"が消されているものかと先入観を持ってしまっており疑問にすら思いませんでした
丁寧に説明していただきありがとうございます。
>>109
ありがとうございます。明日確認してみます。

127:デフォルトの名無しさん
22/03/07 17:43:24.45 GqmKE44y.net
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')"

128:96
22/03/08 02:39:16.58 BWZbDM8v.net
$Table = "2022"
$ArrCol = @("No","Day","Name")
$ArrRecord = @("1","","")
このようにブランクの配列があると
'1', ', ','
上のように途中の「""」が「'」シングルクォーテーション1つになりエラーが起こっているということがわかりました。
ですので
$ArrRecord | foreach-object -Process {$_ -replace '"',"'"}
として配列内で変換しようと思ったのですが、$_の時点でダブルクォーテーションが取れており上手く変換できない状態です
($($ArrRecord -replace '^|$', '"' -join ', '))の「'^|$'」は正規表現で前と後ろを「"」で変換するということですよね
途中のパイプの意味がわかっていないです

129:デフォルトの名無しさん
22/03/08 10:15:51.20 HM66xeZm.net
>>126
苦戦してるね
まずプログラミング一般の基礎として、ソースコード上に文字列型の変数値を直接書きたいということを伝えるための(文字列リテラルの)引用符と、文字列の中に引用符という文字データを含めたいと伝えるための引用符は別なので理解・区別しておかないとずっと混乱する
$_の時点で引用符が取れたという感覚は間違いで、今回文字列の中身には引用符文字は含まれていなくて、文字列リテラルですと伝える引用符になってる
次に、^|$ で置換する発想は、文字列の特定の位置が先頭または末尾なら置換というところまでは狙いどおり
でも空の文字列だった場合、正規表現処理が文字列を左から走査したとき「先頭かつ末尾」という単一の位置しかないので、置換も一回しか行われず引用符一つだけになるというバグになってる
例えばこうすれば文字列リテラルのなかに引用符文字を入れられる
($("""$ArrRecord""" -join ', '))
($("`"$ArrRecord`"" -join ', '))
($("'$ArrRecord'" -join ', '))
いずれも外側の二重引用符がリテラルの引用符で、内側の引用符が文字データの引用符

130:デフォルトの名無しさん
22/03/08 10:21:04.34 HM66xeZm.net
>>127
配列じゃなくて各要素の文字列を囲まないとダメたった
($("""$_""" -join ', '))
($("`"$_`"" -join ', '))
($("'$_'" -join ', '))
あと正規表現のパイプは「または」という意味

131:デフォルトの名無しさん
22/03/08 16:05:01.58 zfJt6x7/.net
PowerShellのバージョン問題はwslに最新のpowershellを入れるでok?

132:デフォルトの名無しさん
22/03/09 00:49:55.24 oTLaCJPf.net
>>129
Linux版Powershell7はWindows版Powershell7と比べて機能制限も多い
よって全く解決しない

133:デフォルトの名無しさん
22/03/09 07:01:31.59 RwKAl9+/.net
LinuxでPowershell使う理由なんてあるか?
bashの方が明らかに上だろ

134:デフォルトの名無しさん
22/03/09 09:36:42.19 taLplzJg.net
> bashの方が明らかに上だろ
確かにバカをあぶり出す能力は高いなw

135:デフォルトの名無しさん
22/03/09 10:12:30.93 EcV8v1IL.net
>>131
Linux版使った事ないから
bashとどう比較してるか興味あるよ
優劣を列挙しもらえると助かる

136:デフォルトの名無しさん
22/03/09 15:06:09.10 Cj1SKgXQ.net
powershellはC#埋め込んでそこで定義したクラスとかがpowershellで使えるとこがいいところだから
bashもそうしたらいいとおもう

137:デフォルトの名無しさん
22/03/09 17:46:07.31 KONqX93R.net
それはPSってよりCOMじゃね

138:デフォルトの名無しさん
22/03/09 19:10:34.11 g4d6cmq/.net
めっちゃ前からある機能だしCOMなんて1mmも関係ないぞ
URLリンク(codezine.jp)

139:デフォルトの名無しさん
22/03/09 21:24:55.35 oTLaCJPf.net
コマンドレットの出力がオブジェクトで目的のプロパティから値が取り出しやすい
Where-object一つ覚えればフィルター出来るからコマンド毎にフィルタの仕様で悩む必要が無い
正規表現がperl拡張表現で標準搭載、コマンドやら環境によって規格が違うとか悩む必要がない
シェルスクリプトとしてそれだけでも全然いいわ

140:デフォルトの名無しさん
22/03/12 11:12:49.22 2x7XRkpq.net
regex沼に入る気はないけど$matches.namedで参照できるだけでもかなり有り難い
pwsh固有の事情としては(?-i)を繁用するな
sls等コマンドレットに-CaseSensitive渡したり-[ci]matchが入り乱れてたのがスッキリした

141:デフォルトの名無しさん
22/03/12 11:27:19.44 2x7XRkpq.net
あとStringとString[]どっちも渡ってくるから(?m)/(?-m)もpwsh的には重要か

142:デフォルトの名無しさん
22/03/15 01:12:21.45 z4wleAC0.net
>>128
レスの内容を色々と検索しながら勉強させていただきました
まだエラーが出て止まっていますが、こちらで少し対応を考えてみたいと思います
本当に丁寧に教えていただきありがとうございます

143:デフォルトの名無しさん
22/03/16 22:20:26.82 Rh84s05v.net
二つの引数をとる関数に引数を二つ渡したら、一個目引数が全部持っていくのはなんで?
コード
function war {
param($putin, $zelenskyy)
Write-Host 'putin has ' $putin
Write-Host 'zelenskyy has ' $zelenskyy
}
war('Russian','Ukraine')
結果
putin has Russian Ukraine
zelenskyy has

144:デフォルトの名無しさん
22/03/16 22:33:14.06 ET0x7ZFa.net
>>141
配列
@(
"aaa"
"bbb"
)
の別表記がカンマ区切りリスト
"aaa","bbb"

145:デフォルトの名無しさん
22/03/16 22:41:56.39 Rh84s05v.net
呼び出すときに恰好つけるとダメなのか

146:デフォルトの名無しさん
22/03/17 00:07:43.00 0/d09PRO.net
格好も括弧も関係ない
シェルなんだから引数の区切りは空白と言うだけの話

147:デフォルトの名無しさん
22/03/17 00:50:39.64 DCNM1l/p.net
war Russian Ukraine
にしろっつーことでしょ?

148:デフォルトの名無しさん
22/03/17 00:52:00.94 DCNM1l/p.net
失礼、こうだね
war ‘Russian’ ‘Ukraine’

149:デフォルトの名無しさん
22/03/17 08:43:01.98 vPjPamJP.net
Set-StrictMode -Version 2.0 おすすめ
URLリンク(docs.microsoft.com)


150:614(v=technet.10)#%E4%BE%8B-2



151:デフォルトの名無しさん
22/03/17 12:57:17.38 ENyjKfBg.net
赤文字で出るエラーメッセージをログに出力して、
エラーログが出てるか適当な箇所で判定して、ログをnotepadで開くってことをやりたいです。
標準エラー出力みたいなのの取得方法を教えて下さい

152:デフォルトの名無しさん
22/03/17 15:06:14.72 9VjLQzax.net
いくら補完あると言ってもコマンドレットの名前冗長すぎんだよ

153:デフォルトの名無しさん
22/03/17 15:18:43.63 zTqRydhk.net
>>149
良く使うやつはaliasあるやん

154:デフォルトの名無しさん
22/03/17 21:22:30.00 KFCC0Q8d.net
長いから分かりやすくていいんだろ
wとか言われてもユーザーを笑いものにするコマンドか?としか思えんし

155:デフォルトの名無しさん
22/03/19 11:18:52.00 7PrXFgOi.net
構文はtclっぽいねえ

156:デフォルトの名無しさん
22/03/19 12:37:58.38 vJYdrJTe.net
配列の配列について
$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

157:デフォルトの名無しさん
22/03/19 12:39:12.90 vJYdrJTe.net
だが、カンマを省略すると
$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

158:デフォルトの名無しさん
22/03/19 12:40:41.61 vJYdrJTe.net
改行してカンマをいれると
$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
どういうことなのか教えてよ。

159:デフォルトの名無しさん
22/03/19 14:10:16.88 advrh/I1.net
powershellで配列データ構造を扱ってはいけない

160:デフォルトの名無しさん
22/03/19 16:28:22.32 vJYdrJTe.net
URLリンク(docs.microsoft.com)
「これらの例では、コンマは非常に重要です。 以前に示した通常の複数行での配列の例では、コンマは省略可能でした。 多次元配列の場合はそうではありません。」
そうではありませんと言われても、エラーになるわけでもなく、どうなるのか誰か教えて

161:デフォルトの名無しさん
22/03/19 23:33:26.82 GptrjqcJ.net
>>153-155
あまり自信はないのですが、
・「単項の ,」と「配列要素区切りの ,」は別物です。
 (「-1」と「1 - 1」の「-」が別物、みたいな違い。)
・式の終端と見なせる箇所にある改行は「;」と概ね等価です。
>>153の「,」は「配列要素区切りの ,」です。
>>155の「,」は「単項の ,」です。

162:デフォルトの名無しさん
22/03/19 23:33:48.95 GptrjqcJ.net
ワンライナーにするとこんな違いがあります。
>>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';); )

163:デフォルトの名無しさん
22/03/20 00:30:34.10 V8R16naX.net
追加。
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';))); )

164:デフォルトの名無しさん
22/03/20 01:20:05.34 EnzWedk+.net
暗黙のWrite-Output
コマンドレットのような何某かの出力を持つものと、Powershellのスクリプト内で定義された関数や式の評価結果を
うまいこと混ぜることが出来るようにする仕掛けなのでしょうか
完全に理解しては居ませんがが、理解に努めます
文法知識は「Windows PowerShell実践システム管理ガイド 第3版(日経BP)」の第2章を読んだだけなのですが
これだけは全然足りないtのを痛感しました
何かお勧めはありませんか

165:デフォルトの名無しさん
22/03/20 01:39:27.35 KeTIMbSf.net
powershellは行志向寄りの言語だから改行はC/C++でいう暗黙の副作用完了点みたいな意味を持っている
何も考えず複数行にまたがる式を書くと思わぬ事故に繋がるから、C/C++の\やVBの_みたいに行継続を示す`を行末に付けるといいよ
$array_of_array = @( @('1-1', '1-2', '1-3') `
, @('2-1', '2-2'))

166:デフォルトの名無しさん
22/03/20 14:33:02.79 V8R16naX.net
>>161
今回の挙動の予想や理解は、構文のパース(式・文の区切り)、
独特なパイプラインの挙動、分かりづらい「単項 ,」の存在などがあり
わりと難易度の高いものです。
>>156>>162さんに同意で、配列の配列(ジャグ配列)を避け
行の継続を「`」で明示する事をお勧めします。
書籍では『Windows PowerShell イン アクション』がお勧めです。
ただv1の本なので今となっては内容が古く、紙だと新品の入手が難しいです。
※これのv5以上版が日本語で出て欲しい…。
URLリンク(www.sbcr.jp)
あとは>>157のMSのサイト等。
about_*も有用な事が書かれてますが、日本語訳やサンプルコードの質が酷く、
多くの人がよく使う機能と一部の人が稀に使う機能が同じ扱いの記述なのが難点。

167:デフォルトの名無しさん
22/03/20 22:00:12.10 L+yKE55O.net
Powershellの洋書翻訳はもっと盛んになってほしい
オライリーのクックブックも原著は改定4版まで出てるのに日本語は初版のままだし

168:デフォルトの名無しさん
22/03/21 00:56:42.09 OI2SuuED.net
今時英語できないの日本人だけだからな
土人とか馬鹿にしてる韓国、中国、インド、ベトナム、フィリピンなんてネイティブレベルで英語できるからな
これで日本のレベルは低くないとかそれ以前の問題だよ

169:デフォルトの名無しさん
22/03/21 08:39:53.52 2Zu3Swq+.net
エリート層は英語できるだろうよ
馬鹿は海外だと底辺でも英語ペラペラだと思ってやがるが

170:デフォルトの名無しさん
22/03/21 09:24:20.27 JwhA0ika.net
日本ですら母国語での情報の鮮度が落ちるんだから
それらの国のプログラミング学習希望者は
必然的に英語の勉強からしないといけないだけの話じゃないかな?
日本のレベルが低いとか
英語できるのはエリート層だけとか
そういう問題じゃないと思いますよ
アニメ理解したいから日本語勉強しましたと
同じレベルの話な気がする

171:デフォルトの名無しさん
22/03/21 09:42:44.22 3OVxtXqz.net
まとめて挙がってるけど国によって差は大きい
インドとフィリピンは英語が公用語で世界でも有数の英語話者が多い国
日本の英語力が低すぎて世界に遅れを取っているというのは同意
学校教育も都度見直されてるしそのうち改善されるんじゃねーの、知らんけど
プログラマーなら英語を読むだけでもできるように少しずつ学ぶ気概は欲しい
ボク英語わからないんですと幼稚な変数名を付け続けるのはよくない

172:デフォルトの名無しさん
22/03/21 14:48:55.98 fHQFhWIP.net
日本は国内に金と仕事があるせいで海外でなくても稼げるからなあ
英語理解できなくても儲かる職業の筆頭が
マスコミと教育と役人政治家の時点で英語教育が変わるわけ無いじゃん

173:デフォルトの名無しさん
22/03/21 16:01:23.66 l99FVYBX.net
ITに限定すると英語は必要なんだけど英語に限らず日本のITエンジニアの多くは勉強しない
能力を伸ばしても給料が上がらず残業が増やされるだけと諦めるのが常態化している

174:デフォルトの名無しさん
22/03/21 16:10:09.00 l99FVYBX.net
国内に金があるというのは微妙な話になってきている
世界ワースト級の低成長による沈下を続けていて、本当に有能なエンジニアは海外に流出して残るのはIT土方ばかり
ノーベル賞受賞者が元日本人ばかりというのと同じような話が起こってる
GAFAのようなIT企業が伸びないから低成長から抜け出さない負のスパイラル

175:デフォルトの名無しさん
22/03/21 21:14:58.00 dTmdB0AV.net
海外ならGAFAみたいな企業がたくさんあるとでも思ってるのかこのゴミは
GAFAは世界中でも1つしか無いんだよ

176:デフォルトの名無しさん
22/03/21 21:25:38.84 vIzK+CHc.net
GAFAはひとつとな?
MARCHはひとつみたいな哲学かな?
のようなという日本語の意味はわかるのかな?

177:デフォルトの名無しさん
22/03/21 22:11:34.27 y82izW1t.net
脱線しとるな

178:デフォルトの名無しさん
22/03/22 00:10:37.43 KVIRUNm3.net
これ使って出来ることってフォルダ弄りファイル弄り設定弄りだけ?
他に出来ることないの?

179:デフォルトの名無しさん
22/03/22 00:21:42.31 kikOm2qa.net
あとは何かプログラムを走らせたり、せいぜいOSの機能を実行するくらいかな
リモートで出来たりするけど、しょせんはローカルに出来ることがリモートでも出来るってだけだな
まだ勉強をはじめたばっかりだけど、そのマシンで出来ないことは出来ないんだなって分かった

180:デフォルトの名無しさん
22/03/22 00:25:39.51 gjcW4Tfu.net
>>175
bashなんかのシェルとは違って.NETベースだからC#やVB.NETでできることは一通りできるよbashなんかと違ってね
メンテが楽だからあえてpowershellでGUIを作ったりする場合もある

181:デフォルトの名無しさん
22/03/22 00:37:38.83 aUdC0GfB.net
正規表現使えるしWindowsだとわざわざPythonセットアップして使うより楽だし利便性高い気がする

182:デフォルトの名無しさん
22/03/23 00:40:52.77 G2Twh9Sv.net
>>175
PowerShellは基本的にはWindowsサーバーの管理に使うもの
管理系のコマンドレットが非常に充実している

183:デフォルトの名無しさん
22/03/23 04:18:15.48 IVt1k3VA.net
>>177
出来るからって普通はやらんよまともな脳みそしてるならVSCode使う
お前みたいなのが秀丸やEMでコーディングしてるでぇー(ドヤッっイキリ散らかして周りが迷惑する馬鹿そのものだな

184:デフォルトの名無しさん
22/03/23 08:31:22.61 eqSZnoCQ.net
>>180
VSCodeを使うの意味が分からん
VSCodeでPSスクリプト組むならいいの?
なんで処理系の話でエディタの話になるの?

185:デフォルトの名無しさん
22/03/23 09:01:03.65 TpwnHNL9.net
分かってるくせに…
対面だと「何いってんだコイツ…」とか思いながらも愛想笑いしてそうだな

186:デフォルトの名無しさん
22/03/23 10:01:20.99 Jvnypl+E.net
釣りでしょ
面倒見いい人なら、オマエそれブーメランやんけーて言ってあげたら喜ぶよ

187:デフォルトの名無しさん
22/03/23 10:04:37.18 11NHOGIK.net
この煽り合いもPowershellスキルの一部なんですか?

188:デフォルトの名無しさん
22/03/24 03:56:01.53 cKyI7Sj4.net
write-sqltabledateで列名は指定できますか?
計算列のあるテーブルでその列を飛ばしたいのですがPsCustumObjectのプロパティ名が無視されて並び順で投入されてしまいます。

189:デフォルトの名無しさん
22/03/24 21:13:21.68 vudxrsxx.net
URLリンク(i.imgur.com)

190:デフォルトの名無しさん
22/03/25 04:05:40.26 qE/8IX5m.net
>>186
すいません
Write-SqlTableData
でした…
よろしくお願いします

191:デフォルトの名無しさん
22/03/26 14:42:03.29 u+BPDoH4.net
そういう挙動ということはWrite-SqlTableDataはメタデータを考慮してなさそうだし
Invoke-Sqlcmdでやれば?

192:デフォルトの名無しさん
22/03/26 14:50:17.14 pYdvgAQA.net
コマンドレットの命名規則をケバブケースにしたMSの馬鹿を殺してやりたい
補完でタブ押して確定してまたタブ押して確定してってのがめちゃくちゃイライラする

193:デフォルトの名無しさん
22/03/26 14:56:08.98 VSlpRLnL.net
自分の思い通りじゃないとすぐにイライラしたり殺したくなったりする

194:デフォルトの名無しさん
22/03/26 18:44:07.02 MJID/KD0.net
ちんちんシュッ!シュッ!シュッ!

195:デフォルトの名無しさん
22/03/26 21:08:39.76 MzILs1Nj.net
>補完でタブ押して確定してまたタブ押して確定して
状況が分からん

196:デフォルトの名無しさん
22/03/26 21:42:22.31 M1Ul1dov.net
文字列をPowerShellの文字列リテラルとして出力したいのですが、どうやったら楽ちんに出来ますか?
例えば下記を実行すると
$s = "``i`'`""
function literally {
param ($t)
return $t
}
Write-Output (literally $s)
実行結果は
`i'"
こうなりますが、
"``i`'`""
こうなってくれる function literally は既存の関数にありますか?

197:デフォルトの名無しさん
22/03/27 06:15:33.62 LvwD4OI0.net
>>188
ありがとうございます
やっぱそれが無難ですかね
IDENTITYにしたオートインクリメントな列は空文字列の代入で飛ばせたので計算列も何か方法が無いかと思ったのですが…

198:デフォルトの名無しさん
22/03/27 13:30:01.63 mnGGi+fZ.net
>>193
literally が何を意図してるのかわからんが
単一引用符のヒアドキュメントで囲むとか
$s = @'
"``i`'`""
'@
必要なリテラル部分だけ抜き出したファイルを作成してgcで読むとかすりゃいいんじゃね
あとは必要ならInvoke-Expressionなりして使う
まじめにコード内でエスケープ処理とかやろうとしたら一晩掛かるよ

199:デフォルトの名無しさん
22/03/28 00:44:41.31 8p5xi9DH.net
まじめなエスケープ処理を10分くらいでできる関数とかないですか

200:デフォルトの名無しさん
22/03/28 00:54:22.58 8p5xi9DH.net
--- ここから x.ps1 ---
function x {
$s = (Get-Content -Path 'a.txt')
Write-Output ('$a = ' + "'" + $s + "'")
}
x | Out-File 'a.ps1'
--- ここまで ---
--- a.txt の中身が ---
im.dat
--- ここまで ---
の場合

201:デフォルトの名無しさん
22/03/28 00:57:03.84 8p5xi9DH.net
a.ps1 は
$a = 'im.dat'
となって PowerShellで読み込める
--- a.txt の中身が ---
i'm.dat
--- ここまで ---
の場合
a.ps1 は
$a = 'i'm.dat'
となってシンタックスエラーになる。こういう場合のためにエスケープ処理をしたいのです。

202:デフォルトの名無しさん
22/03/28 02:14:50.68 vgVAp+/s.net
>>198
であるならば>>195で示したヒアドキュメントを使えばそんな処理は不要になる
function x {
$s = (Get-Content -Path 'a.txt')
'$a = ' + "@'"
$s
"'@"
}
x | Out-File 'a.ps1'

203:デフォルトの名無しさん
22/03/28 02:28:26.94 8p5xi9DH.net
a.txt の内容が下記の場合はエラーになります。
'@.dat
----
いまさら気が付きましたが、やりたいことは、
PowerShellスクリプトをPowerShellで出力したいので、文字列をエスケープしたい。
最初から、こう言えればよかった。

204:デフォルトの名無しさん
22/03/28 07:29:09.01 vgVAp+/s.net
>>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'

205:デフォルトの名無しさん
22/03/28 08:39:09.99 5tj62u6D.net
文字列リテラルの構文仕様を見るかぎり、
function ConvertTo-StringLiteral ([string] $s) {
 '"{0}"' -f ($s -replace '[$"\u201C-\u201E`]', '`$&')
}
でいいのでは。
function x {
 $s = Get-Content a.txt
 '$a = ' + (ConvertTo-StringLiteral $s)
}
みたいに使う。

206:デフォルトの名無しさん
22/03/28 09:30:54.03 5tj62u6D.net
>>201
普通の「'」以外のシングルクォート類(*)も、正当なシングルクォート文字なので、
a.txt に「‘@.dat」とか入力されるとエラーになる穴が...。
(*) U+2018、U+2019、U+201A、U+201B

207:デフォルトの名無しさん
22/03/28 20:36:51.74 vgVAp+/s.net
>>202-203
非常に勉強になったよ
ありがとう

208:デフォルトの名無しさん
22/03/29 02:15:34.71 ieHzhZh4.net
>>202
URLリンク(www.microsoft.com)
これを見つけたので 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]", "'$&")
}
こうすればいいのだろうか?

209:デフォルトの名無しさん
22/03/29 02:33:47.96 ieHzhZh4.net
何でインデントついてるんだろと思ったら\u3000でしたか

210:202
22/03/29 09:28:46.66 H9URZ70O.net
>>205
うん。範囲指定できるので、"['\u2018-\u201B]" とか書くと、もっとシンプルかも。
>>206
U+3000 の Unicode クラスは Zs で、正当な空白文字なので、コピペで動いてくれる。

211:デフォルトの名無しさん
22/03/29 21:51:03.77 SKE99kDT.net
B.1.9.3 文字列リテラル
URLリンク(docs.microsoft.com)

212:デフォルトの名無しさん
22/04/04 21:22:25.32 ECqCrQfL.net
>>1
$url=$($site="+pj.og.ldn.iakkokA3%etis=q?hcraes/moc.elgoog.www//:sptth".ToCharArray();[Array]::Reverse($site);-join $site)
"ソビエト人","支那人","朝鮮人" | % {start "$url$_";sleep 21}

213:デフォルトの名無しさん
22/04/07 22:32:51.33 49oapsGv.net
(Get-Date).ToString("M/d") # 4/7
(Get-Date).ToString("M") # 4月7日
(Get-Date).ToString("d") # 2022/04/07
"M"と"d"単体で取れないのは仕様なの?

214:デフォルトの名無しさん
22/04/07 22:51:48.46 UZkBrI19.net
>>210
書式指定を単体で使う場合は%を前置する
URLリンク(docs.microsoft.com)

215:デフォルトの名無しさん
22/04/07 23:27:13.95 49oapsGv.net
>>211
なるほど。ありがとう

216:デフォルトの名無しさん
22/04/13 14:32:54.13 Wntan1Ql.net
いえいえ

217:デフォルトの名無しさん
22/04/13 21:32:59.17 wBIIYhTi.net
事務員がこれ使って自動化して評価されるかね?
Excel VBAとかだと認知されてるし動きも分かるからアピールになりそうだけど、これはps1をダブルクリックしたら既に結果が出てるキンクリ状態になるんで何か地味なんだよね
出来ることは多彩なのにさ

218:デフォルトの名無しさん
22/04/14 08:19:21.43 Qn5tHQbB.net
結果を開いて見せつけてやればよろしいかと

219:デフォルトの名無しさん
22/04/14 16:18:50.55 NCtDoq3M.net
キンクリ状態てどういう意味なん
例えばExcel操作の自動化なら最初に$excel.Visible = $true
とでもしとけば同じようにリアルタイムで処理中の動きが出てくるけど
事務員ならいらん仕事押し付けられるのがオチだから隠しとけ
この程度でドヤりたいならIT土方にでも転職しなよ

220:デフォルトの名無しさん
22/04/14 20:27:06.96 PvzsrQHs.net
事務員がマクロやスクリプトで評価されても給料や時給が上がったりはしないだろ
都合よく使われるだけだよ
退屈な定常業務から抜け出したい動機なら良いのかも

221:デフォルトの名無しさん
22/04/14 20:32:25.20 PvzsrQHs.net
×定常業務
○定型業務

222:デフォルトの名無しさん
22/04/14 20:56:37.25 gLpPhM76.net
>>214
レスから知性を感じない

223:デフォルトの名無しさん
22/04/14 21:57:43.29 ICzBofFJ.net
それがパワー・シェルの能力……
ボクがこのps1をダブルクリックした時点で"結果"はもう確定しているッ!!
マクロみたいなトロいもんじゃあないんです

224:214
22/04/14 22:27:15.00 7HZEzgeQ.net
やっぱり評判あんま芳しく無いからやめとくわ
回答してくれた皆さんありがとう

225:デフォルトの名無しさん
22/04/15 01:21:33.96 BWy9qJpj.net
>>220
ダブルクリックしたらISEが開いたんだが

226:デフォルトの名無しさん
22/04/15 08:51:23.89 UtgXyNoL.net
パワーシェル
破壊力 A
スピード B
射程距離 A
持続力 B
精密動作性 E
成長性 E
タイプ 自動操縦型
能力 人が嫌がる仕事をする
To Be Continued…

227:デフォルトの名無しさん
22/04/15 11:34:08.46 0ObfuMR0.net
パワーシェルのスピードは最下位ランクだろ
C#埋め込むなら別だが

228:デフォルトの名無しさん
22/04/15 11:53:27.02 UtgXyNoL.net
Cランクが人並みだからそれよりちょっと速いBランクが妥当

229:デフォルトの名無しさん
22/04/15 12:21:45 wKBILFEa.net
ウマナミナノネー

230:デフォルトの名無しさん
22/04/15 20:16:25.51 k1oDZsjR.net
windowsに標準に入っているってことだけはかなり優遇されてる

231:デフォルトの名無しさん
22/04/15 20:50:36 6g+y36jy.net
JScript.NETも入っているぞー

232:デフォルトの名無しさん
22/04/15 21:04:54.33 k1oDZsjR.net
プログラミングにおける認知度の低さは調べにくいし致命的

233:デフォルトの名無しさん
22/04/15 23:12:56 41Kz9otF.net
プログラミング言語の人気ランキング、順位変動は縮小傾向にある―RedMonkが調査
URLリンク(atmarkit.itmedia.co.jp)

このランキングだとPowerShellは17位だぞ
Rustに勝ってる!

234:デフォルトの名無しさん
22/04/15 23:31:17.12 3ZMsARLO.net
PowerShellはランキングとか関係ないでしょ
PS5止まりで.NET4.8と心中する運命しかない、完全に袋小路の言語だよ

235:デフォルトの名無しさん
22/04/16 00:54:32.11 Zcudz7ky.net
Windowsと共に来たりWindowsと共に滅ぶ


236:べし



237:デフォルトの名無しさん
22/04/16 12:02:03 nVJ4wCm0.net
>>232
おれがこれまで作ったソフトのほとんどが共に滅ぶな
かなりの割合の開発者が一緒に滅ぶんじゃないだろうか

238:デフォルトの名無しさん
22/04/16 12:30:34.16 4vTOoh05.net
>>231
それってよく聞くけどなんの問題があるの?
Powershellなんてそもそもbetter MS-DOSであり
better WSHでしかないんだからなんの問題もないでしょ
なんか過剰な期待をしてた人がいるの?

239:デフォルトの名無しさん
22/04/16 12:58:53.88 NFUA2B25.net
そもそもすでにオープンソースなんだし衰退することはあるだろうけど袋小路とか意味わからん

240:デフォルトの名無しさん
22/04/16 15:51:46.54 9cJTCJfn.net
Powershellはオープンソースとして元気にやってるよ
7.3でコミュニティ主体の機能改善になりそうなのはこの辺とか?
scriptblockの引数の数でオーバーロード解決できるようにしたいというもの
URLリンク(github.com)

241:デフォルトの名無しさん
22/04/16 15:57:59.43 9cJTCJfn.net
あとはc言語とかrustのようなネイティブアプリからPowershellをホスト出来るようになっていたりする
URLリンク(github.com)

242:デフォルトの名無しさん
22/04/16 16:17:49.58 GtnKHoFP.net
元気もなにも開発してるのMSの社員だし、6以降は事実上Azure専用だよ

243:デフォルトの名無しさん
22/04/16 16:24:09 nVJ4wCm0.net
>>237
コードちら見したけど普通にPSプロセス呼んでプロセス間通信した方がよくないってなった

244:デフォルトの名無しさん
22/04/16 18:36:59.47 9cJTCJfn.net
>>239
新たにプロセスを立ち上げることでコマンドライン等が生成されるのを回避したいらしい

245:デフォルトの名無しさん
22/04/21 00:00:35.45 9X1k5UGW.net
Powershell使えたら小5と付き合えますか?

246:デフォルトの名無しさん
22/04/21 00:43:18.15 KtzHzoax.net
きみが小5か小6なら付き合えるかもしれないね!

247:デフォルトの名無しさん
22/04/21 02:16:18 /A3pqg11.net
20年位前の30代前半の頃、小6と付き合ってた
powershellのお陰だと思うよたぶん

248:デフォルトの名無しさん
22/04/21 03:15:46 +OyHOy+D.net
>>243
そのころpowershellは未だ無いだろ

おれの場合は30年位前に小6と付き合っていると噂されたが事実はそのようなことはなく
当時powershellがあれば付き合えたのは確実だったと思う

249:デフォルトの名無しさん
22/04/21 15:56:01.36 6s2N7jdI.net
ワイも小学生低学年のころ、かけっこで1位だった
PowerShellのおかげだろうなあ

250:デフォルトの名無しさん
22/04/29 11:16:42.60 8kZAWy9o.net
htmlの特定のID(例:<div id="XXX">)の中身を取得するにはどうすればいいでしょうか?
htmlのソース自体は$sourceに格納しています。

251:デフォルトの名無しさん
22/04/29 11:18:43.54 RNDpr+pH.net
文字コードを文字に変換するコマンドはありますでしょうか。
PS > change-moji -code SJIS 0x41
A
PS >
こういうコマンドです。

252:デフォルトの名無しさん
22/04/29 11:25:23.63 X7f5QGPR.net
[char]0x41

253:デフォルトの名無しさん
22/04/29 18:39:45.29 RNDpr+pH.net
>>248
ありがとうございます。

254:デフォルトの名無しさん
22/04/29 23:23:53.91 X7f5QGPR.net
>>246
$html = New-Object -ComObject "HTMLFile"
$html.IHTMLDocument2_write($source)
$html.getElementsByTagName("div") | ?{ $_.ID -like "特定のID" }
みたいにCOM使ってDOMで操作するか、正規表現で自力で解析するかしか思いつかない
powershellの定番の処理方法があるなら俺が聞きたい

255:デフォルトの名無しさん
22/04/30 02:08:01.29 TTQ8Rhtz.net
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 #=> い

256:デフォルトの名無しさん
22/04/30 02:45:41 PTNoCeDZ.net
getElementsByTagName 使うなら getElementById でいいんじゃない

257:デフォルトの名無しさん
22/04/30 13:04:46.37 9f5J4pIa.net
Windows11は、結構Powershellが主役の位置に躍り出てきて、コマンドプロンプトの影が薄くなってる。

258:デフォルトの名無しさん
22/04/30 15:40:15.85 6Xk9b1VA.net
>>252
DOM操作にお詳しいなら補足してやって
俺は普段webページ解析なんてしないから適当に書いただけなので

259:デフォルトの名無しさん
22/04/30 23:17:02.29 /67qPyiA.net
xml形式ならselect-xmlというコマンドレットがあるんだけどね

260:デフォルトの名無しさん
22/05/01 07:07:03 Rd1MW222.net
Invoke-WebRequest でパースできるんだから Web からだけじゃなく html を格納した変数とかもソースにできればいいのにね

261:デフォルトの名無しさん
22/05/01 22:31:03.32 bsI6eYYg.net
COMのやつってIEのパーサなんだよね
くやしいけどこの辺を高度にやりたいならスクレイピングに定評のあるスクリプトでやった方がいいと思う

262:デフォルトの名無しさん
22/05/02 03:17:08 GCJ++Ydj.net
>>250
ありがとうございます!
できました。

263:デフォルトの名無しさん
22/05/07 22:39:06.01 A4G1I3Hd.net
$idContents = $html.getElementById($idName).innerHTML
でinnerHTMLを取得して、$idContentsに格納してある「src」の値(src="https://~~.jpg)はどうやって取得するのでしょうか?

264:デフォルトの名無しさん
22/05/07 23:18:18.03 aihC1Ap7.net
innerHTMLは使わない
getAttribute("src")を使う

265:デフォルトの名無しさん
22/05/08 11:03:41.82 KUDJnBX7.net
$idContents = $html.getElementById($idName).getAttribute("src")
で試したのですが、$idContentsの中身は何もない状態です。
試しに、$idContents = $html.getElementById($idName)だけで実行すると、
$idContentsの中身に
innerHTML : <IMG id=img src="https://~~jpg/keystamp=~~;></A>
はあります。

266:デフォルトの名無しさん
22/05/08 12:11:23.98 q3KU1av3.net
$idNameは'img'なのか?

267:デフォルトの名無しさん
22/05/08 12:17:10.62 KUDJnBX7.net
$idNameは'img'ではなく、'kr3'になります。

268:デフォルトの名無しさん
22/05/08 12:25:56.66 q3KU1av3.net
だから取得したいのは、id=imgのIMGタグにあるsrc属性値じゃないのか?
$idNameを'img'にしろよ

269:デフォルトの名無しさん
22/05/08 12:30:38.21 vSiZdN2k.net
ID:KUDJnBX7はバカなんだろうね

270:デフォルトの名無しさん
22/05/08 12:47:35.64 KUDJnBX7.net
>>264
なるほどです。ありがとうございました。

271:デフォルトの名無しさん
22/05/09 13:37:41.35 Plp0Diry.net
特定のフォルダの中にファイルが10個以上あったらタイムスタンプが一番古いファイルを削除する処理をPowerShellでどう書くかどなたか教えろください。。
スクリプトはタスクスケジューラで日次で走らせるイメージです。

272:デフォルトの名無しさん
22/05/09 13:54:29.50 7AqNU3U0.net
一番古い一個だけを削除?それとも9個残して削除?

273:デフォルトの名無しさん
22/05/09 14:11:58 I+mG682T.net
URLリンク(teratail.com)

274:デフォルトの名無しさん
22/05/09 16:57:08.12 Plp0Diry.net
>>268
一番古い一個だけを削除か、最新の9個を残してそれ以外を削除、の簡単な方でお願いしたいです。

275:デフォルトの名無しさん
22/05/09 17:37:09.13 7AqNU3U0.net
>>270
269の30を9に変更するのが簡単だと思います
一番古い一個だけを消すのは Select-Object -Skip 9 | Select-Object -Last と二回もSelect-Object するのでとても難易度が高いです

276:デフォルトの名無しさん
22/05/09 22:37:25.90 lywqA2G/.net
その質問バッチファイルスレで見たぞ
powershellの回答も貼ってある

277:デフォルトの名無しさん
22/05/10 00:05:58.23 aI8FHZ+3.net
【.cmd】 バッチファイルスクリプト %14 【.bat】
スレリンク(tech板:757番)-764
漏れが763 に、Ruby で書いた。
これをPower Shell(PS)用に書き直せばよい
764には誰かが、PSで書いている

278:デフォルトの名無しさん
22/05/10 01:07:57.29 0qiVBd6f.net
Multicsだったのか

279:デフォルトの名無しさん
22/05/10 23:04:11 gcxSlYEt.net
フリーランスエンジニアになってからの年収推移を公開【現在年収1000万】

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

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

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

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

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

フリーランスのエンジニアやるなら45歳までに貯金5000万円作れないと死ぬ説

280:デフォルトの名無しさん
22/05/12 17:12:26 QXSbgRzq.net
フォルダ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

281:デフォルトの名無しさん
22/05/12 18:00:29.84 J4rOXsT5.net
if やらforやらはBASICからやり直せ

282:デフォルトの名無しさん
22/05/12 18:08:53.97 3e5cbbRq.net
>>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}

283:デフォルトの名無しさん
22/05/12 18:27:26.96 ZUpAZ75N.net
PowerShellで複数アイテムに同じ処理をする場合は、アイテムをリストアップした出力をパイプでForEach-Objectに渡して
ForEach-Object の中で、一個ずつ($_ という変数で参照できる)処理するのが定番と思うの。
get-childitem | foreach-object { write-output $_.fullname $_.name }
とりあえず、これをやってみると感じが分かると思うの。

284:デフォルトの名無しさん
22/05/12 20:27:03 QXSbgRzq.net
>>278
ありがとうございます。
ただ、フォルダAにファイル2つ置いて試してみたのですが、いずれも圧縮・移動されませんでした。。。
再度ご確認いただけますでしょか??

285:デフォルトの名無しさん
22/05/12 22:15:13.98 3P57KS6y.net
何だその言い方
お前周りから嫌われてると思うぞ

286:デフォルトの名無しさん
22/05/12 23:17:43.20 TAn4nFm7.net
ここは労働の場じゃないからな
金のやり取りを伴ってる仕事とは違うのになんでお客様気分丸出しでいられるんだよ

287:デフォルトの名無しさん
22/05/12 23:26:53.76 C4APGYH2.net
誰かが持ち上げてくれるからじゃないの

288:デフォルトの名無しさん
22/05/12 23:56:30.38 z9H8Cfuc.net
>>280
Compress-Archive の使い方(パラメーターの指定方法)は分かってますか?
ファイル一個だけで試してみましたか?
それを調べてから
Get-ChildItem -path "C:\folderA" -File | ForEach-Object {
Compress-Archive -LiteralPath $_.FullName -DestinationPath ("C:\folderB\" + $_.Name + ".zip")
}
これの意味を考えてみてください。

289:276
22/05/13 00:26:01.86 /s7ZcOSV.net
解決しました!ありがとうございます!

290:デフォルトの名無しさん
22/05/13 03:41:22.40 tKRLPzFb.net
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 }) # 圧縮

291:デフォルトの名無しさん
22/05/13 15:56:54.19 LpRC3aDE.net
gciとかの-forceパラメータって必須だろうに
デフォでオフなのがなんだかな

292:デフォルトの名無しさん
22/05/13 19:23:39.98 Sc/EfT9l.net
わざわざ隠し属性で隠してるのにディフォで表示しろとか頭おかしい

293:デフォルトの名無しさん
22/05/13 22:56:09.66 uctr9r2r.net
foreach中に最後の要素でないって判定どこかでできないですか
これができなくてforに書き直すはめになること何回もあるんですけど…
Foreach-Objectの場合もあったらお願いします

294:デフォルトの名無しさん
22/05/13 23:28:29.60 dqCr6D+p.net
原理的に無理だろ...

295:デフォルトの名無しさん
22/05/14 00:16:48.73 5a0Y4MKv.net
最後の要素でないってどういう目的で知りたいの?
本当に知りたいときもあるけど慣れてない人が書きがちなコードでもあるので気になった
カンマ区切りにするために最後ならカンマを付けない分岐を書くとかそういうの

296:デフォルトの名無しさん
22/05/14 00:17:48.74 hb3+ANgg.net
カウンタを用意してforeach対象のコンテナのlengthと都度比較する
これがモダンプログラミング()

297:デフォルトの名無しさん
22/05/14 00:27:25.14 hb3+ANgg.net
>>291
次の処理の前準備を現在の要素も使ってやってて最後だけ不要なとき
$i = 0
foreach ($item in $list) {
 # $itemの処理
 #
 if (++$i -lt $list.length) {
  # 前準備
 }
}
これなら普通にforのが見やすい

298:デフォルトの名無しさん
22/05/14 05:45:14.69 NJOQ17Ts.net
そういう最後だけ処理が違うってのは同じように処理しといて後から取り除く方が良くね?
二度手間で美しく無いように思えるけれどそれよりも
一々「最後かどうか」の判別に毎回if挿む方がバカらしく感じる

299:デフォルトの名無しさん
22/05/14 05:57:00.05 0bRjAEIy.net
前準備ってなにさ

300:デフォルトの名無しさん
22/05/14 06:07:55.24 Wt4JCGPH.net
>>291
> カンマ区切りにするために最後ならカンマを付けない分岐を書くとかそういうの
そう言うのは最初以外はカンマを頭に付けるようにしたほうがいいかと

301:デフォルトの名無しさん
22/05/14 08:23:02.72 m7B1u9M5.net
カンマ区切りしたいだけなら $list -join ',' で十分だな

302:デフォルトの名無しさん
22/05/14 09:47:46.73 R8RMhLQi.net
そう、joinで済むんだよね
慣れてない人はフラグや分岐で処理しがち
だからまずは具体的にどんな処理をしようとしてるのか聞きたかったんだ

303:デフォルトの名無しさん
22/05/14 10:32:45.51 kcOGS6gO.net
カンマの話は>>291が勝手に言ってるだけなのにjoinですむとかあたおかかよw

304:デフォルトの名無しさん
22/05/14 11:19:53.60 0bRjAEIy.net
いや分からないから聞いてるのよ

305:デフォルトの名無しさん
22/05/14 11:23:04.66 etUAy71A.net
ID変わってるけど291=298な
判定する必要のない例としてカンマ区切りを挙げて、だから具体的な例を教えてくれと書いたのに、カンマ区切りのうまいやり方をレクチャーしてくれる人が出てきたから説明しただけよ

306:デフォルトの名無しさん
22/05/14 12:41:49.36 HwJxcgzF.net
>>294
後から取り消せないこともあるだろう
例えばライトワンスメディアに書くとか

307:デフォルトの名無しさん
22/05/14 13:05:47 Ws3jUYfQ.net
具体的な処理が分からんとどうしようもないだろ
準備じゃなくて、準備のための情報の保存にすることならできるんじゃないか
#itemの準備
#itemの処理
#次のitemの準備のための設定
として実際の準備は次のループの先頭で行うようにする

308:デフォルトの名無しさん
22/05/14 13:37:46 hb3+ANgg.net
はあ…やっぱり論点ズラしで無いことを正当化する流れになったかw
無いなら無いでいいよ

309:デフォルトの名無しさん
22/05/14 13:39:58 HwJxcgzF.net
>>289
最初、最後、何番目などには別処理をする場合は、foreachは向いてないというか
もともと for があって、何番目かを気にせず全部の要素に同じ処理をすることが多いので、そういう場合用に foreach があると思ってます

310:デフォルトの名無しさん
22/05/14 14:20:17 lDPvxjtF.net
>>304
無いことを正当化してる書き込みは見当たらないけどどのレスのこと?

311:デフォルトの名無しさん
22/05/14 15:09:44.46 Y4vxLItZ.net
だからforeachでは原理的に無理
foreach($item in $items){ ... }
はざっくり
$e = $items.GetEnumerator();
while ($e.MoveNext()) {
$item = $e.Current;
...
}
みたいなコードになるから$e.MoveNext()を呼ぶまで最後かどうかはわからない
極端な話、乱数で最後にするかを決めるような実装されたらどうしようもない

312:デフォルトの名無しさん
22/05/14 16:18:41 YaxyXfsS.net
最後の要素って$list[-1]でいいんじゃないの?
if($item -ne $list[-1]){前処理}でいけると思うけど

313:デフォルトの名無しさん
22/05/14 18:19:29.97 POYL5zWo.net
<section id="image-test">
<a href="URLリンク(www~BBB.jpg">)<)
</a>
</section>
があって、AAAとBBBのURLをそれぞれ変数にかくのうしたいのですが、これであってます?
$AAA = $web_source_code.getElementById("image-test").getAttribute("src")
$BBB = $web_source_code.getElementById("image-test").getAttribute("href")

314:デフォルトの名無しさん
22/05/14 18:55:56.30 QtW6yb+i.net
合ってないよ
section要素にはsrcもhrefもないんだから取れない
子や孫の要素からイイ感じで取ってきてくれるような期待をしてるんだろうけど、内側がどんな構造でいくつのimg要素とかがあるのかわかんないんだから、そんなのでイイ感じに取られる曖昧な挙動は逆に困る
要素をid指定で取ったあと.ChildNodesで自分で辿ったりする必要がある
querySelectorが使えれば楽なんだけどね
何度も似たような質問を繰り返すよりもまずHTML DOMの基礎を多少でも勉強しないとずっとハマるだけだし応用もできないよ

315:デフォルトの名無しさん
22/05/14 19:43:46.46 POYL5zWo.net
ありがとうございます。HTML DOMを勉強してみます。

316:デフォルトの名無しさん
22/05/17 11:55:50.17 w1KKtOUX.net
PowerShellである処理について、変数の値だけ変えてそれぞれに同じ処理を実行したい場合、以下のように変数の値の数だけ実処理を複数段書けば実行できました。
ただ、これだとスマートではないと思いますので、ループ処理?のような形で最初に全変数を定義する等して、実際の処理自体は1か所だけにしたいのですが、どなたか書き方教えろください。。
------------
$変数a1 = 1-a
$変数b1 = 1-


317:b ~~処理~~ ------------ $変数a2 = 2-a $変数b2 = 2-b ~~処理~~ ------------ $変数a3 = 3-a $変数b3 = 3-b ~~処理~~ ------------



318:デフォルトの名無しさん
22/05/17 15:36:54.01 VMMgADOG.net
コンテナでググれ

319:デフォルトの名無しさん
22/05/17 19:17:50 ZA1GChKV.net
ググれとか言う奴はスレから出ていけ

320:デフォルトの名無しさん
22/05/17 20:03:10 xbjGOtM1.net
配列でループ処理するといいぞなもし
URLリンク(docs.microsoft.com)

321:デフォルトの名無しさん
22/05/18 03:24:17.13 CLYU5EG2.net
こんな初歩の初心者にpowershellの配列は難しい気がする
別の規格がちゃんとしてる言語を1つでも履修して出直してもらいたいな
プロの俺でもフィルタ関連とか関数から返した場合とかでしょっちゅう間違えるんで…

322:デフォルトの名無しさん
22/05/18 09:11:28.21 b9KxG2vQ.net
ベテランでも諳んじて一発正解するのは難しいかったりするけど、シェルなんだから試行錯誤で構造化プログラミングの感覚を摑めばいいと思うよ
固定長配列でハコとして使う分には落とし穴もそうないのでは
パイプは使うかもしれないし使わないかもしれない
せっかくの気付きなんだから試してみるチャンス

323:デフォルトの名無しさん
22/05/18 10:26:21.69 Q05gEBgM.net
まずforeach文で作ってみればいい、そんな難しくはない
foreach-objectとかのコマンドレットにしたい、てのは次の段階にしてみよう

324:デフォルトの名無しさん
22/05/19 01:52:14.72 r92G1leA.net
.NETのジェネリックなコレクションを使う癖を付ければpsの変な仕様に振り回されないで済むかも

325:デフォルトの名無しさん
22/05/19 10:22:09.77 hhrIPFsF.net
そもそも配列やコレクションをループで回したりするのはPowerShell的な発想ではない
積極的にパイプを使うんだよ
それに馴染めないならもうインラインでC#書いたほうがいい

326:デフォルトの名無しさん
22/05/19 11:54:46.82 AWcD8iuw.net
初学者がパイプの意味を理解するのはハードル高いと思う
コードが長くてもいいから自分のやりたいことをロジックにして組み立てる
それも出来ないうちからパイプでかくなんてさらに混乱するだけ
コマンドレットを見てすぐ処理を想像できるような慣れてる人ならいいと思うけどね

327:デフォルトの名無しさん
22/05/19 12:11:52.45 vDWzHeJO.net
>>320
ドトネトのコレクションはそのままパイプに突っ込めるでしょ
powershellのビルトイン配列(System.Array)をMS公開文書通りに使ってるとハマりやすいという話

328:デフォルトの名無しさん
22/05/19 12:19:41.05 HGJ493WX.net
初心者ですでにスクリプトも書いていてリファクタの相談なのに、パイプ使わないならC#でって…
原理主義なのか話を聞かない人なのか柔軟性が動脈硬化起こしてる人なのか

329:デフォルトの名無しさん
22/05/19 14:36:52.46 mIjloFOo.net
パイプに拒絶反応してる奴らがわらわらとw


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch