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


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

PowerShell -Part 4



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が立ててね!!

651 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 16:19:55.73 ID:l+r11Fp5.net]
>>646
多次元だと倍以上遅いと言う根拠あるの?

652 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 16:27:11.02 ID:RDi5ol2j.net]
めんどくせー奴だな

653 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:00:59.84 ID:XYschmPc.net]
体感速度は変わらん

654 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:43:17.64 ID:jItJ//Mq.net]
>>647
自分で試せば良いんじゃね

655 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:46:52.74 ID:l+r11Fp5.net]
要は根拠もなしに
> 実際には多次元配列の方が遅い
と妄想をほざいてただけって話かよw

656 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:56:32.09 ID:jItJ//Mq.net]
>>651
うん、良いんじゃね、そういう結論で。
以上でよろしいか?

657 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 17:58:32.50 ID:j+tAxxjP.net]
>>651
質問に答えず茶化すだけかよw

658 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 19:30:32.27 ID:l+r11Fp5.net]
>>653
>>652に言ってくれよw

659 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 19:43:09.27 ID:/01g7c5c.net]
>>ID:l+r11Fp5
たくさん構ってもらえて良かったね



660 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:06:18.23 ID:l+r11Fp5.net]
>>655
恥の上塗りかなw

661 名前:633 mailto:sage [2020/10/26(月) 20:09:14.97 ID:5qWbLIDu.net]
>>643
Excelファイルから取得したデータを更に別の処理に使うのですが、その際に1次元で渡す必要があるためです

662 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:09:30.70 ID:/TCFG/M1.net]
実装としては添え字でメモリの位置を計算して参照するだけだから
一次元でも多次元でも原理的には速さは変わらないぞ

663 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:13:28.15 ID:jItJ//Mq.net]
>>656
きみが絶対的に正しいことはスレ住人の総意で共通認識なのだから、もう十分だろう?
そのへんで勘弁してもらないかな。なんなら土下座して謝るよ。

664 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:17:45.03 ID:mujdTIU3.net]
ちゃんとアンカー追えよ
ジャグ配列vs多次元配列が1次元vs多次元配列に化けてるぞ

>>647
>多次元だと倍以上遅いと言う根拠あるの?

「倍以上遅い」なんてどこから来たんだろう

665 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:28:30.59 ID:l+r11Fp5.net]
>>658
>>646によると専用命令があるらしいけど、嘘なのかね?

>>660
ああすまん、脳内で二次元配列 ⇔ ジャグ配列 って思ってたわ
まあ3次元以上なら専用命令とやらがもっと速くないとダメだけど

666 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 20:36:57.75 ID:mujdTIU3.net]
あんたはまず「倍以上」の出所を説明しないと

667 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 21:11:41.27 ID:EAm4Av0T.net]
www5b.biglobe.ne.jp/~yone-ken/VBNET/IL/il15_UseArray.html

> ILにも1次元配列については専用の命令が用意されています。

668 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 21:49:29.23 ID:AmD6br2D.net]
#2次元配列初期化
Measure-Command {
$i = 0; $array = New-Object "object[,]" 1000,1000
for ($x = 0; $x -lt $array.GetLength(0); $x++) {
for ($y = 0; $y -lt $array.GetLength(1); $y++) {
$array[$x,$y] = $i++
}
}
}

#ジャグ配列初期化
Measure-Command {
$i = 0; $array = New-Object "object[]" 1000
for ($x = 0; $x -lt $array.length; $x++) {
$array[$x] = New-Object "object[]" 1000
for ($y = 0; $y -lt $array[$x].length; $y++) {
$array[$x][$y] = $i++
}
}
}

たしかに初期化の段階でジャグ配列のが速いね

669 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:09:49.38 ID:l+r11Fp5.net]
>>662
ジャグ配列知らんの?
二次元相当のジャグ配列だと2回辿らないとダメだから倍は速くないとトータルで遅くなるでしょ



670 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:22:45.88 ID:5/h2v6nN.net]
>>665
PSで例見せてよ

671 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:37:25.27 ID:l+r11Fp5.net]
ILの話にPSとか言われてもw

672 名前:デフォルトの名無しさん mailto:sage [2020/10/26(月) 22:48:42.22 ID:l+r11Fp5.net]
軽くググったら最近の.Net Coreとかだと状況次第って感じやね
https://takap-tech.com/entry/2020/02/24/213932
原理考えたらまあ妥当な結果だと思う

673 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 01:23:06.66 ID:IPa2oLl3.net]
なるほど勉強になります

674 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 13:37:08.15 ID:bD3kPd/D.net]
なるほど理解できません

675 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 15:37:54.18 ID:az6RTKF7.net]
処理系の実装に寄るけど、うまくインデックスを張れば
速度的には同等になるはずだけどな

676 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 19:29:05.55 ID:k9DNZwa6.net]
>>671
どういう理論なんだ?
ランダムアクセスだとジャグ配列は次元毎にメモリーアクセスして辿らないとダメだけど多次元配列ならインデックスの計算してその場所にアクセスするだけだから多次元配列の方が速い
シーケンシャルアクセスだとアクセスの多くは最後の次元のアクセスだから毎回インデックスを計算する多次元配列よりジャグ配列の方が速いと思う
まあめっちゃ最適化して多次元配列を1次元配列に展開するようなコードにまで落とせたら多次元配列の方が微妙に速くなるかも

