[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 09/03 04:39 / Filesize : 313 KB / Number-of Response : 1023
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

PowerShell -Part 6



1 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:36:12.07 ID:LaQ04ZoE.net]
前スレ
PowerShell -Part 5
https://mevius.5ch.net/test/read.cgi/tech/1615994992/

次スレは>>980が立ててね!!

2 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 19:10:00.19 ID:DaRcZGJS.net]
>>1

3 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 11:59:52.53 ID:5Cl7umfN.net]
>>1posh

4 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 16:10:21.28 ID:8dPt5mlU.net]
>>1
BathyScaphe利用開始記念書き込み


5 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 00:21:49.24 ID:CBYlGRMr.net]
今までコマンドプロンプトを使っていましたが、windows power shellに乗り換えました。

コマンドプロンプトでは、エクスプローラーからドラッグ&ドロップでファイルパスが入力できましたが、
windows power shellではできませんでした。
ファイルパスを楽に入力する方法はないんでしょうか

6 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 09:30:47.39 ID:zynXt0BH.net]
普通にできるけど

7 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 15:17:37.72 ID:1Rki5Xrp.net]
ドラッグ&ドロップを扱うのはコンソールの仕事なんじゃ?

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

wtで試すと何れのシェルでもファイルのD&Dは受け付けなかった、異常に高機能なのに意外
wtのことならwtスレで聞くといいかと

8 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 15:25:50.87 ID:1Rki5Xrp.net]
追伸
wtはexplorer上でファイルをコピーしてctrl+[shift+]vでペーストするとファイル名が入力される

D&Dにこだわる理由がないなら慣れた方が早そう、労力は大して変わらないだろう

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

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



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

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

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

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

15 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 16:04:56.07 ID:x/upE6G9.net]
>>14
ああなるほど、それなら納得

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

17 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 08:44:56.08 ID:mFRfNBZm.net]
Allow dragging files or folders into Terminal's Command Prompt window to display their path #12377
https://github.com/microsoft/terminal/issues/12377

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

19 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 20:24:23.06 ID:wkvlg9SU.net]
まちがえた→[object]$val

教えたがりおじさん見苦しい

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



21 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:00:01.99 ID:LHZaRsEg.net]
木のテキスト表現がカッコや""等ならbalancing groupでパースするのが便利だよ

perl/Pythonよりdotnetのパターン言語の方が強い(丸パクリだから当然だけど)

22 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:10:34.21 ID:LHZaRsEg.net]
組み込み型はスプラッターしちゃうとか罠多いから、内部でキッチリ階層持ちたいなら>>18みたいなロートルな手段が堅牢だったり

仕様覚えるという道もあるけど俺は諦めた

23 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:27:40.62 ID:U3xoo538.net]
逆説的だけど、.NETに詳しくない俺みたいな人ほどテキスト処理は抑えておくべき

なんか良く分からん物が返ってきても、オブジェクトの印字表現をOut-Fileで捕まえてテキスト処理にフォールバックできる()

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

25 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 23:31:15.02 ID:+zCOrMmD.net]
一見不器用でもインデントレベルは素直に数えるのが正解
例えばpythonインタプリタもカウンタを使って構文をパースしてる

yaml系のシリアル化フォーマットは、インデントを数えるだけでパーサが書ける移植性が売り

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

27 名前:915 mailto:sage [2022/02/25(金) 01:33:26.38 ID:wLKzA9jy.net]
変数を文字列の中に入れ込んでしまって、消せないフォルダが出来てしまいました

C:\works\+ $a

削除もリネームもフォルダ移動すら出来ません
どうすれば削除出来ますでしょうか?
お知恵を貸してください

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

29 名前:915 mailto:sage [2022/02/25(金) 07:49:52.49 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 08:55:58.66 ID:Ex9z+jLY.net]
うちの環境では削除できた
なんかのプロセスにロックされてるんじゃないの?



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

32 名前:915 mailto:sage [2022/02/25(金) 11:29:32.26 ID:omaqMYjV.net]
>>31
これは失礼しました
エラーは下記です。普通の名前のフォルダは削除出来ます

