【最強CUI】PowerShell -Part 2 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
感謝状、招待状等あえて句読点をつけない文章の共通点とは? https://woman.mynavi.jp/article/150205-71/ かつて、句読点を付けるのは『相手を見下す』 要は、句読点がないと文章も読めないだろうと相手を見なすことに なることだったようだ。 ま、当時は漢字の利用頻度も高く、漢字ひらがな混じりでも 読みやすかったのでしょう。今はひらがななどの割合が高いので やはり適切に句読点を使う必要あるんでしょうね。 長文でひらがな比率高いと文の区切りが分からなくなりますからね。 >>550 句読点の、打ち方が下手な香具師もよく、見かける 単に句読点はこのスレで低レベルな煽りを繰り返してるキチガイの特徴ってことだろ IDかわってもすぐわかる powershellだけでプロジェクト組むとしたらどういうフォルダ構造にする? 煽りうざいから話題換えよう >>559 良い質問な気がする ただオレ自身は単ファイルで済むバッチ みたいなのを書くのがほとんどだから もし本格的なプロジェクトのフォルダ構成を組むなら JavaとかRubyとか他言語の構成をマネするかな PSCustomObjectで特定のinterfaceを実装したいんだがやりかたわからん public interface IFoo { int Bar(int x); } public static class Hoge { public static void Fuga(IFoo foo) { Console.WriteLine(foo.Bar(100)); } $foo = new-object pscustomobject | add-member -passthru -membertype scriptmethod -name Bar -value { param($p) return 200 } [Hoge]::Fuga($foo) こういうことしたい GoやTypeScriptじゃないんだからメソッドを持ってるからってinterfaceを実装してることにはならんよ 素直にIFooを実装するclassを定義すれば? >>566 むしろ今の内に5.1以降(できれば最新の6.0.1)に慣れておくほうが良いと思うけどな 業務で使うマシンはOSが最新とは限らない PSもほとんどアップデートされてない だから低いバージョンでも使えるように訓練したほうがいい 最新版は追いかけるメリットがない 企業ならクライアントもWindows 7とか珍しくないから配布するようなスクリプトだと2.0前提 >>566 add-typeあるんだから普通にC#で書けば良くね https://pastebin.com/mnvdH77F PSCustomObjectに実装しないといけないなら知らんけど >>571 それじゃpowershellコマンド使えないじゃん 句読点を多用するのは下手な日本語で嫌われる。 もともとどこが句切りかわからないひと向けの記号だから、句読点の使用は馬鹿にされることもある。 pushd/popd 便利やなあ わしゃずっとcd使っとったぞい >>575 わたしゃ多用してますわ push-location pop-location と省略せずにつかっておりますです c# scriptingのほうが楽とちゃうか? ネイティヴコマンド連携だけは若干ps有利かなといった印象 その時々で都合の良いほうを使えばいいよ 同じ.NETなんだから否定する理由も無い >>577 C# scriptingその後の話題が無いところをみると どうも今一つなんかな >>577 シェルのlsやらcatやらみたいなのもc# scriptingのほうが楽なの? bashとかが駄目な理由に、bashで書きづらくても、そこからpythonとか他の言語にするなら全部書き直しになる CLIが嬉しいと言いたいのかな。ちょっと論旨が理解できないが。 script vs shell scriptとか何十年前の話題だよ 進歩のない連中だ OSのシェルとプログラミング言語の区別がない人間ばかりだから仕方ない。 シェルスクリプトをどちらかに分類したがるのは無理なのでは。 単に、UNIXなどで単機能インタープリターをシェルと 呼び始めたんで、シェルは別物と思う人たちが出てきて しまっただけ。 OSのシステムコールとプログラミング言語の区別がない人間も多い システムコールとライブラリ関数 http://jibun.atmarkit.co.jp/lskill01/rensai/fulinux/02/01.html システムコールとライブラリ関数の区別は曖昧で、 昔はシステムコールだった手続きも今はライブラリ関数として実装されていることがありますし、その逆もあります。 そういった意味では、システムコールとライブラリ関数の違いを本気で意識しなければならないのは カーネルや基幹ライブラリを書くプログラマくらいと言えるかもしれません。 システムコールとライブラリ関数の違いが実際に役に立つのは、manページを参照するときです。 例えば「printf」にはコマンドのprintfとライブラリ関数のprintfがあるので、 ライブラリ関数のprintfの解説が見たければ「man 3 printf」と入力しないといけません。 「write」にはコマンドのwriteとシステムコールのwriteがあるので、 システムコールのほうが読みたければ「man 2 write」と入力しないといけません。 >>586 おまえはシェルがシェルスクリプトだと思っているのか? シェル用のスクリプトだからシェルスクリプトなのに。 powershell_ise coreとかあったら良いのに と思ったけど流石に需要ないか >>596 俺も欲しい vscodeでも出来るけど、捨てコード書くには面倒なんだよね VSCode の、Code Runner ソースコードの範囲を選択して、実行できる これは、便利なプラグイン! >>598 それ入れてないけど、範囲選択+F8で部分実行できたぞ 多分バージョンアップで不要になったプラグインだね 部分実行できる言語もあるしできない言語もある 対象言語にも触れず「これは便利!」っつってる>>598 もアホだし、対象言語もわかってないのに「バージョンアップで不要になったプラグイン」っつってる>>599 もアホ VSCode の、Code Runner ソースコードの範囲を選択して、右クリックメニューから実行できる 便利なプラグイン! PowerShell にも対応している powershell coreでNuGetパッケージを使いたい場合ってどうすればいいの Dapperを使う時にC#だったらdotnet add package Dapper; dotnet restoreだけどpowershellプロジェクトだとどうするのかな dotnet add package Dapper dotnet restore --packages ./packages Add-Type $source -ReferencedAssemblies netstandard, ./packages/.../Dapper.dll これでできたわ お前らまじで使えねえなー とあるフォルダ配下にあるテキストファイルだけ抽出して配列に格納 別のフォルダ配下にあるテキストファイルだけ抽出して配列に格納し配列同士を比較して同じファイルのみを抜き出してCompare-Objectで比較したいんですけどどうやったらできますか? >>607 $a = ls "フォルダ1" *.txt $b = ls "フォルダ2" *.txt $a + $b | group name | where count -eq 2 | foreach { $_.name; compare (gc $_.group[0] .fullname) (gc $_.group[1].fullname) | ft } >>608 >gc $_.group[0] .fullname .fullname の前に、半角空白が入っているから、エラーになる >>608 似たようなことよくやるが、やっぱ癖が出るね 自分なら最初こうやるかな @( Get-ChildItem "フォルダ1" *.txt Get-ChildItem "フォルダ2" *.txt )| 変数あまり使いたくないし、lsは動作がUNIXとは違うから紛らわしくて >>609 ありゃconemuだと折返し部分に勝手にスペース入っちゃうんだな >>610 そのへんは好みだとしてもそれ見て気づいたけどファイルが一つしかなくて$aが配列じゃない場合 $a + $b だとエラーになるね @($a; $b) とすべきだったか 1つか複数かで、オブジェクトの型が違うのか ややこしい言語やな そういう細かい変な挙動がめんどくさいからC#で書いてAdd-Typeしてるわ Linqあれば大抵の処理はPowerShellより書きやすいし読みやすい >>608 ありがとうございます これやったんですけどcountのところで型エラーになっちゃいました >>610 >>611でもダメみたいです >>614 powershellのバージョンは? 古いのはよくわからんけど Group-Object -Property Name とかしたらできるんかね もしpowershell2ならこれなら動くんじゃないかな、試してないけど @($a; $b) | Group-Object -Property Name | Where-Object { $_.Count -eq 2 } | Foreach-Object { $_.Name; Compare-Object -ReferenceObject $(Get-Content $_.Group[0].Fullname) -DifferenceObject $(Get-Content $_.Group[1].Fullname) | Format-Table } >>616 バージョンこんな感じです > $PSVersionTable Name Value ---- ----- CLRVersion 2.0.50727.8762 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions {1.0, 2.0} SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1 >>617 やると↓ $a=Get-ChildItem "D:\test\*.*" -include *.txt,*.dat $b=Get-ChildItem "G:\test\*.*" -include *.txt,*.dat @($a; $b) | Group-Object -Property Name | Where-Object { $_.Count -eq 2 } | Foreach-Object { $_.Name; ompare-Object -ReferenceObject $(Get-Content $_.Group[0].Fullname) -DifferenceObject $(Get-Content $_.Group[1].Fullname | Format-Table } b.txt Compare-Object : 引数が null であるため、パラメーター 'ReferenceObject' にバインドできません。 発生場所 行:1 文字:134 + @($a; $b) | Group-Object -Property Name | Where-Object { $_.Count -eq 2 } | Foreach-Object { $_.Name; Compare-Object -ReferenceObject <<<< $(Get-Content $_.Group[0].Fullname) -DifferenceObject $(Get-Content $_.Group[1].Fullname) | Form at-Table } + CategoryInfo : InvalidData: (:) [Compare-Object]、ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObje ctCommand -ReferenceObject $(if ($_.Group[0].Length -eq 0) {"空ファイル"} else {Get-Content $_.Group[0].Fullname}) とかすればいい-DifferenceObjectも同様に >>622 おお!なんか求めてるものができました ありがとうございます PSVersion 2.0 って、古いな 漏れは、Windows10 で、5.1 >>624 > PSVersion 2.0 って、古いな Windows 7 の標準装備だから会社によっては今でもその縛りがあるところは珍しくない むしろwin10なのに5.1は古い 6.01入れちまえ 標準で入ってるから使うんであって わざわざ入れるなんて許されない それがPowershellの掟 2.0でも問題ないように勉強しつつ、案件が始まったら最新版のインストールを駄目元でお願いする感じ ファイルの最後の文字のみ読み込んで 例えば最後の文字が 〇〇てすと だったら てすと に置換して元から"てすと"だったそのままにしたいんだけどどうすればできますか? ただし最終行が"てすと"じゃなかった場合は"てすと"を追記したいです 個人的にはループ処理で最終行から読み込んで意図した文字列なら置換って事がやれればいいと思ってます ※バージョンは2.0でお願いします! Ruby で作った text = File.read ARGV[0] # 引数はファイル名 ary = [] # 文字列を1行ずつ、配列に入れる text.each_line{ |line| ary << line } p ary # 戻り値は、置換が行われたときはレシーバ自身、置換されなかったときはnil if ary[-1].sub!(/〇〇てすと$/, 'てすと') # 処理なし。レシーバ自身を変更する elsif /てすと$/ !~ ary[-1] # てすと で終わらない ary[-1] += 'てすと' else return end p ary[-1] File.write(ARGV[0], ary.join) >>633 ここPowershellスレなんだが… >632をなんとなく作ってみたんですけど、 最後に出力された文字列だけを置換しての部分がうまくいかない 置換自体は出来るんだけどその部分だけ文字列に書き込む方法が分からん。。。 (Get-Content D:\test\a.txt)[(Get-Content D:\test\a.txt).length..0] | Foreach-Object { if( $_.length ){ if(!($_ -like "*てすと*")){ Add-Content -Path D:\test\a.txt -Value "てすと" break } $_ -replace ".*てすと.*", "てすと" break} } >その部分だけ、文字列に書き込む方法が分からん Ruby でも、ファイルを読み書き両用で開くと、 現在のシーク位置を、あれこれ移動しないといけないから、非常にややこしい。 シーク位置を変数に入れておいて、あれこれ考えるのは、ややこしい だから、テキスト全体を改行区切りの配列に入れて、最後の行だけを変更してから、 全部を書き込む方が簡単 633 では、そうしている 趣旨に合っているかな? $list=Get-Content sample.txt $text="てすと" foreach($line in $list){ if([string]::IsNullOrEmpty($line)){$line=$text} $str=$line.Substring($line.length-3) if($str -eq $text){ $newline=$str} else{ $newline=$line } $newline } 再度 $list=Get-Content test.txt $text="てすと" foreach($line in $list){ if([string]::IsNullOrEmpty($line)){$line=$text} $str=$line.Substring($line.length-3) if($str -eq $text){ $newline=$str} else{ $newline=$line } $newline } if($str -ne $text){$text} ぱわーしぇる風にパイプかつメモリ最小で作ってほしーなんつって つーかバッチファイルスレで似たような質問してたアホだなこいつ >>639 いいんだけどこれだと空白行全部"てすと"になっちゃてね? そうしてる。 空白行は空白のままでよかったんだ じゃIFのところだけ書き換え $list=Get-Content test.txt $text="てすと" foreach($line in $list){ if(-NOT [string]::IsNullOrEmpty($line)){ $str=$line.Substring($line.length-3)} if($str -eq $text){ $newline=$str} else{ $newline=$line } $newline } if($str -ne $text){$text} 考えたらこれだと文字数が3文字未満だとエラーになるな ねむいが・・書き換えてみるかな 今度はどうだろう $list=Get-Content test.txt $text="てすと" foreach($line in $list){ $newline=$line if($line.length -gt 2){ $str=$line.Substring($line.length-3) if($str -eq $text){ $newline=$str} } $newline } if($str -ne $text){$text} >>646 最終行だけてすとじゃなくてその上にてすとの文字列が有るとそのあと全部てすとになっちゃうね こんなもんかね psv2.0に配列のcountあったっけか $file = "test.txt" $text = "てすと" ,@(Get-Content $file)|%{ foreach($i in 0..($_.count-1)){ if($i -eq ($_.count-1)){ if($_[$i] -like "*$text"){ $text }else{ $_[$i];$text } }else{ $_[$i] } } }|Out-File $file >>641 あっちは、「最終行」じゃなくて「空行を除く最終行」だったからちょっと面倒だ >>647 なんと、寝ぼけてやってちゃだめだな。 あとで見直すわ PowerShellコード可読性低すぎワロタwww時代はC#ですわ Add-Type -TypeDefinition @" using System.IO; using System.Text.RegularExpressions; public class Hoge { private static readonly Regex r = new Regex(@"[^\n]*てすと$", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant); public static void ReplaceLastTest(FileInfo file) { string s = File.ReadAllText(file.FullName); s = r.Replace(s.TrimEnd(), string.Empty) + "てすと"; File.WriteAllText(file.FullName, s); } } "@ [Hoge]::ReplaceLastTest((Get-ChildItem ./test.txt)) >>651 PSなら書く必要もないもの多過ぎ ついでに普通の環境じゃ編集の補助まったくないだろ >>648 や>>646 のほうがよっぽど無駄なコード書いてるじゃんwww ループインデックスとか久々に見たわwwwwベタループも条件分岐もくっそ読みにくいしwww 編集の補助ってインテリセンスの事ならこの程度のコードに必要ないだろw つかpowershellerならVSCodeとっくに入っとるやろwww C#もサポートされとるやんけwwww >>648 これだと"てすと"の後に無駄な空行があるとその無駄な空行の後に"てすと"って出力されちゃうね ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる