dupchecked22222../4ta/2chb/669/41/tech170124166921750441137
PowerShell -Part 7 ->画像>1枚 ◎正当な理由による書き込みの削除について: 生島英之とみられる方へ:
PowerShell -Part 7 ->画像>1枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1701241669/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
ドライバのinfファイルに署名がない古いハードを使うために
オレオレ証明書を作って勝手に署名する方法があるが
ググって出る手順のままではダメでいまはWindows Design KitとWindows SDKが必要で
SDKにあるmakecertコマンドはマイクロソフト公式に推奨されないとも…
PowerShellでできるからということらしいがどう使ったら同じ結果になるかはわからなかった
makecertのような非推奨コマンドと1対1のPowerShellでの使用例ってどこかにないだろうか
今後同じような事態に陥った時のため備えておきたい
マイクロソフトのサイトにはオプションの説明はあるけど
makecertとの対比表とかはない
powershell関係あるのかしら
古い環境そのものやP2V化して動作確認取れる環境を保存していくのが簡単だよ
ドライバへの署名はあくまで1企業の都合という事をお忘れなく
直下にあるファイルをgciの-Includeでフィルタリングしつつ取得する際に
Get-ChildItem -Include *hoge*.txt
はだめで
Get-ChildItem -Recurse -Include *hoge*.txt
-Recurseを入れると動くのはなぜですか?
サブディレクトリを含まない直下のみのファイル検索なら-Recurseなしでもいける認識なんですが間違ってますか
>>4 gciで-Includeを使う場合gciに与えるデフォルト引数としてアスタリスク「*」を含んだパス名が必要なんだよ特に書いてないけど
つまり「Get-ChildItem -Include *hoge*.txt *」で意図通りになるはず
というかね、-Includeなんか忘れていい。フィルタならwhere-objectでやった方が判りやすい
gci | where Name -like "*hoge*.txt"
コマンドレットは変な仕様が多いから妙だな…と思ったらそれ以上深入りする必要はない
そもそもワイルドカードの単純なフィルタならデフォルトの-pathでできるから-includeとか基本使わないな
learn見たら「-includeは-pathの末尾が*じゃないと動かない(-recurseなら省略可)」ってはっきり書いてたわ
ファイルシステム側に検索オプションを指定するのが-Filterで
PowerShell自信でフィルタリングするのが-Includeだっけ、懐かしい話だ
gciの表示が間延びしてるのを詰めたい
ModeとLastWriteTimeにあんなに幅いらんやろ
4ですみなさんありがとうございます
当然質問する前にLearnで確認していたのですが、てっきりワイルドカードも使えるよ!ぐらいのニュアンスだと思っていました
大人しくwhere-object使います。すっきりしましたm(_ _)m
>>8 Format-Table -AutoSize
すまんコマンド追加で整形したいんじゃない
デフォルトの形式をいじりたい
Get-FormatData -TypeName 'System.IO.*' -PowerShellVersion $PSVersionTable.PSVersion | Export-FormatData -Path fd.ps1xml
gc .\fd.ps1xml | % { $_ -replace '7', '5' } | % { $_ -replace '26', '20' } | % { $_ -replace '14', '12' } > fd-mod.ps1xml
Update-FormatData -PrependPath .\fd-mod.ps1xml
としてみたら全然違う結果になってしまった
出てきたものの数字を変えるだけじゃだめなのかな
なぜTable形式でなくList形式になるのでしょうか
ファイルとディレクトリが混ざってるからだった
あとは日付と時刻を詰めたい
引数付きエイリアスの作り方を教えてください
'ABC' > file
tar -c -f - file | tar -x -O -f - file
の 「tar -x -O -f」 をエイリアス tarout にして
tar -c -f - file | tarout - file
として使うにはどうするのでしょうか
できない
そういうのはfunctionとかfilter作ってやる
そこまではたどり着いたのですが苦戦しています
正直言って手も足も出ません
どうすればよいのでしょうか
何がしたいのか知らんけどpowershellのパイプはオブジェクトに変換しないとだからtarが期待する入出力にはならんだろうな
ほれ
function tarout {
tar -x -O -f $args
}
tarout - file
>>0020
それは最初に自分で試してだめだったやつですな
パイプでなく標準入力を読もうとしてCtrl-Z待ちで止まるやつ
Windows 10 から tar.exe あるんで試してから回答してもらえると嬉しい
>>0021
PowerShellからネイティブは通る
ネイティブからネイティブは通る
ネイティブからPowerShellは通らない
だからPowerShellでtaroutは書けないってこと?
だとしたらPowerShellくそすぎる
一応整理
PS 1> 'Success' > testfile
PS 2> tar -c -j -f test.tar.bz2 testfile
PS 3> Get-Content -Path test.tar.bz2 -AsByteStream | tar -x -O -f - testfile
Success
PS 4> tar -c -j -f - testfile | tar -x -O -f - testfile
Success
PS 5> . { tar -c -j -f - testfile } | tar -x -O -f - testfile
tar.exe: Error opening archive: bzip decompression failed
PowerShellからのバイトストリームはネイティブに通る (PS 3>)
ネイティブからネイティブもバイトのまま壊れずに通る (PS 4>)
ネイティブからPowerShell(経由でネイティブ)は通らない (PS 5>)
だからPowerShellでtaroutは書けない
Start-Processで頑張れば書けるのかもしれない、知らんけど
進歩はしたがtarout程度に苦労多すぎなPowerShellはくそ
beginブロックで$inputを使うとバイトストリームが出てくるようになって欲しい
そしたらtaroutもこう書けるようになるのに
function tarout { begin { $input | tar -x -O -f $args }}
でもこれは難しいだろうな
beginじゃない別のキーワード用意するレベルじゃないと難しいだろうなぁ
いやbeginブロックで十分でしょ
今はbeginブロックの$inputは無意味なんだから有効活用
難しいと思うのは
・beginブロックに$inputがあったら、そのfunction,ScriptBlockにパイプでバイトよこせマークをつける
・バイトよこせマークがあったらパイプラインでネイティブコマンド扱いしてバイトを流す
処理が必要だからで・・・難しく・・・な・・・い、かも
本気で難しくないと思うならお前が実装してPR送れよ
公式で7.3にもなって直してないんじゃそんなのを気にしてるのは少数派なんだろ
むしろお前が動くしかなかろうよ
個人的にはpythonのライブラリ群をそのままPSObjectにぶっこ抜きして動かせるようにして欲しい
>>30 なんかそのスレッドはpython使いの声がでかいのかpython主導でpython起動すりゃいいだろ的な話がされてて俺の意図とは違うな
俺の考えはそれとは真逆でpythonの便利ライブラリだけpowereshellで拝借してキモいpython処理系自体を入れたくないのよね
俺の言いたいこと判るよね
キモいpython処理www
キモいのはpowershellじゃぼけww
>>32 たしかにpowershellもキモいと言えばそうだがpythonとはキモさのベクトルが違うんだよ
>>30にはいい事も書いてある
>PowerShell チームに対して、これらの Python ライブラリをネイティブ PowerShell パッケージの一部として直接実装するよう求めているのであれば、私は同意しなければなりません。
いずれこういう俺と同じ考えを持つ輩がpythonライブラリのぶっこ抜きに成功し
キモいpython処理系が駆除された明るい未来を創り上げてくれる事に期待している
$null | %{'hoge'+$_}
これでなんでhogeが出力されるんですか?
Nullになるかとおもったんですが
型を合わせるために、NULLが空文字に変換されるから。
そこでNULLを期待するのはRDBとかの場合だね。(RDBにもよるけど。)
>>35 なるほど
ありがとうございます
ためしに
$null | %{$_+$hoge}
にしたらNullになりました
+演算子の左辺の型に合わせて右が型変換されるんですね
…PowerShellは難しい
PowerShellでファイルの詳細なプロパティを編集することってできますか?
評価とかタグとか下のurlに載っている300種類ぐらいの拡張プロパティです
Windows プロパティ - Win32 apps | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows/win32/properties/props プロパティの取得だけなら
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$Getfolder = $shell.Namespace($folder)
$Getfile = $Getfolder.ParseName($file)
$Getfile.ExtendedProperty("System.SimpleRating")
これでできたんですけど
プロパティの編集方法は色々調べてみたんですがわかりませんでした
>>40 インストールでちょっとつまづいちゃいましたが
やりたいことができました ありがとうございます!
中見たら7時代のWindows-API-Code-Packとやらを拾ってきて使うのか
本来シェル名前空間からやれそうな事なのにWritePropertyへ辿りつくまでかなり遠回りしたな
ps1ファイルをユーザーに手軽に実行してもらう方法ってないですかね
batだと単にダブルクリックするだけでいいところが、
ps1だとショートカット作って↓↓をくっつけてと、とても運用に耐えられないんですが
「powershell.exe -ExecutionPolicy Unrestricted 」
>>44 ググればバッチファイルにPowerShellスクリプトを埋め込む方法が見つかるよ
>>46 ps1単独で解決できないものか
将来性を考えて、ps1使ってみようと思ったが、
バッチやvbsの助けがないと使いにくいんじゃイマイチだな
ps1はコード署名して、グループポリシーで証明書配付しよう
>>48 そこまでするなら、スクリプトよりexe作った方が早・・・
埋め込むやつって結局iex経由の特殊環境だから一部の変数とか使えなくて困る
無理に使わなくていいよ
横からすみません
>>40 のインストールにチャレンジしたのですが、管理者権限のPowerShellでInstall-ModuleをしたのにImport-Moduleでdllが無いみたいなエラーが出て使えません
どなたかアドバイス頂けないでしょうか
>>52 下のURLの2つのnupkgをダウンロードして、ファイル名の後ろの拡張子を.zipに変更する
https://www.nuget.org/api/v2/package/Microsoft-WindowsAPICodePack-Core/1.1.4 https://www.nuget.org/api/v2/package/Microsoft-WindowsAPICodePack-Shell/1.1.4 ↓
microsoft-windowsapicodepack-core.1.1.4.nupkg.zip
microsoft-windowsapicodepack-shell.1.1.4.nupkg.zip
この2つのzipを適当なフォルダに解凍して、libフォルダその他が作成される事を確認。ここで必要なのはlib配下の*.dllのみ
libフォルダ内の自分のpowershell環境と適合する.NETのバージョンのフォルダから*.dllを取り出してカレントディレクトリに配置
でいけるんじゃないかな
$PROFILE ってなんなのでしょうか
$PROFILE.GetType() だと String のようですが
$PROFILE | Select-Object * で AllUsersAllHosts などが出てくるのがわかりません
$PROFILE | Select-Object * で何が起きているのでしょうか
PowerShellはAdd-Memberでオブジェクトにプロパティやメソッドを追加できる
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/add-member $PROFILE | Get-Member を実行してみればわかるけど
AllUsersAllHostsとかは$PROFILEに追加されたNotePropertyって種類のプロパティ
>>54 中身がPSCustomObjectでない変数にもNotePropertyを設定できる
ただしその変数に他の値を代入するとNotePropertyの情報は消えてしまうから用途は限定される
$a = "aaa"
$a = $a | Add-Member -PassThru "Value" "xxx"
$a = $a | Add-Member -PassThru "Value2" "yyy"
$a # aaa
$a.Value # xxx
$a.Value2 # yyy
$a | select *
$a = "bbb"
$a.Value # $null
('str' | Add-Member -type NoteProperty -Name 'wao' -Value 'Wao!' -passThru).wao
→ Wao!
(123 | Add-Member -type NoteProperty -Name 'wao' -Value 'Wao!' -passThru).wao
→ Wao!
理解した
>>56 Add-Member は変数ではなくオブジェクトにメンバーを追加する
"aaa" と "bbb" は違うオブジェクトなんだから "aaa" に追加したメンバーが "bbb" に無いのは当たり前
ネイティブコマンドの出力ってPowerShell界に入るとString列になるけど
Stringのそれぞれにプロパティで元のバイナリ付けて欲しい
バイナリが通るようになったのは
「ネイティブからネイティブ」と「PowerShellからネイティブ」だけ
「ネイティブからPowerShell」に手軽にバイナリ通したい
バイナリ出力ネイティブ | バイナリ入力ネイティブ
として使うバイナリ入力ネイティブ用にラッパーが書きたいのに今は書けない
自分には必要ないから触れなかったけど
バイナリ出力ネイティブのラッパーも書けない
引数に -i を複数回指定したいので param() を使わずに function を書いています
get-help で SYNTAX に使い方を表示するにはどうすれば良いのでしょうか
about_Comment_Based_Help
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_comment_based_help?view=powershell-7.4 このページの中の項目で
スクリプト モジュールでのコメント ベースのヘルプの構文
コメントベースのヘルプ キーワード
関数のコメント ベースのヘルプ
関数構文でのパラメーターの説明
スクリプトのコメントベースのヘルプ
あたりが参考になるかも
paramを使わずにSYNTAXを表示する方法を尋ねたのはそこを見たからでして
方法がありましたら具体的にご教示くださいませ
そもそもなんで -i を複数回指定したいんだろう
引数$i の型を配列にするのとは違うの?
ffmpeg.exeに毎回付けたいオプションがありまして
オプション付きエイリアス代わりのfunctionが欲しかったのです
ffmpeg -f aac -i audio.bin -f hevc -i video.bin -c copy out.mp4
のようにffmpeg.exeと同じ使い方だと嬉しい
ちなみにValueFromRemainingArgumentsで受けようとしても
ffmpeg: Parameter cannot be processed because the parameter name 'i' is ambiguous. Possible matches include: -InformationAction -InformationVariable.
と怒られます
指定する対象はaudioとvideoと決まってるんだから
-aiや-viにすりゃいい
変態的なffmpegのオナニーに付き合う必要はない
いやaudioとvideoに限らんし個数も不定なのよ
audioが言語別複数で、videoはチャプターごとに分かれて、字幕もあったり
結局ffmpegと同じ使い方ができるようにするのが面倒ない
ffmpegはシーケンスが意味を持つ引数になってるのよね
どういう順で記述するかによって適用される範囲が異なってくる
なら引数は$argsで受け取って好きなように解釈したらええがな
だからそうしてるのが理解できないのかな
paramを使わないというのは $args を自分で解釈するということ
その上でparamを使わない場合のget-helpの出力について相談したんだが
聞いた相手が想像を超えたバカだったたようだ
邪魔したな
PowerShellにはPowerShellの流儀があるわけで
それに合わないことをやろうとすれば苦労するのは当たり前
C言語で関数型プログラミングをしたいって騒いでるのと同レベル
・質問者がget-helpのやり方をスレで質問
・そもそもこうすればいいんじゃね?と別解について疑問があがる
・さほど適した別解はないことが判明
・質問者に対して怒り出す
別に苦労したと文句たれてるわけでもないのに質問者がウザ絡みされて気の毒すぎる
助言・回答者に対しキレ散らかすパターン多いな。同一人物か?
PowerShellよりdoskeyのマクロにしたほうが簡単そう
get-helpでヘルプを表示させる
コメントベースのヘルプを記述する
param()を使わない
という条件だったら単純にスクリプトの先頭にコメントベースで
.SYNOPSIS または .DESCRIPTION に「-iが複数使える」旨を書けばいいのでは
もしくは
param()を使わず$Argsを自前で解釈しなきゃいけないので
引数の解釈を構築するついでに
$Args.Countがゼロもしくは -help -h -? /h /?
あたりの引数で独自のヘルプを表示させちゃうとか
まぁ普通に考えたらこうならね?
XMLヘルプファイル用意して参照させればParam()のないfunctionに対し「構文」部分を書ける。
PowerShell標準から外れた「引数に -i を複数回指定」みたいな内容を書けるかは知らん。
国内公式からLenovoのノートPC買ったら何故かISEが英語環境になって意味わからん。
どこに言語設定あるの?当然OSは日本語設定にしてるし、他のアプリも日本語になってる。
これまでLenovoのPCは5台くらい買ってきたのにISEだけ英語になるの初めてなんだが。
そういうのsurfaceでもあったな
OSセットアップ時の国設定が半端に適用された状態だから入れ直した方が早いかも
>>85 Windowsは英語版を日本語に切り替えると日本語にならないところがある
だから日本語版でインストールした方がいい
ちなみにいまどきISEを使っているのもよくわからない
powershell iseってのを知らなかったけど起動したらUIシンプルで美しいな
VSCodeもこれくらいシンプルになってくれんかな
カスタマイズしてシンプルにすればいいと思うよ
俺はどちらかというとVSCodeのほうが機能美を感じる
デフォルトで万人の感性にフィットするモノは存在しない
カスタマイズも嫌なら自分で作るか作らせるか
Class C { $a = '失敗' }
function f { Param([ref]$r); $r.Value = '成功' }
$o = [C]::new()
f ([ref]$o.a)
$o.a
$t = '失敗'
f ([ref]$t)
$t
こんなの聞いてないよ
何が言いたいのかわからないw
コードを実行した結果が書かれてないので
何を言いたいのか知るにはこのコードを実行しなきゃならない
めんどくさいw
$o | Get-Member を実行してみれば分かるけど$o.aはフィールドじゃなくてプロパティだからな
$o.aのgetter( $o.get_a() )の戻り値を関数に渡しても$o.aの値は変わらない
パワーシェルすげえな
仕事がどんどん片付いていくよ
2つのCSV(どちらも同じヘッダー)で両方に一致するデータ行があった場合にその行を2つのCSVから取り除きたいんだけどどうしたらいいの?
ヘッダーがDate,Shop,Sales だとしてユニークな項目がなく全く同じデータが1つ目のCSVに1行、2つ目のCSVに2行あった場合に2つ目のCSVは1行だけ消したい
Where-object だと2行とも消えちゃう
2つのCSVをどうやってwhere-objectに渡してんだよ
その2行が消える間抜けコード晒してみなよ
# CSVファイルを読み込む
$csv1 = Import-Csv -Path 'csv1.csv'
$csv2 = Import-Csv -Path 'csv2.csv'
# CSV1の各行について
foreach ($row1 in $csv1) {
# CSV2の中で一致する行を探す
$match = $csv2 | Where-Object { $_.Date -eq $row1.Date -and $_.Shop -eq $row1.Shop -and $_.Sales -eq $row1.Sales }
# 一致する行が見つかった場合
if ($match) {
# CSV1とCSV2から一致する行を削除
$csv1 = $csv1 | Where-Object { $_ -ne $row1 }
$csv2 = $csv2 | Where-Object { $_ -ne $match[0] }
}
}
# 結果を出力
$csv1 | Export-Csv -Path 'csv1.csv' -NoTypeInformation
$csv2 | Export-Csv -Path 'csv2.csv' -NoTypeInformation
わーいできたー
$csv1=gc csv1.csv
$csv2=csv2.csv
#どうせ全一致ならテキストのまま比較すりゃいいだろ
$i=0
foreach($row in $csv1){
$csv2|%{
$j=$k=0
}{
if($_ -eq $row -and $i -eq 0){
$csv1[$i]=$csv2[$j]=$null
$k=1
}
$j++
}
$i++
}
$csv1|sc csv1.csv
$csv2|sc csv2.csv
$i1 = "csv1.csv"
$i2 = "csv2.csv"
$o1 = "csv1_out.csv"
$o2 = "csv2_out.csv"
gc $i1, $i2 | group readcount | ?{$_.group[0] -ne $_.group[1]} | foreach{$_.group[0] | ac $o1; $_.group[1] | ac $o2; $_.group[0].readcount}
段階を踏まないのは謎だよな
ファイルをコピーする概念もなさそう
これで良かったわ
$csv1=gc csv1.csv
$csv2=gc csv2.csv
$compare=compare $csv1 $csv2
$compare|?{$_.SideIndicator -eq "<="}|% InputObject|sc csv1.csv
$compare|?{$_.SideIndicator -eq "=>"}|% InputObject|sc csv2.csv
CSVファイルに想定外のデータがあることを考慮しないのか
わ仕事早い…
csv1の方はDateがYYYY/MM/DDの10桁固定で
csv2の方はDateがYYYY/M/Dで8~10桁になってて
日付としてみれば同じなんですが1行を文字ででみると違う可能性があります…
後出しですいません
またShopはだいたい一致してるのですが
「ローソン札幌店」と「ローソン札幌」や「ローソンサッポロ」みたいな内容が異なることがあってそこを必ず自前のfunctionの変換リストかましてから比較する予定でした
私の想定を超えるプログラムでfunctionを挟むこともできない
カラムの曖昧さとかは全く興味沸かないなあ自分でやんな
昨日の少し試しましたが
$compare=compare $csv1 $csv2
$compare|?{$_.SideIndicator -eq "<="}|% InputObject|sc csv1.csv
$compare|?{$_.SideIndicator -eq "=>"}|% InputObject|sc csv2.csv
でうまくいきそうです
ありがとうございます
自分でつけてる家計簿からクレジットで相殺してる項目だけ出力したcsvと
三井住友のVpassの明細(ファイルの日付的には翌月)を突き合わせを自動でやって7割ぐらい減ってくれたらいいなと思って
AIにプログラム書かせたらすぐにできるかなと思ったけどAIもまだまだアホでした
土日に頑張ります
目的よりも手段にこだわっていると思われる
テキストファイルとPowerShellだけで、イレギュラーなデータがあるかもしれないデータを操作をするのは、かなり面倒なやり方だぞ。
>>110 はキャラクタセットも気にしてなさそうなんだよな
行比較が出来るようになれば対象が何だろうが応用できるだろ
話はとっくに終わってんのよ
>目的よりも手段にこだわっていると思われる
これまんまお前のことじゃね?
そんなに複雑なら、シェルの範囲を超えている。
Ruby など動的言語の出番
>>106 RubyのCSV では、コンバーターで変換器を自作する
Ruby では、2024-01-01 のみ、Date 型へ変換できる。
2024/1/1,2024/01/01,2024-1-1 は変換できない。
以下のように、自分で変換器・コンバーターを定義すれば変換できる
でも表記揺れは別の処理として、最初に一括して変換した方が安全
require 'csv'
input_csv = <<"EOT"
2024/1/1,2024-1-2
2024/02/01,2024-02-02
EOT
# Date 型へ変換する
proc = Proc.new do |field, field_info|
case field_info.index
when 0 then Date.strptime( field, "%Y/%m/%d" ) # 0列目
when 1 then Date.strptime( field, "%Y-%m-%d" ) # 1列目
else
field # 処理なし
end
end
options = { :converters => proc }
p CSV.parse( input_csv, options )
出力
[ [#<Date: 2024-01-01>, #<Date: 2024-01-02>],
[#<Date: 2024-02-01>, #<Date: 2024-02-02>] ]
PowerShellだと何も考えずにDateTime変換できるのに、Rubyだとそんなに手間かかるのか
もうそんな言語使うの止めて大人しくPowerShell使ったら?
すいません初心者でとんちんかんな質問だったらごめんなさい
PowerShellからarduinoにデータを送ってOLEDで表示するセンサーモニターを作ってます
CPU・GPUの使用率や温度は取り出せて表示できたのですが
FPSってどこからか取り出す方法ってありますか?
使用率や温度と違うのでPresentMonやAfterburnerからGet-Counterで取得する?
とか考えて調べてるのですが分からなくて
とんちんかんなこと言ってたらすいません
できるできない含めて教えてください
基本的に、Go でも、こういうのしかない
2024-01-01
2024-01-01 15:01:01
それか、RFC 3339, RFC 3339 Nano
これら以外を使っているシステムは、バグるからダメ!
>>117 FPSて。要するにモニタのリフレッシュレートが欲しいんじゃろ?
ほれ
$RefreshRate = Get-WmiObject -Class:Win32_videocontroller | Select-Object -ExpandProperty CurrentRefreshRate
>>119 返事ありがとうございます
言葉足らずですいません
頂いた情報は現在設定しているリフレッシュレートが表示されるようです
欲しいデータはGeForce ExperienceやMSI Afterburnerで画面上でオーバーレイさせて
表示しているリアルタイムのFPSとして表示されている数値なんです
FPSやフレームレートで検索してましたがリフレッシュレートでも探してみます
>>119 返事ありがとうございます
言葉足らずですいません
頂いた情報は現在設定しているリフレッシュレートが表示されるようです
欲しいデータはGeForce ExperienceやMSI Afterburnerで画面上でオーバーレイさせて
表示しているリアルタイムのFPSとして表示されている数値なんです
FPSやフレームレートで検索してましたがリフレッシュレートでも探してみます
連投してましたすいません
引き続き皆さんの知恵を貸してください
まずそれらがfps値返すようなAPI持ってるか調べなよ
無いなら値として取得は無理だろうね
fps表示部分が単色ならそのエリアをキャプチャして数字認識でもした方が早そう
>>123 ヒントありがとうございます
APIを調べてみたらNVIDIAにNVAPIと言うのがありました
ここからどうやって取り出すか調べてます
もし良かったらもう少し何かヒントをください
もうpowershell関係ないがPresentMon64に計測対象のPID渡せばfps取得できるみたいね
>>125 はいPresentMonでもFPSを取れるみたいなのは調べました
ただ、今arduinoㇸpowarshellからCPUGPUのデータを
受け取ってたのでそこと一緒に入れる方法が見つけられなくて
Add-Type -AssemblyName System.Windows.Forms
function ConvertShopName([string]$shopName) {
switch -Wildcard ($shopName) {
"ファミリーマート*" { $shopName2 = [regex]::Replace($shopName, "(ファミリーマート)([ ]*)(.*)(店)", { $args.groups[1].value + " " + $args.groups[3].value }) }
"ローソン*" { $shopName2 = [regex]::Replace($shopName, "(ローソン)([ ]*)(.*)", { $args.groups[1].value }) }
"セブンイレブン*" { $shopName2 = "セブンイレブン" }
"マクドナルド*" { $shopName2 = "マクドナルド" }
"すき家*" { $shopName2 = "すき家" }
"Amazonで注文" { $shopName2 = "AMAZON.CO.JP" }
default { $shopName2 = $shopName }
}
return $shopName2
}
if ($Args.Count -eq 0) {
[System.Windows.Forms.MessageBox]::Show("引数にファイルを指定してください", "エラー")
return 0
}
# 家計簿から抽出した csv ファイルを読み込む
$excelData = Import-Csv $Args[0] -Encoding Default -Header "Date", "Shop", "Amount" |
Select-Object @{ label = 'Date'; expression = { [DateTime]$_.Date} }, Shop, @{ label = 'Amount'; expression = { [int]$_.Amount } }
# 引数で指定されたファイルをフォルダパスとファイル名(拡張子なし)に分離する
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($Args[0])
$folderPath = [System.IO.Path]::GetDirectoryName($Args[0])
# ファイル名から日付に変換する
$targetDate = [DateTime]::ParseExact($baseName + "01日","yyyy年MM月dd日", $null)
# 引数と同じフォルダにある Vpass からダウンロードした csv ファイル(ファイル名は翌月) を読み込む
$vpassFile = $folderPath + "\" + $targetDate.AddMonths(1).ToString("yyyyMM") + ".csv"
$vpassData = Import-Csv $vpassFile -Encoding Default -Header "Date", "Shop", "TotalAmount", "Type", "Count", "PaymentAmount", "ShopDetail" |
Select-Object @{ label = 'Date'; expression = { [DateTime]$_.Date } }, Shop, @{ label = 'TotalAmount'; expression = { [int]$_.TotalAmount } }, Type, Count, @{ label = 'PaymentAmount'; expression = { [int]$_.PaymentAmount } }, ShopDetail
echo "実行します . . ."
# 家計簿データの Shop が "自動引き落とし" で Amount がプラスのデータを削除する
$excelDataList = [System.Collections.ArrayList]$excelData | Where-Object { $_.Shop -ne "自動引き落とし" -and $_.Amount -lt 0 }
# 家計簿データの 2項目目が空のデータ行を削除する
$excelDataList = [System.Collections.ArrayList]$excelData | Where-Object { ![string]::IsNullOrEmpty($_.Shop) }
# 家計簿のマイナスになっている消し込みデータをプラスに変換し、店名をクレジット明細側に変換する
foreach($data in $excelDataList) {
$data.Amount = $data.Amount * -1
$data.Shop = ConvertShopName($data.Shop)
}
# vpass データの Type, Count, PaymentAmount, ShopDetail が null のデータを削除する
$vpassData2 = $vpassData | Where-Object { ![string]::IsNullOrEmpty($_.Type) -or ![string]::IsNullOrEmpty($_.Count) -or ![string]::IsNullOrEmpty($_.PaymentAmount) -or ![string]::IsNullOrEmpty($_.ShopDetail) }
# vpass の Date, Shop, TotalAmount, Type, Count, Count, ShopDetail が null のデータを削除する
$vpassData3 = $vpassData2 | Where-Object { ![string]::IsNullOrEmpty($_.Date) -or ![string]::IsNullOrEmpty($_.Shop) -or ![string]::IsNullOrEmpty($_.TotalAmount) -or ![string]::IsNullOrEmpty($_.Type) -or ![string]::IsNullOrEmpty($_.Count) -or ![string]::IsNullOrEmpty($_.ShopDetail) }
# 抽出後のデータを格納するための変数
[System.Collections.ArrayList]$vpassDataList = @()
[System.Collections.ArrayList]$unknownhDataList = @()
# vpass データのデータを必要な項目のみにする
foreach($data in $vpassData3) {
if ( $data.Type -eq "1" -and $data.Count -eq "1" -and $data.TotalAmount -eq $data.PaymentAmount -and $data.ShopDetail -eq "" ) {
$temp = $data | Select-Object Date, Shop, @{ label = 'Amount'; expression = { [int]$_.TotalAmount } }
$vpassDataList += $temp
} elseif ( $data.Type -eq "1" -and $data.Count -eq "1" -and $data.TotalAmount -eq $data.PaymentAmount -and $data.ShopDetail -ne $null ) {
$temp = $data | Select-Object Date, @{ label = 'Shop'; expression = { $_.ShopDetail } }, @{ label = 'Amount'; expression = { [int]$_.TotalAmount } }
$vpassDataList += $temp
} else {
$unknownhDataList += $data
}
}
# 重複するオブジェクトを探す
$commonObjects1 = Compare-Object -ReferenceObject $excelDataList -DifferenceObject $vpassDataList -Property Date, Shop, Amount -IncludeEqual | Where-Object { $_.SideIndicator -eq '<=' }
$commonObjects2 = Compare-Object -ReferenceObject $excelDataList -DifferenceObject $vpassDataList -Property Date, Shop, Amount -IncludeEqual | Where-Object { $_.SideIndicator -eq '=>' }
Add-Content $Args[0] "`r`n`r`n--------`r`n`r`n"
Add-Content $Args[0] $unknownhDataList
Add-Content $Args[0] "`r`n`r`n"
Add-Content $Args[0] $commonObjects1
Add-Content $Args[0] "`r`n`r`n"
Add-Content $Args[0] $commonObjects2
echo "終了しました。続行するには何かキーを押してください . . ."
$host.UI.RawUI.ReadKey()
-----
とりあえず形にはなりました。ありがとうございました!
それだけプログラミングできるなら、
データベースもある、Ruby on Rails で稼げ
PowerShell では稼げないだろ
無償のRDBに取り込んで操作すれば楽なのにな
SQL Server ExpressもSQLもわからないのかもしれないが
マイクロソフト製品じゃないとダメな理由がよく分からない
SQL Server Expressを嫌がる理由がわからない
FPS値を取得したがっていた者です
あれから色々調べてHWiNFOから取得する事ができました
ご協力ありがとうございました
ウェブ開発では、Ruby on Rails 一択。
Railsは、PostgreSQL, MySQL, SQLite の3大データベースに対応している。
ただし本番用では、PostgreSQL一択。
SQLiteは開発用・個人用など
AWS Aurora は、PostgreSQL, MySQLに対応している。
SQLiteはブラウザなど、多くのアプリに含まれて使われている
デフォで存在してるところが良いんじゃないか
わざわざインストールするのなら今更新規にRubyを入れるのは無いだろうな
>>141 オラクル社とマイクロソフト社がクラウドの世界では提携しているのを知らないのか?
「主なRDB」でググった結果
Microsoft SQL Server.
Oracle Database
PostgreSQL.
MySQL
Amazon Relational Database Service.
IBM Db2 Database.
家計簿レベルなら1ヶ月に多くても1000件ないでしょ
csvをそのままOS標準で使える言語で処理するのがいいよ
>>147 複式簿記というものを知らないのがバレているぞ
複式簿記の自作なんて無理。
テーブル数も、100 ぐらい行きそう
総勘定元帳とか、複数のテーブルを紐付けしないといけないから、
プログラムがめちゃめちゃ複雑。
これは有料の会計ソフトを使うべき
自作では、単純な単式簿記しかできない
Ruby のCSV Table や、データベースを使うなら、Ruby on Rails とか。
Railsなら、3大データベースに対応している
参照、
>>140 Rubyガイジってどこにでもわくんだな
トコジラミ並み
このスレは
PowerShell -Part 7
です
Set-ExecutionPolicyとSudoって何が違うん?
とあるps1ファイルを実行する時にそのプロセスだけ実行ポリシーを変更するSet-ExecutionPolicy -ExecutionPolicy Bypass -Scope Processを実行後にxxx.ps1を実行してるんだが
Sudoが実装されたし楽ちんになるなとSudo xxx.ps1を入力するとエラーになる
どっちも一時的にパーミッションを変更してアクセス権限を付与するコマンドだと思うんだが何が違うんだ?
>>153 そもそもいつからあなたのなかでは、ps1ファイルが実行形式ファイルになったのか?
Powershell コンソールで、xxx.ps1 とするとエラーになる!
パス付きで、./xxx.ps1, .\xxx.ps1 か、
powershell ./xxx.ps1, powershell .\xxx.ps1 なら実行できる
だいたい間違って実行してしまわないような仕様にしたのがわからない世代がいるのか
ダブルクリックのような感覚で簡単実行なんてUACすら邪魔だと思ってんのかな?
自分で作って自分かミスして自分だけの問題で終わるならかまわないが、そんな趣味でPowerShellを使っている人間なんてほとんどいないと思う。
コマンドレベルまで作り込んでテストされつくされているものと、自作のスクリプトをPATHに設定してどこからでも実行できるものが同列とはおそろしいな
vscodeのターミナルと、windowsターミナルで同じpowershellでも認識できるコマンドが違うのなんでだろ
プロファイル見るとそれぞれ同じpowershellのexe参照してるのに
>>159 VSCodeはWindowsの一部じゃないぞ?
VSCodeアプリケーションは、同じような動きと結果をマネているだけで、エミュレーションのようなことをしているのだから、完全に同じようにするのは困難。
大体ps1の1って何なのとか
vbsやcmdやらがそのまま実行できるのにps1だけ半端に縛るのもおかしな話だし
>間違って実行してしまわないような仕様
こんなのいつ決まったんだ
MSでポリシーが統一されてるようには全く思えないんだが
世を取り巻くセキュリティ事情が日々刻々と変わっているのにかなり先発のvbsやcmdと同じじゃないからおかしいとな
少なくともある程度シェアを占める見込みがあるのだし前例踏襲に固執して0か100か思考に陥るほうがまずい
そういう脊髄反射的な他責や論点ずらしの癖は周囲を白眼視させるだけじゃよ
>>161 >>間違って実行してしまわないような仕様
>こんなのいつ決まったんだ
powershellが出たばかりの頃に中の人が言ってたよ
>大体ps1の1って何なのとか
バージョン1の事
元々の計画ではPowerShell2向けのスクリプトファイルは.ps2にするつもりだった
拡張子にバージョン含めるアホは初めて見たかも
Windowsの技術者の発想ではないね
Powershellはこの拡張子含めて起動周りだけ残念
まぁMSはOSも言語も開発環境も既に人気もなく寿命もつきようとしてるから
Windows最後の砦だったゲームもValveがProtonとSteam OS作ったからLinuxでほぼすべてのゲームが動いてパフォーマンスもWindowsより良い場合もある
ただしあくまでエミュレートだからカーネルモードで動くアンチチートだけは動かなくてフォトナやヴァロやApexなんかの人気FPSが動かなかったり永久BAN対象になる
まぁこれも時間の問題でWindowsが必要とされなくなるのは間近だな
いるよねこういう極論振り回す人
脳内で完結してるから聞く耳を持たない
プログラマに限らずIT界隈はMS批判するのがカッコいいと勘違いしてる人多いからね
>>165 まあ、マイクロソフトだから、拡張子を3文字にする慣習が伝統的にあるせいかな。
>>167 いまでもシェアのほとんどがWindowsなのにね
powershell 7.xってどういう立ち位置なんだろ
windows標準では入ってないから、開発者向けなのかな
Rubookは7.2が標準だけど
PowerShell Core(6.0以降) では
・.NET Coreインストール可能なWindows以外のOSでも実行可能
・デフォルト文字コードがUTF8(BOMなし)、改行がLF
・WorkFlowなど機能の一部は使用不可
あと
WindowsPowerShell → PowerShell Coreで破壊的変更あり(PowerShell Core 破壊的変更でBingってください)
C#のソースを流用する場合ジェネリックが使える7.3が便利かなと思います
自分は未だPowerShell Coreに移行出来ていません
>>172 解釈はまかせるけど技術ブログでは以下の記載がある
https://devblogs.microsoft.com/powershell/powershell-openssh-team-investments-for-2023/ > As a reminder, PowerShell 7 is built on the latest .NET which does not have the same support lifecycle as Windows. We can’t ship something as a feature in Windows that does not align with Windows’ support lifecycle.
用がないなら関わる必要ないんじゃね
OSに標準で入ってる事しかメリット無いんだし
SJISで出力しようとするとエラーで怒られるのはなんでなんですか
仕方がないのでnkf -s --overwriteでしのいでるんですが
うまくいく
>dir | Out-File -Encoding 'utf8' output.txt
どちらもエラーが出る
>dir | Out-File -Encoding 'shift-jif' output.txt
>dir | Out-File -Encoding [System.Text.Encoding]::GetEncoding('shift-jis') output.txt
Out-File : パラメーター 'Encoding の引数を確認できません。引数 "[System.Text.Encoding]::GetEncoding
" は、ValidateSet 属性で指定されたセット "unknown,string,unicode,bigendianunicode,utf8,utf7,
utf32,ascii,default,oem" に属していません。このセットの引数を指定して、コマンドを再度実行してください。
shift-jifになってますがjisでもちゃんとエラーになります
コマンドレットの引数と.NETのそれを混同してるのでは
-Encoding Defaultでしょ
よく知らんけど、UTF8もSHIFT-JISもMS932
ASCIIも、全部半角英数文字なら、
完全に互換性あるよな❓
BOM付UTF8はダメだろうが
ていうか、改行はLF CR LF+CR CR+LF
のどれが正しいの❓
ていうか、拡張子mp3は音楽で音なのに、
でもてか、拡張子mp4は動画で映像だし、ま、音声も含まれてるけど
もしかして、拡張子mp5は匂いとかになるのかな❓ なんて訳ないよね
mp3: MPEG-1 Audio Layer-3
mp4: MPEG-4 Part 14
>>180 0x5Cと0x7Eが違うだろ
0x5CはASCIIやUTF-8だと逆スラッシュだけどShift-JISでは円記号
0x7EはASCIIやUTF-8ではチルダでShift-JISだとオーバーライン
確かにPowerShellには糞な所はあるが
UNIXシェルはもっと糞だからなぁ
プログラムスレ自体が
スレ立ての荒らしにあってる?
入力された値(小数点以下の桁数は不明)をそのままの値でコンソールに表示させる方法ありますでしょうか?
例
入力値 $nyuryoku = 0.0000001
出力 0.0000001
現状
1E-07
入力された値(小数点以下の桁数は不明)をそのままの値でコンソールに表示させる方法ありますでしょうか?
例
入力値 $nyuryoku = 0.0000001
出力 0.0000001
現状
1E-07
そうだね。逆にE表記の入力も受けるならそっちの対応も必要になる
$nyuryoku = "0.0000001"
[double]$nyuryoku_d = 0
if ([Double]::TryParse($nyuryoku, [ref]$nyuryoku_d)) { # 入力文字列をdouble値に変換できるか確認
$dotpos = $nyuryoku_s.IndexOf(".")
if ($dotpos -ge 0) { # ドット表記
$nyuryoku_d += 0.0000001
$nyuryoku_d.ToString("N" + $nyuryoku_s.substring($dotpos + 1).length) | Write-Host #double値を計算して同桁出力する場合
}
}
.NetのBigDecimal型を使えば演算も有効数字も期待通りにコントロールできて望むものに合致するかもしれない
>>0190
確かにそうですね
>>0191
ありがとうございます。
>>0192
小数点以下桁数が計算できれば行けそうです
>>0193
ありがとうございます。試してみます
[System.Covert]::ToDecimal($nyuryoku)
> $x = "1.00"
> [decimal]$x
1
> [decimal]$y = "1.00"
> $y
1
簡潔でいいなと思ったけど v7.4.2 ではダメだったわ
v5 なら通る
なんでや
> [decimal]::Parse("1.00")
1.00
これならどっちもいける
いやいやいや…ちょっと調べればPowerShellを禁止設定のまま実行なんて簡単なんですけお^^
俺はバッチファイル経由で実行するようにしてる
同じフォルダ内のps1ファイルを全て羅列して、どれを実行しますか?みたいな感じのバッチファイル
>>199 そのせいで使い勝手が悪く普及しない
ダブクリ実行可能なショートカットは一般ユーザーには作れない
さらにウインドウ非表示実行もできず、VBSを置き換えることもできない
>ウインドウ非表示実行
conhost.exe --headless powershell.exe -file foo.ps1
では駄目?
>>205 駄目じゃない、ありがとう
タスクスケジューラーから定期実行する時、VBS以外の選択肢がなくて困ってた
引数の--headlessはどういう意味なんだ?
https://github.com/microsoft/terminal/issues/17178 conhost.exe --headlessは終了コードを得られない致命的なバグがあるらしいな
Hiddenで起動する適当なexe作った方が早そう
>>154 なんじゃこりゃ、どんだけエアプが書いてんだ?
そもそもrunas.exeとsudoの意味論はユーザ切り替えで同一だろ
権限の昇格の概念の無いOS用のsudoと意味論が異なる事を示す為にせめてsudo以外の名前を使えよ
以下win/pwsh環境での突っ込み
>runasはパスワードの入力が必要になる
saps に-cred $me渡せ
>別ウィンドウでターミナルが起動する
-nonew渡せ
>別ターミナル再度コマンドを実行する必要
それはsu相当の動作であってsaps pwshで代替できる
全部やりたいならsaps $prog -runas -cred $me -nonewだろ?
win上のpwsh環境ではsaps上で直交するオプションとして設計された4機能が全部斜交した邪悪の極みみたいなコマンドと化してるぞ
ついでに言うとrunas.exeも若干邪悪…
テストはしてないからなんか俺もエアプしてたら突っ込んでね?
$progと-args @argsをfunction sudoに包んで渡せばとりあえず望みの挙動を得られるはず
俺の環境だと-NoNewWindowと-Credential両方指定すると新しいウインドウが開いちゃうんだが
>>208 https://www.keyence.co.jp/ss/general/iot-glossary/headless.jsp ヘッドレスとは、組み込み機器やサーバなど、本来対面で人が操作するためのものではない(または、その必要がない)システムで見られる運用形態のひとつです。コンピュータの場合、キーボード、マウス、タッチパネルなどの入出力機器を接続しない状態で運用すること、また、その状態で運用を行う機器などがあります。
https://eow.alc.co.jp/search?q=headless
例文、怖えぇ~
【headless】
1. 頭部のない、首を切られた
・ I saw a headless dog lying beside the road on my way to school. :
学校へ行く途中、道端に首のない犬が転がっているのを見た。
2. 指導者がいない
・ The terrorist group is a headless organization. :
そのテロリスト集団は指導者がいない組織である。
3. ・・ >>210 >そもそもrunas.exeとsudoの意味論はユーザ切り替えで同一だろ
今のSudo for Windowsは同一じゃない
https://learn.microsoft.com/ja-jp/windows/sudo/#how-is-sudo-for-windows-different-from-the-existing-runas-command >現時点で Windows 上の sudo コマンドは、他のユーザーとしてのプログラムの実行をサポートしていません。
>>216 >そもそもrunas.exeとsudoの意味論はユーザ切り替えで同一だろ
ここで言及してるsudoはunix系の本家(?)sudoのことやろ
古い業務システムでデータ入力する時に自動化しようと思ったんだが、
Enterがカーソル位置以降の文字消してフォーカス移動、NumpadEnter(テンキーのEnter)がEnter、
左CtrlがCtrl、右CtrlがEnterという機能になっている。
powershellのSendkeysだとどうやってNumpadEnterか右Ctrlを選択すればいいのでしょうか?
powershellってlinuxでも使えますっけ?
Win10のPowerShellのC#がVS2022のC#とバージョンが違って戸惑う…。
Win11ではそこまで違和感ないのだろうか?
foreach (var item in File.ReadAllLines(fileName).Select((line, i) => $"{i + 1,2}:{line}"))
としたかったのにReadAllLinesも使えないし、 $"{i + 1,2}:{line}"部分も使えない。
何か、隔世の感がある…。
PowerShell内蔵のC#スクリプトがOS毎にバージョンが違って、使えない機能があって不便だって話。
hello.ps1
Add-Type -Path .\hello.cs
[Hello]::hello()
hello.cs
using System;
public static class Hello
{
public static void hello()
{
Console.WriteLine("Hello World!!);
}
}
まあ現在進行形でメンテされてるからな
むしろOS毎に入るバージョンが違ってくるのは当たり前なのでは…
分ってるけど、心の叫びだよ。
あ、PowerShellアップデートしてReadAllLinesの方は使えるようになった。
今更ファイルストリームでopen/closeとか嫌すぎたからホッとした。
webアプリのテキスト入力部分にpowershellスクリプトで自動的に文字入力をしています
しかし動作させるタイミングによってIMEが日本語入力になっていたり直接入力になっていたりしています
「無変換」キーに「IMEオフ」を割り当てて文字入力の前にpowershellで自動的に無変換キーを押下させましたが当方の環境では何故か期待通りの結果にならず、やむなくタスクバートレイのIMEアイコンを右クリック(メニュー表示)→「直接入力」左クリックをpowershellで自動でやって実現しています
しかしこの方法はスマートじゃないです
powershellで他のアプリに入力中のIMEの設定を「直接入力」モードにスマートに切り替える方法があれば教えてください
望んでいる答えではないと思うがWebアプリなら素直にブラウザのプラグインでJavaScriptを動かす方法を一度覚えておいたほうが幸せになれると思う
安定性も増すしやれることの幅もかなり広がる
>>228 WindowsFormsあたり使えばできるんじゃないの?と思ってCopilotに聞いてみた
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class ImeControl {
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern int ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);
public static void DisableImeMode() {
IntPtr hWnd = GetForegroundWindow();
ImmAssociateContext(hWnd, IntPtr.Zero);
}
}
"@
思ってたんと違った
>>231 有難うございます
一回り難しそうですが、試しながら参考にさせて頂きます
肝心のアレが入ってないからまともに動かなそう
AIをもっと虐めないとだよ
>>230 バグじゃなくて、互換性の問題。
古いのC#の文法を使えば良いとは言え、あんまり逆行したかったん。
xあんまり逆行したかったん。
oあんまり逆行したくなかったん。
地味にハマったからPowerShell7.5PrevewでC#コード実行の注意点書きこ。
・$Argが$argsに。(ここまではいい)
・$argsに格納されるコマンド引数がカレントディレクトリではなく、「PowerShellを起動したディレクトリ」になっている。
(なので、初期はPowerShellの本体があるフォルダー。しかもcdでカレントディレクトリ変えても、コマンド引数のディレクトリは変化しない)
解決策
(hoge.ps1は$argsを使っているスクリプト)
pwsh hoge.ps1 arg1 arg2
の様にPowerShellを起動してからスクリプトを実行すると、コマンド引数のディレクトリも(そのシェルを起動した時点の)カレントディレクトリに変わる。
・
あ、C#はPowerShell7.5で $"{}"(文字列補間式)使えるようになった\(^_^)/
過去に作られたスクリプトなのですが、
$script=(New-Object System.Net.WebClient).DownloadString("
https://○○/dir/file1.js")
として別Webサーバからスクリプトを毎回ダウンロードしていたのですが、
そのWebサーバが廃止されるということで、
そのfile1.jsをPCにダウンロードして、それを毎回読み込ませるようにしたいです
$script=Get-Content .\file1.js
としてみましたが、ファイルは読み込めているようですが、
その後の処理でうまく動作しません
何か方法ありますでしょうか
file1.jsのエンコーディングはどうなってるの?
>>237 説明が分かりにくい。
たぶん昔からよく混乱の元になってる
$PWD(*-Location)のカレントディレクトリと
[Environment]::CurrentDirectoryのカレントディレクトリの
両方を意識しないといけない問題について調べたらいいと思うよ。
>>239 DownloadString()の戻り値の型は[string]で
Get-Contentは大抵[Object[]]だから型の違いで動作変わってんじゃないの。
Get-Content -Rawにしてみたらどう?
windows10から11に変えたらwindows10ではちゃんと動いていたスクリプトが動作しなくなりました。
ショートカットに「powershell -file スクリプトのフルパス」と書いて目的のファイルをD&Dして使用しています。
ISEからだと一応動作して「引数が足りません」になるんですが、ショートカットからでは一瞬ウインドウが開くだけで何も起きません。
-NoExitをつけてもウインドウが閉じてしまいます。閉じるのが早すぎて正確にはわかりませんがウインドウには何も表示されていないようです。
「consolehost_history.txt」がログのようなので見てみたんですが、何も実行されていないようです。
管理者権限でpowershellを起動してから「スクリプトのフルパス "引数になるファイルのフルパス"」では正常に動作しました。
powershell.exeを右クリックで管理者権限で実行にチェックを入れても動作せず。
windows11になってからpowershellのショートカットを作る方法に変化があったのでしょうか?
>>247 多分まさに>237に書いてる仕様変更の影響かと。
>>248 ありがとうございます。 「pwsh -file スクリプトのフルパス」と書き換えたら起動できたんですが、今度は別のところでwindows10では起きなかったエラーが出てしまいました。
$cmfiletxt = Get-ChildItem -Path "$cmtemp" -Recurse -Depth 1 -Filter "$trimfile"
と書いてある行で、
Second path fragment must not be a drive or UNC name. (Parameter 'expression')
というエラーが出ます。
"$trimfile"の中身は例えば「R:\TEMP\cmtmp\amt9996774\アニメA・ダークギャザリング #1「寶月夜宵」 2023-07-10.m2v.txt」です。
windows10では正常に動作していました。
「amt9996774」の所は連携しているソフトがランダムで自動生成するのでこちらからいじることはできません。
どう修正すればいいでしょうか。
>>249 変数名が $cmtemp になってるけど、その中身の文字列は e抜きの \cmtmp\ を含むパスなの?
>>250 そうです。最初にパスを設定する部分を設けています。
$cmtemp = "R:\TEMP\cmtmp"
>>249 ダブルコーテーションで括ってるからじゃね
-Filterにパスを指定しちゃだめ、っていうエラーメッセージ。
ファイル名部分を指定するんだよ。(ワイルドカード)
でもWin10でもエラーになると思うんだけどな。
>>252 補足
変数をダブルクォーテーションで囲むと
変数の式が展開されてから渡される
変数の中身がファイル名でスペースを含んでたりすると誤動作する
変数に入ってるんだからそのまま変数で渡せばいい
ファイル名がスペースを含んでいても大丈夫
こんな感じだと思う
ありがとうございます。結局$trimfileの中身をフルパスではなくファイル名のみにするようにしたら処理完了しました。
…本当にwindows10ではこれで動いていたんですけどね…?
ただし別の問題が発生しています。あらかじめ作業フォルダを指定してその下にサブフォルダを生成、そこに処理したファイルを展開するようにしてるんですが、
指定した作業フォルダ(日本語)が文字化けしており、文字化けした作業フォルダを改めて作成してさらにその下にサブフォルダを作るようになってしまいました。
write-hostで表示する日本語も同様に文字化けしており、サブフォルダの名前は正常なのでスクリプト自体の問題ではないと思います。
powershellのタイトルバーを右クリック→設定→左のアイコンからpowershellを選択→外観→フォントフェイスをMSゴシックに変更、では解決しませんでした。
>>255 コンソール側の文字コードの問題だと思うよ
レジストリにCodePageを設定すれば解決するはず(「65001」で検索)
pwshが動く時点で普通のwin11じゃない気がする。pwshは一部の物好きな上級者用じゃない?(もうwin11のデフォルトになった?)
pwshのままだと今後も色々問題出るよ。自己解決していける自信がないなら総合的にはwin11の再インストールが手っ取り早いと思う。
powershellが動かなかった理由ってOS変えたからデフォルトのExecutionPolicyの問題で弾かれてただけじゃないの
pwshについては設定変更済みで通ったと
そしてv5向けのスクリプトをそのままv7で動かしたから細かい非互換の問題が出たと
>>256 やってみましたが結果変わらずです。
>>258 当初ISE経由でも弾かれたのでBypassに変更済みです。
>>257 powershellのバージョンの問題かと思ってMicrosoftStoreからver7をインストールしました。
試しに7をアンインストールして.5.1が強制的に動くようにしてみたんですが、挙動は振り出しに戻っちゃいました。
互換性の問題で言うとAutoHotkeyもうまくショートカットを発行できないソフトが出てきていますね…。
再セットアップで解決するもんでしょうか。
pwshを入れたのは後退なので、スタート地点に立てたくらいに思えば。
1. ショートカットのあるディレクトリにで右クリック→ターミナルで開く
2. ショートカット(lnk)を開く
でウインドウが閉じずにエラーメッセージを確認できると思う
>>260 出てきたエラーをコピーしようとしたらNGワードに引っかかったみたいなので要約すると、
・名前が正しく記述されていることを確認しろ、パスを確認しろ
・ コマンドは見つかりませんでしたが、
現在の場所に存在します。Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。
このコマンドを信頼する場合は、".\(ファイル名)" と入力してください。
言われた通りに.入力したら「引数がないため処理を終了します。」となり、一応正常に終了しました。
恐らく11から強制的に使わされてるターミナルが悪いんだろうな
MSストアで入るアプリは総じてゴミだから今すぐ使用中止しろ
https://qiita.com/dokimiki/items/f1075003cb37f1b542a8 >>262 リンク先を試してから、powershellを開いてから実行する方法では修正前のスクリプトで文字化けもせず正常に終了しました。
しかしショートカットのD&Dする方法では変わらず一瞬でウインドウが閉じました。
>>263 powershellのスクリプトの最後に pause でも追加しておけばいいんじゃね
あの…、なんか寝て起きて試したら動きました…。
昨日からマジで何も変えてない…。せいぜいUSB-DACのドライバ当てたくらい?
とりあえずこのまま様子見ます…。色々とありがとうございました。
今のターミナルで困ることって何だろう
--headlessが使えないことくらい?
conhostより重いって意見はあるかもしれないけど.NETと比べれば誤差みたいなものだし
Windows terminalは普通に優秀だと思うけど
cmdと動作が異なる意味では欠陥
最初にppwershellをコンソールアプリで公開したのは失策
WSH使いからは失笑
コンソールホストとシェルの区別がついてないお🐴🫎さんかな
ISEって2019年末時点でオプション機能化とか終息に向かうとか言われてたみたいだけど現行Windows11にも普通にプリインストールされてるよな
終息する話は延期になったんだろうか
まぁ弊社みたいなインストール手続きがクッソ面倒なところでは助かるんですが…
収束するには代わりにVSCodeをプリインストールするようにしてくれないと
削除予定はないよ
今後の機能追加がないだけ
プリインストールしたらしたで欧米人がMS訴えるじゃん?
エディタはどうぞお好きなものをお使いください
未だにVSCodeすらインストール許可が出ない会社ならそこの組織の問題
淘汰されるまでそうしていればいい
客先のサーバーで作業中のエンジニアならスクリプトは事前準備したものだけ使うか一旦課題を持ち帰れ
ISEの優位性って何?使ったことないけどvscodeにできないことができたりする?
hogehoge.txtの重複するレコードを
powershell -command "get-content hogehoge.txt | sort-object | get-unique | write-host"
みたいにして取り除いています。
重複除去の前に外部コマンドによる処理を追加したくなり、まずファイルからではなく標準入力から読み込んだデータの重複除去に取り組んでいますが上手く行きません。
当初get-contentをread-hostに置き換えればうまく行くかと思いましたがダメでした。
type hogehoge.txt | powershell -command "read-host | sort-object | get-unique | write-host"
考えてみればそれも当然で、いったん標準入力を丸呑みにして溜め込んでおかないとsortもuniqもできないですよね。
MSのサイトで配列に溜め込んでいくみたいな用途に使えそうな命令を探しましたが見あたりませんでした。
なんか解決法ないでしょうか?
あとついでに聞いちゃうんですけどunixのコマンド(wcとかcatとか)をその言語で書き直すみたいな本のpowershell版ってないもんですかね。
無理にワンライナーやパイプラインで繋げて書かずに
スクリプトファイルを作ってそれを呼び出す方が柔軟性があって整理もできて使いやすい
無理にでもワンライナーやパイプラインで繋げて書くのがPowershellの醍醐味
>>276 みたいに困ったときはスクリプトファイルで
制御構文やら変数やらクラスやら使った方が
色々試し易くて色々整理できていいじゃん
[Console]::In.ReadToEnd() -replace '\r?\n$' -split '\r?\n'
その外部コマンドによる処理もPowerShell内でやればいい気がする
そういえばと思って試したら$inputでいけたわ。なんで忘れてたんだろ
>>276 Ruby で作ってみた
input_str = "5\n11\n33\n9\n0\n9\n11\n"
# 末尾の改行を削除してから、数値型に変換する。
# 重複を排除し、ソートする
input_ary = input_str.each_line.lazy.map do |line|
line.chomp!
line.to_i
end.uniq.force.sort
p input_ary
#=> [0, 5, 9, 11, 33]
過疎過疎5ちゃんなんかよりツイッタランドで凸でもすれば
新しい Windows11マシンに pwshをインストールして
以前から使ってるファイルを そのままコピーしたら…何故だか起動時設定を読み込んでくれない
…と思って 調べたら
$PROFILE が
以前からのPCでは
C:\Users\(私のユーザー名)\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
に対して、新しいのでは
C:\Users\(私のユーザー名)\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
profileを置くディレクトリが違ってたということ.
pwshのバージョンは どちらも最新(同じ)なのに
…なのですが、特に どちらかで $PROFILEを設定するようなことは していない.
環境変数なども特に設定していないし
Program Files/7 直下には profile的なものは 置いていない
…でもどこかで指定しているのを自分で忘れたんだろうか?
複数マシンを管理するにあたって 面倒なので…とりあえず原因になりうるものを知りたいのです
>286
最新のWindowsにも入ってる「古いpowershell」が原因っぽい. 新しいのを入れても残ってるので そういうことはある
>>286 デフォルトの$profileのパス設定が異なるマシンがあってその原因が知りたい、ってことなのかな?
ちなみに、新しいマシン側の$profileは5.x系(いわゆるWindows PowerShell)のデフォルトパスと一致してる
ExecutionPolicyがRestrictedのままでProfileがロードされないとか?
286です すいません、自分の混乱の原因がわかりました。
新しいWindows11のマシンにも5.x系は入っていて、7.xのpwshをインストールしてもそれは残る.
そして、私は タスクバーに「ピン留め」して起動するのですが、pwshを起動した状態でピン留めしても いったん終了させてからアイコンをつつくと 5.x系が起動してしまう…というところに 気がついていなかったというわけです. ピン留めしたのは たしかに7系だったのに. なんだか納得いかない感じ
ピン留めされるのは「ターミナル」であって、その中で何を起動するのかは 右クリックで選択できるようになっており、そのデフォルトが5.x系であるように見えます。もちろん以上のことがわかっていれば ここから7.xを選んで起動するのも簡単ではあるのですが…これはカスタマイズできるんだろうか
ターミナルのデフォルトはターミナルの設定画面で選べるよ
既定のプロファイルってやつ
292← できました!ありがとうございます
…というか、これまで(Windows10)は「ターミナル」じゃなかったということを今日 知りました(笑)
コマンドプロンプトで、where powershell
と入力すれば、powershell.exe の絶対パスが分かる。
だから、絶対パスを書けば、exe を指定できる
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
ここに、2つ以上表示されたら、上の方が優先して実行される
ワイ氏、whereというコマンドがあることをパソコン歴20年にして初めて知る
Powershell v5はpowershell.exe、v7はpwsh.exeなのでこれらの混在環境でパスの優先順位が問題になることは基本ない
むしろコマンド名を混同したままでは取り違えが起こりそうなので一応
20年前のWindowsにはまだwhereコマンドは標準搭載されてなかったから知らなくても仕方ない
一応リソースキットやサポートツールには入ってたけど
20年ぐらい前から個人でPathが通ってるところに ls.bat や which.bat を作って同等のことをやってた
Unix(当時はまだUnixは普通に使われていた)やLinux も普通に使ってるとつい ls って入力していらっとしてしまうから必須だった
>>298 UNX・LinuxのlsコマンドだってシェルやOS依存だぜ?
Windowsの基本知識がないのにPowerShellを使うというのも何がなんだかわからないやつだ
>>299 UNIXでlsが使えない環境があるの?
Powershellの話をする気がないなら黙れジジイ
>>301 無いのでecho *でやっていた環境があるのだ
そう、あれはLinuxっていうやつだった
>>298 PSのcatとUnix系のcatが別物ってくらい違うのがね…。
おまけにDOSコマンドのtypeもPSとコマンドプロンプトで違う。
(PSのcat/typeはget-contentの別名)
PSだとリストを受け取るので、カンマで区切る必要がある。
cat file1, file2, file3
C#で自作したコマンドとも、元からあるDOSコマンドとも違うって…。
MS謹製のIDE(VS)で自作したコマンドと連携撮れないMS謹製のシェルェ…。
エイリアスに互換性を求める人なんていたんだ
そんなの新しいコマンドを覚えやすくするための糖衣でしょ
DOSみたいなクソダサレガシー環境との互換性を尊重してたら呪縛なんてもんじゃない
シェルスクリプトって古今東西きったねえ一貫性のないもんなんだから拘っても虚しいだけよ
>>306 どの言語でもrubyを求める奴がいるように
PowerShellにもUnix系シェルを求めちゃうんだろうな
>>305 Remove-Alias cat
function cat([Parameter(ValueFromRemainingArguments=$true)][string[]]$Path){Get-Content @PSBoundParameters}
これで文句ないだろ
PowerShellでLINQをメソッドチェーンで書く方法ってある?
静的メソッドで[Enumerable]::Select()みたいに書くと()が増えてガチャガチャしちゃうのがなぁ…
>>309 そういうコマンドに出合うたびに毎回そんなの書くのはね…。
そんなこんなでLinux(bash)に落ち着くんだよね…。
>>311 俺は逆に会社でWindows使う機会が多すぎてLinux(*nix)コマンド側の記憶が消えそうになってるな…
たまにLinux使うとPowershellみたいにパイプラインを文字列じゃなくてオブジェクトが通るつもりで書きそうになる
>>311 お前は何を言ってるんだ
catエイリアスを消してbashっぽい動きの関数をcatの名前で登録し直すって内容なんだから
これをprofileにでも貼り付けて使えって意味だろうが
>>313 うん。
そう理解してる。
PowerShellってよりは周辺環境が追い付いてない印象だけど、まだLinuxでbash触る方が楽かな。
もうしばらく進化を待ちますね。
スクリプト書くのはbashよりpowershellの方が書きやすいし読みやすい
そしてlinuxでもpowershell使えるしで重宝してる
スペースとコンマの違い程度で発狂して上から目線でもうしばらく進化を待ちますねって面白い人だなぁ
そもそも進化してないのはUNIXシェルのほうでしょ
space と , はさすがに気付くと思うが
: と ; の違いは老眼にはきつい
:(コロン)ていう名前が美味しそうな響きなんだよなぁw
LinuxとかDOSコマンドを、デフォルトのエイリアスでPowerShellコマンドレットに結びつけておくってのは悪手だよなー
他環境利用者の移行配慮ってなら、例えば「cat」を「Get-Help Get-Content」を実行する関数へのエイリアスにするとか、何かやりようあったんじゃないかと思う。
PSv1、v2の出来の悪さ、様々な考慮不足がずっと足引っ張ってると思う。
curlとかシンプルな本物使いたいことの方が多いから邪魔なだけ
sh系はともかく、cmdと全く別のコマンド名覚えなおすのも慣れとはいえ面倒なのは確かだからしょうがないんじゃない
補完できても長いものは長かったし
当時からWSLがあれば別だったんだろうけど
このスレを見ていれば分かるけど、自分がいまcmdを実行しているのかpowershellなのかpwshなのか分かってないユーザがかなりを占める
そんなごく普通のWindowsユーザーたちがdirやcdで適当にやったらなんか動いたとか、同じコマンドで動くらしいからオレも使ってみようかなとかいったハードルを下げる要素の重要性は無視できない
複数パラメータの区切りがスペースかカンマか?マジどうでもいいよw
Windowsの新しいシェルスクリプトなんて相反するニーズに縛られまくるからどんな仕様にしたところで数え切れない文句が飛んでくる
>>324 >当時からWSLがあれば別だったんだろうけど
WindowsでUNIXシェルが使えないから仕方なく欠陥品のPowerShellを作った、とか思ってそう
>>326 思考が卑屈すぎるわw エイリアスの話しかしてないよ
curl など誤解を招きかねないエイリアンは害悪でしかない
% とか ? は可読性上がる気がする
selectにも記号一文字のエイリアスあってもいいんじゃないかと思う
そう思うなら自分で勝手にアイリアスを定義すればいいだけだよね
各々が好き勝手にエアリアルを使っているとコミュニケーションに支障をきたすから困る
> WindowsでUNIXシェルが使えないから仕方なく欠陥品のPowerShellを作った、とか思ってそう
開発の経緯としてはまさにその通りなんだけどな
WindowsでUNIXシェルを整備するプロジェクトが頓挫して、根本的にWindowsに適した設計が必要であるということで生まれたのがPowerShell
なおオリジナルの開発者は現在はGoogleへ移籍し、UNIXシェルの世界へと還っていった模様
>なおオリジナルの開発者は現在はGoogleへ移籍し、UNIXシェルの世界へと還っていった模様
なおGoogleへ移籍後は何の成果も得られてない模様
Linuxの管理マネージャやそのシェルのPowerShell化をしていたりして、
そのうちカーネルソースのPowerShellマネジメントレイヤーに取り込まれたり
Fedora、Ubuntuに適用される見込みである
Azureならともかく、そんなもんGCP採用するような層にニーズあるかねえ
どう考えてもAzureを利することにしかならずGCPのシェアに対して悪影響しかないだろ
最近は首切りしまくってたのに最上位格エンジニアは気楽なもんだな
PowershellはAdd-Type辺りの機能は便利だけど言語としてはゴミ
UNIXシェルはもっと言語としてはゴミなんだよなぁ
普段そういうゴミしか作者の周りになくて間違えて拾ってきちゃったんやな
>>328 gal見てたらcurlだけでなくwgetもiwrだった
エイリアスといえばパラメータのエイリアスにも多分いろいろundocumentedなのあるよな?
-ArgmentListが-argsで通ったりとか規則的な略じゃないやつ、これは短くて分かりやすいからいいが
-argなら曖昧さのない限り頭から略せるという規則通りなんだけど
こういう個別のまとめた文書ってある?
一部は
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_commonparameters にあるのは知ってる
Get-Help -Fullの、パラメータのエイリアス
Windows Server 2025 以降で削除された機能または開発されなくなった機能
https://learn.microsoft.com/ja-jp/windows-server/get-started/removed-deprecated-features-windows-server-2025 Windows PowerShell 2.0 エンジンは削除されました。アプリケーションとコンポーネントはPowerShell 5.0 以降に移行する必要があります。
AD一覧をcsv出力すると区切りが半角スペースになってExcelで取り込めない。
ググっても同じ症状の人が出て来ない
OutfileってDelimiterできないよね?
Exportだと文字コードをdefaut、utf-8にしても数列で出力されちゃう
Out-File? ならその前にConvertTo-Csvで変換してるんじゃないの?
powershellのなんちゃってCsvコマンドレットはExcelで扱えるCSVと特に親和性があるわけでもなく、俺俺CSV止まりだからあんま使う価値ないかも
ではCSV扱うなら何がいいかと言えばCsvHelperが定番なんだけど、C#や.NETの知識が要るね
AD一覧程度なら自力でフィールドをカンマで区切ったっていいよ
CSV変換標準コマンドレットはデータ前後のスペース文字が消えるので
一切データ欠落しちゃいけない場合は注意
Export-Csvって自力でクォーテーション外してた時代あるし地味に改良してるけどな
>>354 PowerShell7.xは通常利用されないpwshシェルとして実装されても良いと思うよね
標準シェルをpowershell.exeにしておけば互換性問題無いし
ただ7.xが5.1の互換とか言ってるのはかなり微妙
lud20241207145428このスレへの固定リンク: http://5chb.net/r/tech/1701241669/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像
↓「PowerShell -Part 7 ->画像>1枚 」を見た人も見ています:
・PowerShell -Part 4
・PowerShell -Part 6
・PowerShell -Part 3
・【※Shell V-Powerは除く】石油連盟会長、ハイオク混合出荷問題に「各社品質に差ない」と混合認める発言へ
・Windows PowerShell Part5
・Windows PowerShell Part4
・PowershellあればLinux要らない
・【Kernel Power 41】KP41病 3
・Excel ピボット Power Pivot DAX関数 質問スレ
・docomo ELUGA power P-07D Part6
・Kernel-Power 41病に勝利した奴集まれ
・PowerShot G9 X / S90-S120 Part 1
・【日産】ノート e-POWER専用 IP有 Part 34【HV】
・【日産】ノート e-POWER専用 IP有 Part 28【HV】
・【日産】ノート e-POWER専用 IP有 Part 40【HV】
・渋谷のキング@YellowBusters
・YellowBusters【渋谷のキング】
・渋谷のキング【YellowBusters】
・Huddersfield Town FC 中山雄太
・Shadowverse 5780
・Shadowverseの話しろ
・【CHEERZ:SHOWROOM】
・Shadowverse無課金スレ15
・Stew Peters Show ★1
・SWEET LOVE SHOWER ★2
・藤井隆『light showers』
・-HERO SHOW Slash-act.3
・Shadowverse 無課金スレ140
・sweet love shower 2016
・Canon PowerShot N Part1
・Power PC Macintosh 総合
・【祝steam版】Shadowverse
・Shadowverse VISAカード
・POWERFUL COMBAT CUPSを語るスレ
・なんJ Shadowvers対戦募集部 ★1
・valorant VCT lower final
・【オワバ】【Shadowverse】
・Canon PowerShot G3 X part3
・精神病棟3799 【shadowverse】
・Canon PowerShot G5 X part3
・canon powershot pro1ってどうよ?
・【マルチプラットフォームTCG】Shadow Era 30
・Canon PowerShot SX200系 3枚目
・ヨシヒコ5874【Shadowverse】
・Shadowverse総合スレpart17831
・Shadowverseまったりスレ74ターン目
・NFL 2021/22 Super Bowl LVI part8
・Shadowverseまったりスレ75ターン目
・Shadowverse 総合スレッド part8
・Shadowverseまったりスレ73ターン目
・Shadowverse 総合スレッド part7
・Shadowverseまったりスレ75ターン目
・Shadowverse 総合スレッド part9
・【虚無】オワバ 6637【Shadowverse】
・【シャドバ】6096【Shadowverse】
・Shadowverse 総合スレッド part14
・☆Full Power☆サガントス第808幕☆
・NFL 2020/21 Super Bowl LV part6
・☆Full Power☆サガントス第780幕☆
・Shadowverse 総合スレッド part10
・SPACE SHOWER MUSIC AWARDS 2019
・NFL 2020/21 Super Bowl LV part7
・【崩壊】オワバ 6642【Shadowverse】
・NFL 2020/21 Super Bowl LV part2
13:38:57 up 64 days, 14:37, 0 users, load average: 9.85, 10.15, 10.04
in 0.023680925369263 sec
@0.023680925369263@0b7 on 062102
|