Remove-Item : 引数 '$null' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:1
+ Remove-Item + $a
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Remove-Item]、ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

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

34 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 11:40:38.52 ID:Ttq2k6xT.net]
>>32
> ’C:\works\ + $a‘ としてしまった
んなら

Remove-Item ’C:\works\ + $a‘
ってやれよ…

35 名前:915 mailto:sage [2022/02/25(金) 12:06:55.57 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 12:16:43.02 ID:SH4WT7RG.net]
コマンドプロンプトを管理者権限で起動
rd /s /q エクスプローラーから対象フォルダをD&D

これで無理なら排他制御キャンセルするソフト使うかPCを一旦再起動

37 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 12:24:59.94 ID:Ttq2k6xT.net]
>>35
> Remove-Item : パス 'C:\works\ + $a '
$a の後ろの空白

38 名前:915 mailto:sage [2022/02/25(金) 12:30:35.39 ID:omaqMYjV.net]
>>36
ありがとう御座います

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

Dirコマンドでは+ $a は表示されておりエクスプローラでも見えてるのですが何故か認識されないです

39 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 12:36:38.88 ID:yKl3/QUV.net]
コマンドで消したいだけならワイルドカードやタブ補完で選択すればいいじゃない

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

何がしたいのか分からん

40 名前:915 mailto:sage [2022/02/25(金) 12:42:21.42 ID:omaqMYjV.net]
>>37
空白で思い出しました
試行錯誤してて
'"C:\works\' + $a + '\"'
のような事もやってました

なので(なのかどうかも分かりませんが)フォルダの名前には + $a と後ろにも空白が入っています



41 名前:915 mailto:sage [2022/02/25(金) 12:44:41.55 ID:omaqMYjV.net]
>>39
エクスプローラからの削除だと削除後も+ $a フォルダが残り続けます

やりたい事: + $a フォルダを削除したい

42 名前:915 mailto:sage [2022/02/25(金) 12:48:15.22 ID:omaqMYjV.net]
追記正確なフルパス名
[]は半角スペースです

C:\works\[]+[]$a[]

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

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

45 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 13:04:14.85 ID:AEqwOQnl.net]
C:\worksごと消せばいい

46 名前:915 mailto:sage [2022/02/25(金) 13:06:19.04 ID: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 mailto:sage [2022/02/25(金) 13:07:15.53 ID:omaqMYjV.net]
上記 $y → $a です
すみません

48 名前:915 mailto:sage [2022/02/25(金) 13:10:23.66 ID:omaqMYjV.net]
>>44
saでも変わらずでした

>>45
>>46の1.1と同じでした

49 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 13:11:33.74 ID:AEqwOQnl.net]
フォルダが消したいだけならPowershell関係ないからこちらでどうぞ

Windows 10 質問スレッド Part82
https://mevius.5ch.net/test/read.cgi/win/1644831539/

50 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 13:17:48.06 ID:MEIpOner.net]
\\?\C:\fogo



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

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

53 名前:デフォルトの名無しさん mailto:sage [2022/02/25(金) 20:58:43.73 ID:FVUZxr5Y.net]
dir "*a*" | % {remove-item -LiteralPath $_.Name}
でどうだろうか

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

55 名前:915 mailto:sage [2022/02/26(土) 12:47:40.66 ID: ]
[ここ壊れてます]

56 名前:AL/cEm3C.net mailto: ありがとうございます。
レス遅くなりました。以下のように返ってきました。
>>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
[]
[ここ壊れてます]

57 名前:915 mailto:sage [2022/02/26(土) 12:47:51.62 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 13:19:35.91 ID:zbGeAZZp.net]
Win10の質問スレ行けって言ったのに何故行かないのかな?
powershellに拘る理由がわからないよ

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

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

これ全部試せ

59 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 13:34:00.21 ID:DA2+bsLA.net]
これ本来含まれないはずの+が含まれてるから消さないんでしょ

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

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

多分PSでどうこうできる領域じゃない
再インストールが一番早いかもw

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



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

