前スレ
PowerShell -Part 3
https://mevius.5ch.net/test/read.cgi/tech/1539074808/
次スレは>>980が立ててね!!
探検
PowerShell -Part 4
■ このスレッドは過去ログ倉庫に格納されています
2020/01/01(水) 16:08:31.66ID:4oQ1Kxot
689デフォルトの名無しさん
2020/11/02(月) 18:07:36.92ID:O692h/lZ690682
2020/11/02(月) 18:14:48.39ID:cgiVh2xg じゃあやっぱり単純な代入 $b = $a だけが特別で
それ以外は配列が展開されるってことか
理解した
>>687
& { $a } だと配列 $a が展開される
& { ,$a } にすれば配列の配列 ,$a が展開されて配列 $a がそのまま渡される
それ以外は配列が展開されるってことか
理解した
>>687
& { $a } だと配列 $a が展開される
& { ,$a } にすれば配列の配列 ,$a が展開されて配列 $a がそのまま渡される
691682
2020/11/02(月) 18:50:05.02ID:cgiVh2xg あれ違うな
単純な代入だけでなく Comma operator も特例になるのか
単純な代入だけでなく Comma operator も特例になるのか
692デフォルトの名無しさん
2020/11/02(月) 18:58:29.51ID:WQUINiFK >>691
特例だとか自分勝手な解釈をする癖を直さないと、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
自分が既に頭の中に描いているイメージに合わせて無理に解釈方法を寄せていくのではなくて、本来理解すべき仕様の方に自分の中の理解を修正して近づけていく方がいいぞ。
特例だとか自分勝手な解釈をする癖を直さないと、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
自分が既に頭の中に描いているイメージに合わせて無理に解釈方法を寄せていくのではなくて、本来理解すべき仕様の方に自分の中の理解を修正して近づけていく方がいいぞ。
693デフォルトの名無しさん
2020/11/02(月) 19:13:13.99ID:eTL99CIn ウザっ
694デフォルトの名無しさん
2020/11/02(月) 19:59:31.61ID:D4NZ1UY1 >>692
TPO をわきまえられずトンチンカンな御高説垂れる人も、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
TPO をわきまえられずトンチンカンな御高説垂れる人も、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
695デフォルトの名無しさん
2020/11/02(月) 20:30:51.76ID:Razdsa9H696682
2020/11/02(月) 20:44:58.19ID:cgiVh2xg ,$a は Comma operator で1要素の配列を返すけれど
その時に $a は展開されずに2次元配列のまま
これは単純な代入と同じ扱いだよね
その時に $a は展開されずに2次元配列のまま
これは単純な代入と同じ扱いだよね
697デフォルトの名無しさん
2020/11/02(月) 21:48:13.16ID:Qlwbnxz+ { $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.
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.
698デフォルトの名無しさん
2020/11/02(月) 22:48:01.97ID:O692h/lZ ウザかろうと思って特例云々につっこむのやめたけどやっぱり書くわ
代入は代入でしかなく特例も何もない
いつだって右辺の値をありのままの型と値で代入するだけ
$b=&{$a} というのを代入として認識するからおかしくなる
$b=$a.Rank と書いたら$bは数値になるわけだけど、代入したから数値になった!とは思わないでしょ
あくまで.Rankを評価した結果が数値になって、その数値を$bに代入したに過ぎない
$b=&{$a} も &{$a} の評価結果が一次元配列になる仕様なだけで、代入が何かの法則性に寄与している訳ではないし、一次元配列になるという一貫したルールや思想があるわけでもない
代入は代入でしかなく特例も何もない
いつだって右辺の値をありのままの型と値で代入するだけ
$b=&{$a} というのを代入として認識するからおかしくなる
$b=$a.Rank と書いたら$bは数値になるわけだけど、代入したから数値になった!とは思わないでしょ
あくまで.Rankを評価した結果が数値になって、その数値を$bに代入したに過ぎない
$b=&{$a} も &{$a} の評価結果が一次元配列になる仕様なだけで、代入が何かの法則性に寄与している訳ではないし、一次元配列になるという一貫したルールや思想があるわけでもない
699682
2020/11/03(火) 00:15:03.20ID:Da50zhuo operand を展開してから operator にわたすんじゃなくて
operand をそのままわたして operator が展開したりしなかったりする
たぶん理解した
operand をそのままわたして operator が展開したりしなかったりする
たぶん理解した
700デフォルトの名無しさん
2020/11/03(火) 08:59:33.05ID:HUEo3Cdu701デフォルトの名無しさん
2020/11/04(水) 10:50:57.08ID:ZJcGuVz6702デフォルトの名無しさん
2020/11/04(水) 20:48:58.85ID:0afqdDmu703デフォルトの名無しさん
2020/11/07(土) 21:29:59.64ID:AAgSLehy こんなシェルを書きました。
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)の中でうまく拾ってくれる
書き方を教えてください。
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)の中でうまく拾ってくれる
書き方を教えてください。
704デフォルトの名無しさん
2020/11/08(日) 00:25:05.60ID:gCrk6dnE これって遅延展開系の話なのかな?
705デフォルトの名無しさん
2020/11/08(日) 02:53:16.74ID:mlfH60EQ スコープの話だと思うよ
関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
関数を次のように書き換えて明示的にスクリプトスコープの変数を更新してやればいい
function get_stop_code {
$script:hoge=(Get-Content stop_code.txt)
}
PSのスコープって特殊で悩ましい
特にループの初回、ほかの言語みたいに未宣言の変数だぞとエラーになってくれればまだいいんだけど、変数が作られて親からも見えちゃうから混乱する
関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
関数を次のように書き換えて明示的にスクリプトスコープの変数を更新してやればいい
function get_stop_code {
$script:hoge=(Get-Content stop_code.txt)
}
PSのスコープって特殊で悩ましい
特にループの初回、ほかの言語みたいに未宣言の変数だぞとエラーになってくれればまだいいんだけど、変数が作られて親からも見えちゃうから混乱する
706デフォルトの名無しさん
2020/11/08(日) 08:09:56.71ID:0BM2Z5Uf おれも一瞬ではなく数分、>>703の問題がわからなかった
とりあえず頭にSet-StrictMode -Version Latestを付けとけばエラーにはなる
とりあえず頭にSet-StrictMode -Version Latestを付けとけばエラーにはなる
707デフォルトの名無しさん
2020/11/08(日) 10:11:33.41ID:vf10kFcr708デフォルトの名無しさん
2020/11/08(日) 12:20:50.04ID:mlfH60EQ そんな感じ
関数はローカルスコープを作る
whileの方はその外側にあたるから親スコープになる
ちなみにPSではwhileブロックはローカルスコープを作らないのでスクリプト全体のスコープと同じ
関数はローカルスコープを作る
whileの方はその外側にあたるから親スコープになる
ちなみにPSではwhileブロックはローカルスコープを作らないのでスクリプト全体のスコープと同じ
709デフォルトの名無しさん
2020/11/08(日) 14:40:55.27ID:vf10kFcr710デフォルトの名無しさん
2020/11/08(日) 21:23:36.42ID:TgcNdU0w about_Scopes
https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847849(v=wps.640)
https://docs.microsoft.com/ja-jp/previous-versions/windows/powershell-scripting/hh847849(v=wps.640)
711デフォルトの名無しさん
2020/11/09(月) 11:42:35.91ID:tOFQB4no ダイナミックスコーン
712デフォルトの名無しさん
2020/11/09(月) 13:18:24.63ID:hpK1fX+1713デフォルトの名無しさん
2020/11/09(月) 13:43:05.15ID:6e3D9VGJ シェルスクリプトはシェルスクリプトであってシェルではない
714デフォルトの名無しさん
2020/11/09(月) 18:13:48.88ID:XoDGsHQu 今どきファミリーベーシックに例えても人に通じないぜーっ!!
715デフォルトの名無しさん
2020/11/09(月) 18:47:25.54ID:8i+JRxOJ べーしっ君はもっと通じないだろw
716デフォルトの名無しさん
2020/11/09(月) 21:56:26.60ID:zTstc6LM ショットシェルだったら散弾のことでちょっとかっこいいぐらいなのに…
http://hb-plaza.com/wp/wp-content/uploads/2013/12/00buck001.jpg
http://hb-plaza.com/wp/wp-content/uploads/2013/12/00buck001.jpg
717デフォルトの名無しさん
2020/11/09(月) 22:20:12.83ID:7qqOuQ5J ちょっと知れるね
718デフォルトの名無しさん
2020/11/09(月) 22:31:51.42ID:NYGqo7nG ポンタポイントが付くか楽天ポイントが付くかの違いで基本的には一緒だよ
719デフォルトの名無しさん
2020/11/10(火) 02:41:01.00ID:TotITmpP スクリプトスコープ以外にも、関数スコープがあるのは便利。
C, Ruby と同じ
関数スコープが無い言語は、プログラミングが異常に難しい
C, Ruby と同じ
関数スコープが無い言語は、プログラミングが異常に難しい
720デフォルトの名無しさん
2020/11/10(火) 04:19:48.53ID:UHXHz0W1 その程度の事で「異常に」難しいんじゃ向いてないんじゃない?
多少面倒臭いなと思う事はあっても
多少面倒臭いなと思う事はあっても
721デフォルトの名無しさん
2020/11/10(火) 04:24:34.34ID:/n5BB76T 再帰呼び出しで・・・
722デフォルトの名無しさん
2020/11/10(火) 09:42:32.98ID:v1zmG+Gm むしろローカル変数の恩恵に理解を示し、グローバル変数を強制されたら不安だと思う感性の方が普段たくさんプログラミングしてるんだろうなと感じる
変数iを使ったループの中でさらに別の変数iを使った関数を呼ぶと無限ループのバグになる
代わりにjにしようとか考えてると早晩行き詰まるので「i_関数名」みたいな変数名を常に使うことを思い付く
関数名は短くしたいと考えるようになって可読性がまずいことに
短いスクリプトしか書かない用途の言語ならいいけど、そうでないなら品質の低いコードを招く言語になるだろうな
変数iを使ったループの中でさらに別の変数iを使った関数を呼ぶと無限ループのバグになる
代わりにjにしようとか考えてると早晩行き詰まるので「i_関数名」みたいな変数名を常に使うことを思い付く
関数名は短くしたいと考えるようになって可読性がまずいことに
短いスクリプトしか書かない用途の言語ならいいけど、そうでないなら品質の低いコードを招く言語になるだろうな
723デフォルトの名無しさん
2020/11/10(火) 13:37:25.83ID:xsn7mmhw ローカルとグローバルの話はまあややこしいな
724デフォルトの名無しさん
2020/11/10(火) 13:43:57.86ID:xsn7mmhw 自分のいる世界の常識が他の場所で通用するかどうか
それを生きていて初めて見せられた例がプログラミングのローカルとグローバルだった
なんていうPCヲタも少なくないだろうなあw
ブロック過ぎたらまっさらに戻る言語なら
関数が動かないと思ったらちゃんと戻り値にして出さないとなあ
報告連絡相談 と同じ
それを生きていて初めて見せられた例がプログラミングのローカルとグローバルだった
なんていうPCヲタも少なくないだろうなあw
ブロック過ぎたらまっさらに戻る言語なら
関数が動かないと思ったらちゃんと戻り値にして出さないとなあ
報告連絡相談 と同じ
725デフォルトの名無しさん
2020/11/12(木) 08:30:03.86ID:HWijez2q Announcing PowerShell 7.1
https://devblogs.microsoft.com/powershell/announcing-powershell-7-1/
https://devblogs.microsoft.com/powershell/announcing-powershell-7-1/
726デフォルトの名無しさん
2020/11/13(金) 01:15:46.84ID:TgKG6lgf プログラム経験ほぼゼロの初心者です。
プログラムのコマンドラインの引数に変数を使うと上手く動作しません。
ttps://aji0.web.fc2.com/ ←ここのAviUtlControlというソフトを使ってコマンドラインでAviUtlに動画ファイルを送りたいんですが、
「& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args"」とすると
「ファイルの読み込みに失敗しました。このファイル形式には対応していないか対応するコーデックやプラグインが登録されていない可能性があります」
とエラーが出て読み込めません。
同じファイルを「& auc_open.exe "(読み込ませたいファイルのフルパス)"」とすると開けます。
「Start-Process -FilePath auc_open.exe "(読み込ませたいファイルのフルパス)"」とした場合auc_open.exe自体が動作しません。
書き方を間違えているでしょうか? 普通に開ける動画ファイルもあるので相性の問題かもしれないのですが…。
プログラムのコマンドラインの引数に変数を使うと上手く動作しません。
ttps://aji0.web.fc2.com/ ←ここのAviUtlControlというソフトを使ってコマンドラインでAviUtlに動画ファイルを送りたいんですが、
「& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args"」とすると
「ファイルの読み込みに失敗しました。このファイル形式には対応していないか対応するコーデックやプラグインが登録されていない可能性があります」
とエラーが出て読み込めません。
同じファイルを「& auc_open.exe "(読み込ませたいファイルのフルパス)"」とすると開けます。
「Start-Process -FilePath auc_open.exe "(読み込ませたいファイルのフルパス)"」とした場合auc_open.exe自体が動作しません。
書き方を間違えているでしょうか? 普通に開ける動画ファイルもあるので相性の問題かもしれないのですが…。
727デフォルトの名無しさん
2020/11/13(金) 02:31:24.83ID:8Ha10j62 >>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をフルパスで指定してみたら?
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をフルパスで指定してみたら?
728デフォルトの名無しさん
2020/11/13(金) 03:29:17.05ID:TgKG6lgf ありがとうございます。$args[0]に書き換えてみましたが、結果は同じでした。
リンク先に従ってParam($Arg1)と一行目に書いてみると「空の文字列が渡されている」とエラーになりました。
もちろん$args1に書き換えています。
GetType().FullNameで$args[0]を調べてみましたが、System.Stringになっていました。
上記では省略しましたが、auc_open.exeはフルパスで書いています。
変数を使っていますが、write-hostで調べたところパスに間違いは無かったです。
windowsやpowershellのバージョンのせいな気もしてきた。windows10は1906でpowershellはバージョン5.1です。
リンク先に従ってParam($Arg1)と一行目に書いてみると「空の文字列が渡されている」とエラーになりました。
もちろん$args1に書き換えています。
GetType().FullNameで$args[0]を調べてみましたが、System.Stringになっていました。
上記では省略しましたが、auc_open.exeはフルパスで書いています。
変数を使っていますが、write-hostで調べたところパスに間違いは無かったです。
windowsやpowershellのバージョンのせいな気もしてきた。windows10は1906でpowershellはバージョン5.1です。
729デフォルトの名無しさん
2020/11/13(金) 03:41:57.52ID:TgKG6lgf あ、そうそう、このAviUtlControlというソフトは、もともとコマンドラインの無いAviUtlに
強引にコマンドラインを外付けにするため、実際の動作はAviUtlの「ファイルを開く」を遠隔操作しているだけみたいですね。
windowsのファイルを開くダイアログボックスが表示されるので。
そういう動作をしているのに、ps1ファイルにフルパスで直接ファイルを指定した場合は正常に開けて
$argsを使ってps1ファイルにD&Dした場合は「ファイルが対応していない」というエラーが出るよく分からない挙動になります。
$argsもwrite-hostしてみましたが、ちゃんと目的のファイルがフルパスで格納されています。
強引にコマンドラインを外付けにするため、実際の動作はAviUtlの「ファイルを開く」を遠隔操作しているだけみたいですね。
windowsのファイルを開くダイアログボックスが表示されるので。
そういう動作をしているのに、ps1ファイルにフルパスで直接ファイルを指定した場合は正常に開けて
$argsを使ってps1ファイルにD&Dした場合は「ファイルが対応していない」というエラーが出るよく分からない挙動になります。
$argsもwrite-hostしてみましたが、ちゃんと目的のファイルがフルパスで格納されています。
730726
2020/11/13(金) 03:56:04.19ID:TgKG6lgf $args[0]ではなく$argsをGetType().FullNameしてみるとsystem.object[]になっていました。
$args = [string]$argsとして文字列に変換してみましたが結果は同じ。
あと、$args[0]をwrite-hostしてみると拡張子の末尾に[0]がついていましたがこれは正常ですか?
$args = [string]$argsとして文字列に変換してみましたが結果は同じ。
あと、$args[0]をwrite-hostしてみると拡張子の末尾に[0]がついていましたがこれは正常ですか?
731デフォルトの名無しさん
2020/11/13(金) 05:04:21.79ID:HX9sr4kC >>726
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args"
↓
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args
それでだめなら
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args[0]
こんな簡単な話じゃ無いよなあ?
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) "$args"
↓
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args
それでだめなら
& auc_open.exe(AviUltでコマンドラインからファイルを開くプログラム) $args[0]
こんな簡単な話じゃ無いよなあ?
732デフォルトの名無しさん
2020/11/13(金) 10:40:00.19ID:3YZH6rMm どうせパス名に()や[]が付いているというオチなんでしょ
733726
2020/11/13(金) 12:38:30.15ID:TgKG6lgf734デフォルトの名無しさん
2020/11/13(金) 13:31:59.37ID:907SkV9V "$args" は$argsって文字列と解釈されるから、
$argsは参照されない
& $open "$args"は$argsという引数として解釈されてる
"$m2v" + "*.wav"も$m2v*.wavと解釈される
変数を参照したいなら変数はダブルクォートで囲ってはダメ
& $open $args
$m2v + "*.wav" のようにする
$argsは参照されない
& $open "$args"は$argsという引数として解釈されてる
"$m2v" + "*.wav"も$m2v*.wavと解釈される
変数を参照したいなら変数はダブルクォートで囲ってはダメ
& $open $args
$m2v + "*.wav" のようにする
735726
2020/11/13(金) 13:57:21.84ID:TgKG6lgf736デフォルトの名無しさん
2020/11/13(金) 16:35:19.24ID:907SkV9V すぐ相性問題で解決したことに使用とする奴嫌い
変数内にダブルクォート付きの文字列を格納してないのは分かってる?
変数内にダブルクォート付きの文字列を格納してないのは分かってる?
737デフォルトの名無しさん
2020/11/13(金) 19:25:55.17ID:pkjRHYH3 "$args"と書いたらinterpolationされるので$argsの内容は参照されるよ
PSもモダンなので "my name is $name" みたいな書き方ができる
リテラルになるのは'$args'と書いた場合
でも"$args[0]"と書いたらダメ
どこまで変数でどこから文字列なのかが想定と合わない
"$($args[0])"と書く必要がある
[0]を付けないと配列への参照になるから"$args"だと引数間に改行コードが入る
読み込めない動画はパスに空白に含まれているのかもしれないな
PSもモダンなので "my name is $name" みたいな書き方ができる
リテラルになるのは'$args'と書いた場合
でも"$args[0]"と書いたらダメ
どこまで変数でどこから文字列なのかが想定と合わない
"$($args[0])"と書く必要がある
[0]を付けないと配列への参照になるから"$args"だと引数間に改行コードが入る
読み込めない動画はパスに空白に含まれているのかもしれないな
738デフォルトの名無しさん
2020/11/13(金) 19:30:14.24ID:34jLv13e >>726
cmd[.]exe(コマンドラインと呼んでいるものの実体)に引数が渡るときの
パースの問題の可能性がある
フルパスに空白が入っているかどうかで成否が変わったりしない?
"$args" を ""$args"" or `"$args`" にしてみたら
cmd[.]exe(コマンドラインと呼んでいるものの実体)に引数が渡るときの
パースの問題の可能性がある
フルパスに空白が入っているかどうかで成否が変わったりしない?
"$args" を ""$args"" or `"$args`" にしてみたら
739デフォルトの名無しさん
2020/11/13(金) 19:33:35.59ID:pkjRHYH3 あと "$($args -join ' ')" も試すといいかもな
740デフォルトの名無しさん
2020/11/13(金) 19:37:05.80ID:pkjRHYH3 これスペースが連続するファイル名があると失敗するな…
切り分けにはなるからいいか
切り分けにはなるからいいか
741デフォルトの名無しさん
2020/11/13(金) 19:40:36.71ID:lrdHTx5A psって難しいんだな
742デフォルトの名無しさん
2020/11/13(金) 19:55:31.96ID:8Ha10j62 >>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:\に置いてみたら開けるんじゃないかな?
$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:\に置いてみたら開けるんじゃないかな?
743デフォルトの名無しさん
2020/11/13(金) 20:45:29.62ID:HX9sr4kC744デフォルトの名無しさん
2020/11/13(金) 21:24:00.55ID:34jLv13e745デフォルトの名無しさん
2020/11/13(金) 21:28:03.15ID:n6TD+JMZ ぱわーしぇるがシェルではない事が証明されたな
746デフォルトの名無しさん
2020/11/13(金) 23:47:58.29ID:LLS1FCOb ファイルパス・ユーザー名に、空白・日本語を使うと、バグる。
半角英数字・ハイフン・アンダーバーだけにする
Windows のパスには、空白が入っているものがあるので、ヤバイ
半角英数字・ハイフン・アンダーバーだけにする
Windows のパスには、空白が入っているものがあるので、ヤバイ
747726
2020/11/14(土) 00:23:47.78ID:8FDial4y あああああ原因分かったあああ! 全角スペースだああ! 駄目なファイルの全角スペースを削除したら読み込めました!
しかし修正方法が分からない…。とりあえず>>742さんの言う通り$m2v = $argsとして、以下ここで貼られていた改善案の結果
"$args"の場合:$m2vの中身→フルパス
$args[0]の場合:$m2vの中身→最初の半角スペースまで
""$args"" →スクリプト自体がすぐに終了
`"$args`" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。
"$($args -join ' ')" →ファイル読み込みに失敗 $m2vの中身→フルパス
\"$args\" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。
"$($args[0])"→ファイル読み込みに失敗、$m2vの中身は最初の半角スペースまで
正直$args[0]を理解できてない気がします。殆ど変わってませんが、とりあえずpastebinに貼っておきます。ttps://pastebin.com/AQZqQ6aX
しかし修正方法が分からない…。とりあえず>>742さんの言う通り$m2v = $argsとして、以下ここで貼られていた改善案の結果
"$args"の場合:$m2vの中身→フルパス
$args[0]の場合:$m2vの中身→最初の半角スペースまで
""$args"" →スクリプト自体がすぐに終了
`"$args`" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。
"$($args -join ' ')" →ファイル読み込みに失敗 $m2vの中身→フルパス
\"$args\" →コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されていません。
"$($args[0])"→ファイル読み込みに失敗、$m2vの中身は最初の半角スペースまで
正直$args[0]を理解できてない気がします。殆ど変わってませんが、とりあえずpastebinに貼っておきます。ttps://pastebin.com/AQZqQ6aX
748726
2020/11/14(土) 01:10:54.25ID:8FDial4y あ、下記忘れましたが"$args"と$args[0]も最初と変わらずファイル読み込みに失敗します。
749デフォルトの名無しさん
2020/11/14(土) 01:52:08.34ID:OfQ57GBv -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"
のように呼んでもいいらしい
こういうところ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"
のように呼んでもいいらしい
750726
2020/11/14(土) 03:06:15.72ID:8FDial4y751デフォルトの名無しさん
2020/11/14(土) 04:21:18.02ID:C2BVBS/P 引数をシングル・ダブルクォーテーションで囲む事で、
1つの引数として解釈される
囲っていないと、複数の引数として解釈されてしまうから
こういうのは、Linux では、うるさいぐらいに注意する
1つの引数として解釈される
囲っていないと、複数の引数として解釈されてしまうから
こういうのは、Linux では、うるさいぐらいに注意する
752デフォルトの名無しさん
2020/11/14(土) 05:26:16.13ID:/XxpwyFY 最初にPCに自分の名前を流用した名前を付ける時点で
半角英数にする、空白入れないというのを徹底しないと自動化には程遠い
半角英数にする、空白入れないというのを徹底しないと自動化には程遠い
753デフォルトの名無しさん
2020/11/14(土) 05:35:00.14ID:YIajn/qh おめやで(*´▽`*)
754デフォルトの名無しさん
2020/11/14(土) 07:04:37.55ID:4EKVBZXC おめやで?
755デフォルトの名無しさん
2020/11/14(土) 10:49:04.93ID:OfQ57GBv >>750
自分で引数名を定義して渡すやり方
引数ひとつひとつの範囲を明確にできるのでPSにおかしな解釈をされようがなくなる
どちらかというと経験者向けの参考として書いたから動いたなら気にしなくていいと思う
Powershell Paramで検索したら詳しく出てくる
自分で引数名を定義して渡すやり方
引数ひとつひとつの範囲を明確にできるのでPSにおかしな解釈をされようがなくなる
どちらかというと経験者向けの参考として書いたから動いたなら気にしなくていいと思う
Powershell Paramで検索したら詳しく出てくる
756デフォルトの名無しさん
2020/11/14(土) 11:12:05.60ID:OfQ57GBv >>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個の配列になるという事象
経験から問題を矮小化しがちになるのは老化による成長鈍化だと思う
自戒を込めて
今回はその常識に反する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個の配列になるという事象
経験から問題を矮小化しがちになるのは老化による成長鈍化だと思う
自戒を込めて
757デフォルトの名無しさん
2020/11/14(土) 11:18:40.57ID:xztQReuw 省略しないで実際に流したコマンドをそのまま晒したほうがいいような気はする
せいぜい数行だろうし
せいぜい数行だろうし
758デフォルトの名無しさん
2020/11/14(土) 13:03:46.86ID:eAmLQM6Q WindowsのD&Dによるバグ仕様を回避するためにはpathに半角spを含めておいた方が良い
759デフォルトの名無しさん
2020/11/14(土) 14:43:52.28ID:vnxWLQnj >>756
> a 〜 f が全部バラされて$argsは6個の配列になる
どのバージョンだよ
5.1、7.0、7.1で試したけど $args[0] は "a b c"、$args.Length は 4 になるぞ
> a 〜 f が全部バラされて$argsは6個の配列になる
どのバージョンだよ
5.1、7.0、7.1で試したけど $args[0] は "a b c"、$args.Length は 4 になるぞ
760デフォルトの名無しさん
2020/11/14(土) 15:37:31.99ID:OfQ57GBv761デフォルトの名無しさん
2020/11/14(土) 15:44:28.74ID:cwgCwaC3 >>759
Windowsのパラメーターの分解は呼ばれ側プロセスで処理すんだけど
powershellは起動時のバージョンと実行時のバージョンが違うことがある
powershellのバージョン違いを複数入れてる場合が恐らく該当する
引数4になるパターンはpowershellバージョン2で実行されてる
powershell -v 2 で起動した場合は引数4
powershell -v 5 は全部バラけて引数6
俺はこういうバグだか仕様だかに付き合うの嫌だから一時ファイルや環境変数とかでやりとりする
Windowsのパラメーターの分解は呼ばれ側プロセスで処理すんだけど
powershellは起動時のバージョンと実行時のバージョンが違うことがある
powershellのバージョン違いを複数入れてる場合が恐らく該当する
引数4になるパターンはpowershellバージョン2で実行されてる
powershell -v 2 で起動した場合は引数4
powershell -v 5 は全部バラけて引数6
俺はこういうバグだか仕様だかに付き合うの嫌だから一時ファイルや環境変数とかでやりとりする
762デフォルトの名無しさん
2020/11/14(土) 16:04:59.98ID:cwgCwaC3 [Environment]::CommandLine
や
[Environment]::GetCommandLineArgs()
を使うとpowershellに因らない.NETで処理したパラメーターが得られるからこれが安全かもね
や
[Environment]::GetCommandLineArgs()
を使うとpowershellに因らない.NETで処理したパラメーターが得られるからこれが安全かもね
763デフォルトの名無しさん
2020/11/14(土) 16:05:13.61ID:OfQ57GBv -v 2 で起動したらたしかに引数4になったけど $args[0] は a になったわw
-v 2 だと全角スペースが区切りとして解釈されない
-v 2 だと全角スペースが区切りとして解釈されない
764デフォルトの名無しさん
2020/11/14(土) 16:21:10.31ID:OfQ57GBv 原理はこんな感じかな?
まず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のバージョン次第
まず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のバージョン次第
765デフォルトの名無しさん
2020/11/14(土) 20:24:33.59ID:6rE1W4Lt シングルクォーテーションならいけるんじゃなかったっけ
766デフォルトの名無しさん
2020/11/14(土) 20:25:14.57ID:ojc3zNUJ これはひどい
PS由来の機能は信用しない方がいいな
PS由来の機能は信用しない方がいいな
767デフォルトの名無しさん
2020/11/14(土) 21:14:45.67ID:BVcYkKlk 全角スペースを許すプログラミング言語まとめ
https://pronama.jp/2015/09/06/allows-ideographic-space-programming-languages/
https://pronama.jp/2015/09/06/allows-ideographic-space-programming-languages/
768デフォルトの名無しさん
2020/11/14(土) 21:25:00.22ID:OfQ57GBv >>765
シングルで試したらいけたわw
シングルならPS外では単なる文字として扱われるからcmdから呼び出したとき
C:¥foo.ps1
'a
b c'
d
e f
の5引数になって、連結結果は
& "C:¥foo.ps1 'a b c' d e f" 相当になるからうまくいく模様
シングルで試したらいけたわw
シングルならPS外では単なる文字として扱われるからcmdから呼び出したとき
C:¥foo.ps1
'a
b c'
d
e f
の5引数になって、連結結果は
& "C:¥foo.ps1 'a b c' d e f" 相当になるからうまくいく模様
769デフォルトの名無しさん
2020/11/16(月) 22:11:59.00ID:ssVCI5qt Excelのセル内の文字列全部ではなく、セル内の一部の文字列だけ文字色を変更する事は出きますか?
770デフォルトの名無しさん
2020/11/16(月) 22:33:49.14ID:lpvH3HhJ 自決しました。かおもじ
771デフォルトの名無しさん
2020/11/27(金) 20:48:34.28ID:0Gsdb/Fk >>756
powershell C:\foo.ps1 "a` b` c" d e` f
powershell C:\foo.ps1 "a` b` c" d e` f
772デフォルトの名無しさん
2020/11/28(土) 20:01:43.24ID:ako3hAti .Net Frameworkの質問になるかもしれんが、Powershellから使うのでこちらに
対話型のスクリプト作っててユーザーからファイルやフォルダのパスの入力を求めるのにGUIにしようと思って
System.Windows.Forms.FolderBrowserDialogとか
FileBrowserDialogとかを使ってやろうとしてますが、
ダイアログ画面が他のウインドウに隠れてユーザーが気づきません。
最前面表示させるにはどうすればよいでしょうか?
対話型のスクリプト作っててユーザーからファイルやフォルダのパスの入力を求めるのにGUIにしようと思って
System.Windows.Forms.FolderBrowserDialogとか
FileBrowserDialogとかを使ってやろうとしてますが、
ダイアログ画面が他のウインドウに隠れてユーザーが気づきません。
最前面表示させるにはどうすればよいでしょうか?
773デフォルトの名無しさん
2020/11/28(土) 21:23:54.75ID:ako3hAti 自決しました。
topmostプロパティをtrueに設定したFormオブジェクトを
FolderBrowserDialogオブジェクトのShowDialogメソッドの引数に渡すんですね。
こういう方法はマニュアル読んでもまったくわからない。苦手。
topmostプロパティをtrueに設定したFormオブジェクトを
FolderBrowserDialogオブジェクトのShowDialogメソッドの引数に渡すんですね。
こういう方法はマニュアル読んでもまったくわからない。苦手。
774デフォルトの名無しさん
2020/11/28(土) 22:56:50.75ID:goyIH8CW >>773
待て早まるな
待て早まるな
775726
2020/12/03(木) 20:12:26.39ID:AP2X4U04 >>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でも同様の結果でした。
改行をする方法はありますか?
申し訳無いんですがまた詰まってしまったので助けて下さい。
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でも同様の結果でした。
改行をする方法はありますか?
776デフォルトの名無しさん
2020/12/03(木) 20:44:02.20ID:gj1mOZdT >>775
数字以外が出てきたらそこで区切ることで配列にする
配列要素のうち空文字列であるものを除外
配列をまるごとファイルにリダイレクトして改行された出力結果を得る
$utltrimfile = $(Get-Content (テキストファイルのパス)) -split '\D' | ?{$_ -ne '' }
$utltrimfile > (テキストファイルのパス)
数字以外が出てきたらそこで区切ることで配列にする
配列要素のうち空文字列であるものを除外
配列をまるごとファイルにリダイレクトして改行された出力結果を得る
$utltrimfile = $(Get-Content (テキストファイルのパス)) -split '\D' | ?{$_ -ne '' }
$utltrimfile > (テキストファイルのパス)
777726
2020/12/03(木) 21:29:21.46ID:AP2X4U04 出来ました! ありがとうございました!
778デフォルトの名無しさん
2020/12/07(月) 00:00:56.83ID:8Ddysj0U PowerShellにinterfaceありますか? 空のクラス定義するしかないですか?
779デフォルトの名無しさん
2020/12/07(月) 00:09:24.05ID:rAKRPC/o ■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
.列の名前で指定したものしか出ない。
こういう(コマンド).列名っていうので、出力を絞る方法に名前ってありませんか?
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
.列の名前で指定したものしか出ない。
こういう(コマンド).列名っていうので、出力を絞る方法に名前ってありませんか?
780デフォルトの名無しさん
2020/12/07(月) 00:52:35.54ID:fL+10lW/ grep
781デフォルトの名無しさん
2020/12/07(月) 00:55:50.26ID://YuCj5S interfaceってたぶんJava的な意味でのやつか
782デフォルトの名無しさん
2020/12/07(月) 00:57:24.19ID:8Ddysj0U >>781
そうなのよ
そうなのよ
783デフォルトの名無しさん
2020/12/07(月) 01:07:36.68ID:nVLltyNc :
だね
だね
784デフォルトの名無しさん
2020/12/07(月) 07:14:39.74ID:Zb+BuNXc785デフォルトの名無しさん
2020/12/07(月) 07:24:15.67ID:Zb+BuNXc . で出力を絞る方法、正確には対象を選ぶ方法は、一般的にはプロパティアクセスが該当するかな
786デフォルトの名無しさん
2020/12/07(月) 08:49:51.37ID:Qq2AGx/W メンバーアクセス演算子 .
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. $_ }
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. $_ }
787デフォルトの名無しさん
2020/12/07(月) 15:48:31.93ID:5uzreY+I copy-itemでディレクトリを指定して、内部のファイルがパス260文字以上でエラーを出すとき、そのパスを取得する方法はあります?
788デフォルトの名無しさん
2020/12/07(月) 16:04:01.41ID:8iO4bdx+ >>787
Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathEnabled -Value 1
Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathEnabled -Value 1
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★4 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 【卓球】早田ひな、「総額100万スられた」「ずっと憧れていたスペインとイタリア…」ヨーロッパ旅行で悲劇 スリ被害を告白 [muffin★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【実況】博衣こよりのえちえち歌枠🧪★2
- 産経新聞「高市早苗の答弁さぁ……思慮が足りてなくね?官僚と詰めずに思いつきで話しているでしょ」 [175344491]
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 【画像】外務省局長「この度はうちの🦎がすみません…」中国「……」 [165981677]
- 外務省局長、よくわからないまま帰国へ [834922174]
