[表示 : 全て 最新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が立ててね!!

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回ループさせて終わるようにしたいです。



  



798 名前:デフォルトの名無しさん mailto:sage [2020/12/10(木) 21:25:03.78 ID:3lwwmG32.net]
$hoge="ikkaime_"

for($i=0; $i -le 20; $i++) {

if ($i -eq 10) {
$hoge="nikaime_"
}

Write-Output $hoge$i

}

799 名前:デフォルトの名無しさん [2020/12/10(木) 21:59:45.86 ID:/iej8cKu.net]
foreach ($hoge in 'ikkaime_', 'nikaime_') {
for ($i = 0; $i -lt 10; $i++) {
Write-Output $hoge$i
}
}

800 名前:デフォルトの名無しさん mailto:sage [2020/12/10(木) 23:27:25.70 ID:uqnVDABe.net]
$ikkaime = @()
$nikaime = @()

for($i = 0; $i -le 10; $i++) {
$ikkaime += "ikkaime_$i"
$nikaime += "nikaime_$i"
}

Write-Output $ikkaime
Write-Output $nikaime

801 名前:デフォルトの名無しさん mailto:sage [2020/12/11(金) 03:49:50.69 ID:bpjP0VBu.net]
"ikkaime_","nikaime_"|%{$hoge=$_;0..9|%{$hoge+$_}}

802 名前:793 mailto:sage [2020/12/11(金) 23:44:28.19 ID:YtFbF7ro.net]
ありがとうございました。

書き方がいくつもあるんですね。
非常に脅されたました。

ありがとうございます。

ちなみに、>>795
で処理しました。

803 名前:デフォルトの名無しさん mailto:sage [2020/12/11(金) 23:55:43.98 ID:BGcESmPN.net]
インクリメントのループはこう書いたほうがスッキリする
foreach ($i in 0..9) {

804 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 00:05:08.43 ID:w0iK+TRN.net]
>>797
こういうパイプがネストしてるのに違和感あるんだけど
多少効率悪くてもパイプ1本にできないかな

805 名前:デフォルトの名無しさん [2020/12/13(日) 01:22:24.35 ID:cCJaeZ7C.net]
for ($i=1; $i -le 2; $i++){
Switch($i) {
1 {(1..10) | %{"ikkaime_"+$_}}
2 {(1..10) | %{"nikkaime_"+$_}}
}
}

806 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 07:32:06.23 ID:5EW0FlRD.net]
パイプは繋げてナンボ
UNIX文化からの流れで、シンプルなコマンド群からの組み合わせの可能性は無限大
長いパイプラインが違和感?
いやロシアからウクライナを経由してドイツまで延びてもいい…!ゴルビーもそう言ってるよ

807 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 08:18:38.20 ID:6TpS+NE1.net]
0..9 | % { "ikkaime_$_"; "nikaime_$_" } | sort



808 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 08:21:28.01 ID:7zDtZqQK.net]
function hoge($fuga) {
0..9 | ForEach-Object {Write-Output "$fuga$_"}
}
hoge 'ikkaime'
hoge 'nikaime'

809 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 08:23:17.62 ID:7zDtZqQK.net]
>>800
"ikkaime_","nikaime_" | %{$hoge=$_;0..9} | %{$hoge+$_}






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

前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