677 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 19:52:31.91 ID:Sd8akiyh.net]
なんにせよ多次元配列を1次元配列に高速に平坦化する方法分からないんだろ
グダグダスレ引き延ばしておきながらなw

678 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 21:46:07.02 ID:UFBDJ7q0.net]
@($a)

Foreach-Objectもforeach分も要らない

679 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 21:47:10.61 ID:UFBDJ7q0.net]
foreach分 → foreach文



680 名前:デフォルトの名無しさん mailto:sage [2020/10/27(火) 22:27:25.79 ID:6aj92Tm3.net]
>>673
そんな低レベルなことでドヤれるとか羨ましいわw

681 名前:デフォルトの名無しさん mailto:sage [2020/10/28(水) 19:54:09.10 ID:RpzUgl/d.net]
>>674
>@($a)
PSってこんなオチが多いね
$aって打てば全部列挙されて出てくるんだからあれれとは思うんだけどさ

682 名前:633 mailto:sage [2020/10/29(木) 21:32:08.09 ID:/oXwNFXj.net]
>>674
返信遅れてすみません。
0.2秒まで速くなりました。

シンプルかつナンバーワンですね
目からウロコでした。

683 名前:デフォルトの名無しさん mailto:sage [2020/10/29(木) 23:08:28.85 ID:u3CTd5OP.net]
>>677
こういうトリッキー系?は趣味PGならいいんだけど
業務PGに実装するには躊躇するんだよなあw

684 名前:デフォルトの名無しさん mailto:sage [2020/10/29(木) 23:35:09.18 ID:ebCj94Ij.net]
え? これは常識では・・・

685 名前:デフォルトの名無しさん mailto:sage [2020/10/30(金) 08:08:54.65 ID:xvehW8+X.net]
PowerShell使うならほぼ常識、てか知らないと辛いレベル
そもそもPowerShell自体が色々トリッキーな動作するし、特に配列周り

686 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 13:12:42.29 ID:cgiVh2xg.net]
$a = [Object[,]]::new(3,3); $a.Rank は 2

$b = $a; $b.Rank は 2
$b = & { $a }; $b.Rank だと 1
$b = $a + @(); $b.Rank でも 1
もちろん $b.Length はどれも 9

$b = $a が特例のように思えてきた
どうしてこうなるのかきちんと理屈が知りたい

687 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 14:39:03.01 ID:Q6ZeZ8N8.net]
配列での foreach の使用 (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/arrays/using-foreach-with-arrays

多次元配列の場合、右端の次元のインデックスが最初に加算されていき、次にその左の次元、またその左、というような方法で各要素がトラバースされます。

int[,] numbers2D = new int[3, 2] { { 9, 99 }, { 3, 33 }, { 5, 55 } };
// Or use the short form:
// int[,] numbers2D = { { 9, 99 }, { 3, 33 }, { 5, 55 } };

foreach (int i in numbers2D)
{
System.Console.Write("{0} ", i);
}
// Output: 9 99 3 33 5 55

688 名前:682 mailto:sage [2020/11/02(月) 17:29:09.65 ID:cgiVh2xg.net]
明示的な foreach の使用は興味がないなあ
$b = $a も $b = & { $a } も $a を $b に代入するのに
なんで結果が違うのかが知りたい

689 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 17:46:27.91 ID:O692h/lZ.net]
最初のやつ以外はシンプルな代入じゃなくて演算してるから、演算の結果が一次元配列になっただけじゃないの



690 名前:682 mailto:sage [2020/11/02(月) 17:50:23.99 ID:cgiVh2xg.net]
$b = & { $a } も演算?
具体的にどういう演算になるのかわからない

691 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 17:54:46.38 ID:Razdsa9H.net]
>>682
>$b = & { $a }; $b.Rank だと 1
>$b = $a + @(); $b.Rank でも 1
この2つは$aがそれぞれ評価されて1次元になって$bに代入されてる
$b = & { $a }
の場合$aの前にカンマを入れれば型は保たれる
$b = & { ,$a }
PowerShellの謎仕様

692 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:05:40.51 ID:Razdsa9H.net]
おそらくスクリプトブロックを通過するときと
右辺や左辺に置いて演算するとき
それぞれ1次元に変換されてしまう仕様みたい

693 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:07:36.92 ID:O692h/lZ.net]
>>686
起動演算子にスクリプトブロックを渡してるんだから演算でしょ
スクリプトで
$a
とだけ書くと$aが評価されて左上から順に9行分の出力が得られる
$b=&{$a}はその出力の代入になってる

694 名前:682 mailto:sage [2020/11/02(月) 18:14:48.39 ID:cgiVh2xg.net]
じゃあやっぱり単純な代入 $b = $a だけが特別で
それ以外は配列が展開されるってことか
理解した

>>687
& { $a } だと配列 $a が展開される
& { ,$a } にすれば配列の配列 ,$a が展開されて配列 $a がそのまま渡される

695 名前:682 mailto:sage [2020/11/02(月) 18:50:05.02 ID:cgiVh2xg.net]
あれ違うな
単純な代入だけでなく Comma operator も特例になるのか

696 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 18:58:29.51 ID:WQUINiFK.net]
>>691
特例だとか自分勝手な解釈をする癖を直さないと、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
自分が既に頭の中に描いているイメージに合わせて無理に解釈方法を寄せていくのではなくて、本来理解すべき仕様の方に自分の中の理解を修正して近づけていく方がいいぞ。

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






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

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

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