62 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 14:54:37.65 ID:+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 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 15:18:46.03 ID:1IWc50so.net]
cmdを起動して
rd "\\.\C:\works\ + $a "

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

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

66 名前:915 mailto:sage [2022/02/26(土) 16:01:12.94 ID:AL/cEm3C.net]
>>62
>>64
消えました!!凄い!!!
ご教示頂きました皆さん本当にありがとうございます!

67 名前:915 mailto:sage [2022/02/26(土) 16:04:31.69 ID:AL/cEm3C.net]
因みに rd “\\?\〜“ってどんな意味でしょうか?

68 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 16:07:54.37 ID:EUVpr27z.net]
文字列解析を無効化する名前空間
https://docs.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file#maximum-path-length-limitation

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

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



71 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 19:13:10.48 ID:kQiC9zng.net]
-LiteralPathが多分必要

72 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 20:14:14.01 ID:+OtunY2h.net]
ri -lp '\\?\C:\Users\ore\sandbox\trailing 'で消せた
そもそも-literalpath指定無しには正しくない名前のファイルは作れないようになってる

標準のFileSystemプロバイダは静かに切り詰めるようだけど、できればエラーにしてほしいところ

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

74 名前:デフォルトの名無しさん mailto:sage [2022/02/26(土) 20:28:51.97 ID:HRmzshO4.net]
各々のプログラムのモラルに任せられてるのが残念なところ
pwshからコマンドレットを使う限りはうっかり変なもの作るの阻止してくれるのが救いか

linux/mac上ならそもそもOSがハネてくれるのでpwshで余計なチェック挟む必要もないのだけど

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

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

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

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

79 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 10:01:03.24 ID:1ziskyp5.net]
>>77
76は>>75への返信

80 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 13:10:38.48 ID:5+6VAuli.net]
試す気はないけど
>>64で再現できるんでね?



81 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 14:17:24.11 ID:9W2zYqHy.net]
そりゃあえて迂回したらな

Test-Path -IsValidは信頼できるのだろうか?
中身分からものに頼るよりendswith(". ")とかで自分でバリデーションするべきか

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

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

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

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

86 名前:デフォルトの名無しさん mailto:sage [2022/02/28(月) 15:40:26.92 ID:9W2zYqHy.net]
>>82
これな
考えれば考えるだけボロが出てくるし思考放棄することにした

行儀悪いプログラムの後始末のやり方だけ知っときゃいいのよ
(真剣な仕事でなければ)

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

88 名前:デフォルトの名無しさん mailto:sage [2022/03/01(火) 03:09:34.84 ID:L/ghTddK.net]
>>82
これは瑕疵ではない、仕様とMSは一応言ってるんじゃね?

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

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

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

つまり何もチェック(今回の例なら末端にスペース入ってないか)せずにAPIに渡すと
結果として>>29のようなことが起き得ると

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

90 名前:デフォルトの名無しさん mailto:sage [2022/03/01(火) 13:31:53.46 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/03/01(火) 13:42:53.50 ID:fDW5QBJr.net]
ファイル名の末尾の英字取って
3---.txt
3-1-.txt
4---.txt
4-1-.txt
としたら
3---.txt
3-1-.txt
4---.txt
4-1-.txt
になったけど意味が判らない
変なバグに遭遇した気分

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

93 名前:デフォルトの名無しさん mailto:sage [2022/03/01(火) 22:49:13.37 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 17:07:09.87 ID:HFEr6ITo.net]
>>92
めっちゃ参考になった
ありがとう

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

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

97 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 21:57:57.51 ID: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 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 21:59:03.05 ID:Gj5Erajd.net]
$Table = "List"
$ArrCol = @("No","Name","Gender")
$ArrRecord = @("1","山田","男")

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

100 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 00:11:25.85 ID:Ai6V8ofW.net]
どこでどんなエラーが出てるのか分からないし試してないけど
文字列の中で配列変数をそのまま展開してるのが原因なんじゃないかな。

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

※余計なお世話だろうけどインジェクション対策がないので必要なら入れてね。
 (SQLiteがサポートしてるか知らないけど通常はSQLパラメータを使用。)








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<313KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef