1 名前:デフォルトの名無しさん mailto:sage [2020/01/01(水) 16:08:31.66 ID:4oQ1Kxot.net] 前スレ PowerShell -Part 3 https://mevius.5ch.net/test/read.cgi/tech/1539074808/ 次スレは>>980 が立ててね!!
697 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 19:13:13.99 ID:eTL99CIn.net] ウザっ
698 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 19:59:31.61 ID:D4NZ1UY1.net] >>692 TPO をわきまえられずトンチンカンな御高説垂れる人も、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
699 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 20:30:51.76 ID:Razdsa9H.net] >>690 原理的にはジャグ配列にして空評価させて返すで合ってると思う 恐らく処理系のソース読み込まないと判らないよ 配列返す関数作る時も同じ方法
700 名前:682 mailto:sage [2020/11/02(月) 20:44:58.19 ID:cgiVh2xg.net] ,$a は Comma operator で1要素の配列を返すけれど その時に $a は展開されずに2次元配列のまま これは単純な代入と同じ扱いだよね
701 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 21:48:13.16 ID:Qlwbnxz+.net] { $a } は { Write-Output $a } の事 Write-Output に配列を渡した時の挙動を考えればいい https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-output By default, Write-Output enumerates through collections provided to the cmdlet. However, Write-Output can also be used to pass collections down the pipeline as a single object with the NoEnumerate parameter.
702 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 22:48:01.97 ID:O692h/lZ.net] ウザかろうと思って特例云々につっこむのやめたけどやっぱり書くわ 代入は代入でしかなく特例も何もない いつだって右辺の値をありのままの型と値で代入するだけ $b=&{$a} というのを代入として認識するからおかしくなる $b=$a.Rank と書いたら$bは数値になるわけだけど、代入したから数値になった!とは思わないでしょ あくまで.Rankを評価した結果が数値になって、その数値を$bに代入したに過ぎない $b=&{$a} も &{$a} の評価結果が一次元配列になる仕様なだけで、代入が何かの法則性に寄与している訳ではないし、一次元配列になるという一貫したルールや思想があるわけでもない
703 名前:682 mailto:sage [2020/11/03(火) 00:15:03.20 ID:Da50zhuo.net] operand を展開してから operator にわたすんじゃなくて operand をそのままわたして operator が展開したりしなかったりする たぶん理解した
704 名前:デフォルトの名無しさん mailto:sage [2020/11/03(火) 08:59:33.05 ID:HUEo3Cdu.net] >>682 の$b = $a は$aの参照を$bに代入している $a = [Object[,]]::new(3,3) $b = $a $b[0,0] = 1 echo $a[0,0] #=> 1 $b = & { $a } は { $a }というスクリプトブロックを実行して戻り値を代入する { $a } の意味は >>697 を見ろ
705 名前:デフォルトの名無しさん mailto:sage [2020/11/04(水) 10:50:57.08 ID:ZJcGuVz6.net] >>694 初学者が変な誤解すると二度と修正する機会ないからな みんな巡り巡って自分が被る迷惑を未然に防ごうと必死なわけよ
706 名前:デフォルトの名無しさん mailto:sage [2020/11/04(水) 20:48:58.85 ID:0afqdDmu.net] いつの間にかヘルプの翻訳作業が始まってた https://github.com/MicrosoftDocs/PowerShell-Docs.ja-jp/tree/live/reference/7.1
707 名前:デフォルトの名無しさん mailto:sage [2020/11/07(土) 21:29:59.64 ID:AAgSLehy.net] こんなシェルを書きました。 function get_stop_code { $hoge=(Get-Content stop_code.txt) } while ($true) { get_stop_code Write-Output $hoge } シェル実行中に、stop_code.txtの中身を書き換えても get_stop_codeがファイルの中身を拾ってくれません いろいろ試したら、こうしたらうまくいきました。がすっきりしません。 function get_stop_code { $hoge=(Get-Content stop_code.txt) Write-Output $hoge } while ($true) { $stop_code=(get_stop_code) write-output $stop_code } get_stop_codeがファイルの中身を、while ($true)の中でうまく拾ってくれる 書き方を教えてください。
708 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 00:25:05.60 ID:gCrk6dnE.net] これって遅延展開系の話なのかな?
709 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 02:53:16.74 ID:mlfH60EQ.net] スコープの話だと思うよ 関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない 関数を次のように書き換えて明示的にスクリプトスコープの変数を更新してやればいい function get_stop_code { $script:hoge=(Get-Content stop_code.txt) } PSのスコープって特殊で悩ましい 特にループの初回、ほかの言語みたいに未宣言の変数だぞとエラーになってくれればまだいいんだけど、変数が作られて親からも見えちゃうから混乱する
710 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 08:09:56.71 ID:0BM2Z5Uf.net] おれも一瞬ではなく数分、>>703 の問題がわからなかった とりあえず頭にSet-StrictMode -Version Latestを付けとけばエラーにはなる
711 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 10:11:33.41 ID:vf10kFcr.net] >>705 ありがとうございます。 >関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない というのは、 >>703 だと、 同じシェル内にある$hogeであっても、 @get_stop_code関数内の$hoge Awhile ($true)内にある$hoge の2種類があり、 while ($true)内で、get_stop_code関数を実行しても、 @の$hogeしか書き換わらないから、求める結果が得られない。 って事でしょうか。
712 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 12:20:50.04 ID:mlfH60EQ.net] そんな感じ 関数はローカルスコープを作る whileの方はその外側にあたるから親スコープになる ちなみにPSではwhileブロックはローカルスコープを作らないのでスクリプト全体のスコープと同じ
713 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 14:40:55.27 ID:vf10kFcr.net] >>708 ありがとうございます。 スコープですね、勉強になりました。 きっと、しっかり理解すれば便利な仕様なんでしょうが、 初学者にとっては罠でしかありませんね・・・こういうの・・・。
714 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 21:23:36.42 ID:TgcNdU0w.net] about_Scopes https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847849(v=wps.640)
715 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 11:42:35.91 ID:tOFQB4no.net] ダイナミックスコーン
716 名前:デフォルトの名無しさん [2020/11/09(月) 13:18:24.63 ID:hpK1fX+1.net] >>707 その前にシェルという単語の使い方がおかしい ファミリーベーシックで「ファミコン書きました」と言ってる感じで 恥ずかしいのでやめたほうがいい
717 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 13:43:05.15 ID:6e3D9VGJ.net] シェルスクリプトはシェルスクリプトであってシェルではない
718 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 18:13:48.88 ID:XoDGsHQu.net] 今どきファミリーベーシックに例えても人に通じないぜーっ!!
719 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 18:47:25.54 ID:8i+JRxOJ.net] べーしっ君はもっと通じないだろw
720 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 21:56:26.60 ID:zTstc6LM.net] ショットシェルだったら散弾のことでちょっとかっこいいぐらいなのに… hb-plaza.com/wp/wp-content/uploads/2013/12/00buck001.jpg
721 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 22:20:12.83 ID:7qqOuQ5J.net] ちょっと知れるね
722 名前:デフォルトの名無しさん [2020/11/09(月) 22:31:51.42 ID:NYGqo7nG.net] ポンタポイントが付くか楽天ポイントが付くかの違いで基本的には一緒だよ
723 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 02:41:01.00 ID:TotITmpP.net] スクリプトスコープ以外にも、関数スコープがあるのは便利。 C, Ruby と同じ 関数スコープが無い言語は、プログラミングが異常に難しい
724 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 04:19:48.53 ID:UHXHz0W1.net] その程度の事で「異常に」難しいんじゃ向いてないんじゃない? 多少面倒臭いなと思う事はあっても
725 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 04:24:34.34 ID:/n5BB76T.net] 再帰呼び出しで・・・
726 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 09:42:32.98 ID:v1zmG+Gm.net] むしろローカル変数の恩恵に理解を示し、グローバル変数を強制されたら不安だと思う感性の方が普段たくさんプログラミングしてるんだろうなと感じる 変数iを使ったループの中でさらに別の変数iを使った関数を呼ぶと無限ループのバグになる 代わりにjにしようとか考えてると早晩行き詰まるので「i_関数名」みたいな変数名を常に使うことを思い付く 関数名は短くしたいと考えるようになって可読性がまずいことに 短いスクリプトしか書かない用途の言語ならいいけど、そうでないなら品質の低いコードを招く言語になるだろうな
727 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 13:37:25.83 ID:xsn7mmhw.net] ローカルとグローバルの話はまあややこしいな
728 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 13:43:57.86 ID:xsn7mmhw.net] 自分のいる世界の常識が他の場所で通用するかどうか それを生きていて初めて見せられた例がプログラミングのローカルとグローバルだった なんていうPCヲタも少なくないだろうなあw ブロック過ぎたらまっさらに戻る言語なら 関数が動かないと思ったらちゃんと戻り値にして出さないとなあ 報告連絡相談 と同じ
729 名前:デフォルトの名無しさん mailto:sage [2020/11/12(木) 08:30:03.86 ID:HWijez2q.net] Announcing PowerShell 7.1 https://devblogs.microsoft.com/powershell/announcing-powershell-7-1/
730 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 01:15:46.84 ID:TgKG6lgf.net] プログラム経験ほぼゼロの初心者です。 プログラムのコマンドラインの引数に変数を使うと上手く動作しません。 ttps://aji0.web.fc2.com/ ←ここのAviUtlControlというソフトを使ってコマンドラインでAviUtlに動画ファイルを送りたいんですが、 「& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args"」とすると 「ファイルの読み込みに失敗しました。このファイル形式には対応していないか対応するコーデックやプラグインが登録されていない可能性があります」 とエラーが出て読み込めません。 同じファイルを「& auc_open.exe "(読み込ませたいファイルのフルパス)"」とすると開けます。 「Start-Process -FilePath auc_open.exe "(読み込ませたいファイルのフルパス)"」とした場合auc_open.exe自体が動作しません。 書き方を間違えているでしょうか? 普通に開ける動画ファイルもあるので相性の問題かもしれないのですが…。
731 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 02:31:24.83 ID:8Ha10j62.net] >>726 Paramで宣言してないなら、$argsじゃなくて$args[0]じゃない? https://microsoftou.com/ps-arguments/ 文字列じゃなくて「配列」のまま渡しちゃってるんじゃないかな? Start-Process -FilePath auc_open.exeでauc_open.exeが開かないなら、auc_open.exeのあるディレクトリとは違うディレクトリで実行してるとか? auc_open.exeのあるディレクトリに移動するか、auc_open.exeをフルパスで指定してみたら?
732 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 03:29:17.05 ID:TgKG6lgf.net] ありがとうございます。$args[0]に書き換えてみましたが、結果は同じでした。 リンク先に従ってParam($Arg1)と一行目に書いてみると「空の文字列が渡されている」とエラーになりました。 もちろん$args1に書き換えています。 GetType().FullNameで$args[0]を調べてみましたが、System.Stringになっていました。 上記では省略しましたが、auc_open.exeはフルパスで書いています。 変数を使っていますが、write-hostで調べたところパスに間違いは無かったです。 windowsやpowershellのバージョンのせいな気もしてきた。windows10は1906でpowershellはバージョン5.1です。
733 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 03:41:57.52 ID:TgKG6lgf.net] あ、そうそう、このAviUtlControlというソフトは、もともとコマンドラインの無いAviUtlに 強引にコマンドラインを外付けにするため、実際の動作はAviUtlの「ファイルを開く」を遠隔操作しているだけみたいですね。 windowsのファイルを開くダイアログボックスが表示されるので。 そういう動作をしているのに、ps1ファイルにフルパスで直接ファイルを指定した場合は正常に開けて $argsを使ってps1ファイルにD&Dした場合は「ファイルが対応していない」というエラーが出るよく分からない挙動になります。 $argsもwrite-hostしてみましたが、ちゃんと目的のファイルがフルパスで格納されています。
734 名前:726 mailto:sage [2020/11/13(金) 03:56:04.19 ID:TgKG6lgf.net] $args[0]ではなく$argsをGetType().FullNameしてみるとsystem.object[]になっていました。 $args = [string]$argsとして文字列に変換してみましたが結果は同じ。 あと、$args[0]をwrite-hostしてみると拡張子の末尾に[0]がついていましたがこれは正常ですか?
735 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 05:04:21.79 ID:HX9sr4kC.net] >>726 & auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args" ↓ & auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args それでだめなら & auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args[0] こんな簡単な話じゃ無いよなあ?
736 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 10:40:00.19 ID:3YZH6rMm.net] どうせパス名に()や[]が付いているというオチなんでしょ
737 名前:726 mailto:sage [2020/11/13(金) 12:38:30.15 ID:TgKG6lgf.net] >>731 >>728 で試しました。 バッチファイルで (フルパス)auc_open.exe %1 とし、動画ファイルをD&Dしたら正常に開けました。 powershellと動画の相性か、書き間違えているかです。 pastebinに貼っておきます。 ttps://pastebin.com/Dupj68Z4 このスクリプトで何がやりたいのかというと、録画したテレビ番組のCMカットするのに 動画ファイルを開く→音声ファイルを追加読み込みという手順を踏まなきゃいけないのをボタン一発で済ませたいんです。
738 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 13:31:59.37 ID:907SkV9V.net] "$args" は$argsって文字列と解釈されるから、 $argsは参照されない & $open "$args"は$argsという引数として解釈されてる "$m2v" + "*.wav"も$m2v*.wavと解釈される 変数を参照したいなら変数はダブルクォートで囲ってはダメ & $open $args $m2v + "*.wav" のようにする
739 名前:726 mailto:sage [2020/11/13(金) 13:57:21.84 ID:TgKG6lgf.net] >>734 ありがとうございます。結果は変わりませんでした。 最初に書いたように正常に開ける動画ファイルもあるので本当に相性問題かもしれません…
740 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 16:35:19.24 ID:907SkV9V.net] すぐ相性問題で解決したことに使用とする奴嫌い 変数内にダブルクォート付きの文字列を格納してないのは分かってる?
741 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 19:25:55.17 ID:pkjRHYH3.net] "$args"と書いたらinterpolationされるので$argsの内容は参照されるよ PSもモダンなので "my name is $name" みたいな書き方ができる リテラルになるのは'$args'と書いた場合 でも"$args[0]"と書いたらダメ どこまで変数でどこから文字列なのかが想定と合わない "$($args[0])"と書く必要がある [0]を付けないと配列への参照になるから"$args"だと引数間に改行コードが入る 読み込めない動画はパスに空白に含まれているのかもしれないな
742 名前:デフォルトの名無しさん [2020/11/13(金) 19:30:14.24 ID:34jLv13e.net] >>726 cmd[.]exe(コマンドラインと呼んでいるものの実体)に引数が渡るときの パースの問題の可能性がある フルパスに空白が入っているかどうかで成否が変わったりしない? "$args" を ""$args"" or `"$args`" にしてみたら
743 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 19:33:35.59 ID:pkjRHYH3.net] あと "$($args -join ' ')" も試すといいかもな
744 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 19:37:05.80 ID:pkjRHYH3.net] これスペースが連続するファイル名があると失敗するな… 切り分けにはなるからいいか
745 名前:デフォルトの名無しさん [2020/11/13(金) 19:40:36.71 ID:lrdHTx5A.net] psって難しいんだな
746 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 19:55:31.96 ID:8Ha10j62.net] >>728 $argsは配列なので、その中身の一番目を取り出すために$args[0]って書くってことだよ 自分でGetTypeして$argsはobject[]、$args[0]はStringだって確認出来てるじゃん それに加えて、$argsを書き換えて使うのは混乱するから、$args = [string]$args じゃなくて、$m2v = $args[0] みたいにして、$m2vの方を使ったら? その上で、>>734 のアドバイスに従って修正したものをpastebinに貼ってみて 相性が気になるなら、「正常に開けない動画ファイル」を「正常に開ける動画ファイル」と同じ場所に同じ名前で置いてみて開けるなら相性じゃないって確認できるよ c:\abc.m2v ←開ける d:\[movie]\zz xyz.m2v ←開けない みたいな状況だとして、(abc.m2vを退避してから)zz xyz.m2vをabc.m2vにリネームしてc:\に置いてみたら開けるんじゃないかな?
747 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 20:45:29.62 ID:HX9sr4kC.net] >>738 >フルパスに空白が入っているかどうかで成否が変わったりしない? 空白とかマルチバイトとかあっちの問題か!
748 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 21:24:00.55 ID:34jLv13e.net] >>738 \"$args\" かも 昔自分で書いたもののひとつはそうなってた 理由の説明はできん
749 名前:デフォルトの名無しさん [2020/11/13(金) 21:28:03.15 ID:n6TD+JMZ.net] ぱわーしぇるがシェルではない事が証明されたな
750 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 23:47:58.29 ID:LLS1FCOb.net] ファイルパス・ユーザー名に、空白・日本語を使うと、バグる。 半角英数字・ハイフン・アンダーバーだけにする Windows のパスには、空白が入っているものがあるので、ヤバイ
751 名前:726 mailto:sage [2020/11/14(土) 00:23:47.78 ID:8FDial4y.net] あああああ原因分かったあああ! 全角スペースだああ! 駄目なファイルの全角スペースを削除したら読み込めました! しかし修正方法が分からない…。とりあえず>>742 さんの言う通り$m2v = $argsとして、以下ここで貼られていた改善案の結果 "$args"の場合:$m2vの中身→フルパス $args[0]の場合:$m2vの中身→最初の半角スペースまで ""$args"" →スクリプト自体がすぐに終了 `"$args`" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。 "$($args -join ' ')" →ファイル読み込みに失敗 $m2vの中身→フルパス \"$args\" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。 "$($args[0])"→ファイル読み込みに失敗、$m2vの中身は最初の半角スペースまで 正直$args[0]を理解できてない気がします。殆ど変わってませんが、とりあえずpastebinに貼っておきます。ttps://pastebin.com/AQZqQ6aX
752 名前:726 mailto:sage [2020/11/14(土) 01:10:54.25 ID:8FDial4y.net] あ、下記忘れましたが"$args"と$args[0]も最初と変わらずファイル読み込みに失敗します。
753 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 01:52:08.34 ID:OfQ57GBv.net] -joinじゃ空白の連続があるとバグることには気付いてたけど、PSが全角空白をホワイトスペースとして扱うのは盲点だったわ こういうところPSは厄介だな…… そのスクリプトは呼び出された時点で既に引数が復元不能になってるので、スクリプトの呼び出し元を変える必要がある powershell C:¥your-script.ps1 "a b c.avi" のように呼び出しているのだとしたら powershell -file C:¥your-script.ps1 "a b c.avi" と書き換えると動く ちなみにスクリプト内でParamを明示的に定義して powershell C:¥your-script.ps1 -oreore_arg0 "a b c.avi" のように呼んでもいいらしい
754 名前:726 mailto:sage [2020/11/14(土) 03:06:15.72 ID:8FDial4y.net] >>749 行けました! ありがとうございます! 後半の意味がちょっと分からないんですが、動画ファイル名を明確にしろということでしょうか?
755 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 04:21:18.02 ID:C2BVBS/P.net] 引数をシングル・ダブルクォーテーションで囲む事で、 1つの引数として解釈される 囲っていないと、複数の引数として解釈されてしまうから こういうのは、Linux では、うるさいぐらいに注意する
756 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 05:26:16.13 ID:/XxpwyFY.net] 最初にPCに自分の名前を流用した名前を付ける時点で 半角英数にする、空白入れないというのを徹底しないと自動化には程遠い
757 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 05:35:00.14 ID:YIajn/qh.net] おめやで(*´▽`*)
758 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 07:04:37.55 ID:4EKVBZXC.net] おめやで?
759 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 10:49:04.93 ID:OfQ57GBv.net] >>750 自分で引数名を定義して渡すやり方 引数ひとつひとつの範囲を明確にできるのでPSにおかしな解釈をされようがなくなる どちらかというと経験者向けの参考として書いたから動いたなら気にしなくていいと思う Powershell Paramで検索したら詳しく出てくる
760 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 11:12:05.60 ID:OfQ57GBv.net] >>751 今回はその常識に反するPS固有の問題だよ powershell C:¥foo.ps1 "a b c" d e f # 全角半角空白混在 のように書くと、経験的な常識では $args[0] = "a b c" $args[1] = "d" $args[2] = "e f" の3つに分解されることを期待するけど、今回は a 〜 f が全部バラされて$argsは6個の配列になるという事象 経験から問題を矮小化しがちになるのは老化による成長鈍化だと思う 自戒を込めて
761 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 11:18:40.57 ID:xztQReuw.net] 省略しないで実際に流したコマンドをそのまま晒したほうがいいような気はする せいぜい数行だろうし
762 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 13:03:46.86 ID:eAmLQM6Q.net] WindowsのD&Dによるバグ仕様を回避するためにはpathに半角spを含めておいた方が良い
763 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 14:43:52.28 ID:vnxWLQnj.net] >>756 > a 〜 f が全部バラされて$argsは6個の配列になる どのバージョンだよ 5.1、7.0、7.1で試したけど $args[0] は "a b c"、$args.Length は 4 になるぞ
764 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 15:37:31.99 ID:OfQ57GBv.net] >>759 バージョン5.1をcmdから呼び出して確認した 再現しなかったのは-fileを指定したからじゃない?
765 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 15:44:28.74 ID:cwgCwaC3.net] >>759 Windowsのパラメーターの分解は呼ばれ側プロセスで処理すんだけど powershellは起動時のバージョンと実行時のバージョンが違うことがある powershellのバージョン違いを複数入れてる場合が恐らく該当する 引数4になるパターンはpowershellバージョン2で実行されてる powershell -v 2 で起動した場合は引数4 powershell -v 5 は全部バラけて引数6 俺はこういうバグだか仕様だかに付き合うの嫌だから一時ファイルや環境変数とかでやりとりする
766 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 16:04:59.98 ID:cwgCwaC3.net] [Environment]::CommandLine や [Environment]::GetCommandLineArgs() を使うとpowershellに因らない.NETで処理したパラメーターが得られるからこれが安全かもね
767 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 16:05:13.61 ID:OfQ57GBv.net] -v 2 で起動したらたしかに引数4になったけど $args[0] は a になったわw -v 2 だと全角スペースが区切りとして解釈されない
768 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 16:21:10.31 ID:OfQ57GBv.net] 原理はこんな感じかな? まずPS外から呼び出したときは引数はいわゆる普通にparseされる powershell C:¥foo.ps1 "a b c" d e f → C:¥foo.ps1、"a b c"、d、e f の4引数 powershell.exeに-fileも-commandも指定されなかったとき、powershellはすべての引数を-commandの対象として扱う powershell.exeは引数をワンライナーのスクリプトとして処理しようとする 複数に分割されて受けたパラメーターをコードで例えると $args -join ' ' のような残念な方法で結合する & "C:¥foo.ps1 a b c d e f" 相当のスクリプトが実行される 全角スペースを区切りと見なすかどうかはPSのバージョン次第
769 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 20:24:33.59 ID:6rE1W4Lt.net] シングルクォーテーションならいけるんじゃなかったっけ
770 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 20:25:14.57 ID:ojc3zNUJ.net] これはひどい PS由来の機能は信用しない方がいいな
771 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 21:14:45.67 ID:BVcYkKlk.net] 全角スペースを許すプログラミング言語まとめ https://pronama.jp/2015/09/06/allows-ideographic-space-programming-languages/
772 名前:デフォルトの名無しさん mailto:sage [2020/11/14(土) 21:25:00.22 ID:OfQ57GBv.net] >>765 シングルで試したらいけたわw シングルならPS外では単なる文字として扱われるからcmdから呼び出したとき C:¥foo.ps1 'a b c' d e f の5引数になって、連結結果は & "C:¥foo.ps1 'a b c' d e f" 相当になるからうまくいく模様
773 名前:デフォルトの名無しさん mailto:sage [2020/11/16(月) 22:11:59.00 ID:ssVCI5qt.net] Excelのセル内の文字列全部ではなく、セル内の一部の文字列だけ文字色を変更する事は出きますか?
774 名前:デフォルトの名無しさん mailto:sage [2020/11/16(月) 22:33:49.14 ID:lpvH3HhJ.net] 自決しました。かおもじ
775 名前:デフォルトの名無しさん mailto:sage [2020/11/27(金) 20:48:34.28 ID:0Gsdb/Fk.net] >>756 powershell C:\foo.ps1 "a` b` c" d e` f
776 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 20:01:43.24 ID:ako3hAti.net] .Net Frameworkの質問になるかもしれんが、Powershellから使うのでこちらに 対話型のスクリプト作っててユーザーからファイルやフォルダのパスの入力を求めるのにGUIにしようと思って System.Windows.Forms.FolderBrowserDialogとか FileBrowserDialogとかを使ってやろうとしてますが、 ダイアログ画面が他のウインドウに隠れてユーザーが気づきません。 最前面表示させるにはどうすればよいでしょうか?
777 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 21:23:54.75 ID:ako3hAti.net] 自決しました。 topmostプロパティをtrueに設定したFormオブジェクトを FolderBrowserDialogオブジェクトのShowDialogメソッドの引数に渡すんですね。 こういう方法はマニュアル読んでもまったくわからない。苦手。
778 名前:デフォルトの名無しさん mailto:sage [2020/11/28(土) 22:56:50.75 ID:goyIH8CW.net] >>773 待て早まるな
779 名前:726 mailto:sage [2020/12/03(木) 20:12:26.39 ID:AP2X4U04.net] >>726 です。先日は貴重なアドバイスをどうもありがとうございました。 申し訳無いんですがまた詰まってしまったので助けて下さい。 Trim(2505,6665) ++ Trim(9815,34297)〜 という内容のテキストファイルを整形して 2505 6665 9815 34297 という形にしたいんですが、改行が出来ません。 ttps://orahoview.com/replacetextinfilebypowershell/ ここを参考に $utltrimfile = $(Get-Content (テキストファイルのパス)) -replace ") ++ Trim(" "`n" $utltrimfile = $trimfile -replace "," "`n" $utltrimfile > (テキストファイルのパス) と書いてみたんですが「`nを使用できません」とエラーが出ます。\nでも同様の結果でした。 改行をする方法はありますか?
780 名前:デフォルトの名無しさん mailto:sage [2020/12/03(木) 20:44:02.20 ID:gj1mOZdT.net] >>775 数字以外が出てきたらそこで区切ることで配列にする 配列要素のうち空文字列であるものを除外 配列をまるごとファイルにリダイレクトして改行された出力結果を得る $utltrimfile = $(Get-Content (テキストファイルのパス)) -split '\D' | ?{$_ -ne '' } $utltrimfile > (テキストファイルのパス)
781 名前:726 mailto:sage [2020/12/03(木) 21:29:21.46 ID:AP2X4U04.net] 出来ました! ありがとうございました!
782 名前:デフォルトの名無しさん [2020/12/07(月) 00:00:56.83 ID:8Ddysj0U.net] PowerShellにinterfaceありますか? 空のクラス定義するしかないですか?
783 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 00:09:24.05 ID:rAKRPC/o.net] ■Powershellコマンドを実行する PS C:\Users\hoge> Get-NetIPConfiguration InterfaceAlias : Wi-Fi InterfaceIndex : 10 InterfaceDescription : TP-Link Wireless USB Adapter NetProfile.Name : Buffalo-A-428D (以下略) なんかたくさん出る ■(Powershellコマンド).列の名前 を実行する PS C:\Users\hoge> > (Get-NetIPConfiguration).NetProfile.Name Buffalo-A-428D .列の名前で指定したものしか出ない。 こういう(コマンド).列名っていうので、出力を絞る方法に名前ってありませんか?
784 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 00:52:35.54 ID:fL+10lW/.net] grep
785 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 00:55:50.26 ID://YuCj5S.net] interfaceってたぶんJava的な意味でのやつか
786 名前:デフォルトの名無しさん [2020/12/07(月) 00:57:24.19 ID:8Ddysj0U.net] >>781 そうなのよ
787 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 01:07:36.68 ID:nVLltyNc.net] : だね
788 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 07:14:39.74 ID:Zb+BuNXc.net] >>779 . はプロパティ逆参照演算子だよ Property dereference operator
789 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 07:24:15.67 ID:Zb+BuNXc.net] . で出力を絞る方法、正確には対象を選ぶ方法は、一般的にはプロパティアクセスが該当するかな
790 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 08:49:51.37 ID:Qq2AGx/W.net] メンバーアクセス演算子 . https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_operators#member-access-operator- オブジェクトのプロパティおよびメソッドにアクセスします。 メンバー名は式にすることができます。 $myProcess.peakWorkingSet (Get-Process PowerShell).kill() 'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }
791 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 15:48:31.93 ID:5uzreY+I.net] copy-itemでディレクトリを指定して、内部のファイルがパス260文字以上でエラーを出すとき、そのパスを取得する方法はあります?
792 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 16:04:01.41 ID:8iO4bdx+.net] >>787 Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathEnabled -Value 1
793 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 18:20:51.52 ID:5uzreY+I.net] >>788 ありがとう ただそのやり方はwin10にしか出来ないようで、win8.1ではLongPathEnabledは存在しないようです ググってもLongPathEnabledのwin8.1版は見つからないもので……
794 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 22:33:03.33 ID:wvARFKZP.net] >>789 単に制限回避したいなら \\?\ 使えば良いんじゃないかな https://stackoverflow.com/a/53099257 https://superuser.com/a/760601 そうじゃなくて、260文字以上のパスを探したいなら、そういうツールがいくつかあるよ https://sourceforge.net/projects/tlpd/
795 名前:デフォルトの名無しさん mailto:sage [2020/12/07(月) 23:37:26.80 ID:5uzreY+I.net] >>790 試してみます ありがとなす
796 名前:デフォルトの名無しさん mailto:sage [2020/12/08(火) 15:51:45.96 ID:CDSpQQd3.net] 外部コマンド | PowerShellの関数って風にパイプでつないで処理するとき 出力側が終わるまで一旦全部バッファリングしてから、ようやくPowerShellに処理が移る感じになるんですが 並列で処理するようにするにはどうすればいいでしょうか?
797 名前:デフォルトの名無しさん mailto:sage [2020/12/10(木) 21:12:35.73 ID:6BQNLUy5.net] #1個めループ for($i=0; $i -le 10; $i++) { $hoge="ikkaime_" Write-Output $hoge$i } #2個めループ for($i=0; $i -le 10; $i++) { $hoge="nikaime_" Write-Output $hoge$i } これを1個のforにまとめる素敵なアイデアございませんでしょうか。 何がしたいかというと、1個めのループ(10回)が終わったら、$hogeをniakieme_にして、 もう10回ループさせて終わるようにしたいです。