X



PowerShell -Part 4
レス数が1000を超えています。これ以上書き込みはできません。
0002デフォルトの名無しさん2020/01/01(水) 18:34:35.19ID:dhZuPVlL
すみません教えてください。テキストファイル内の当日の日付を検索したいんですが
patternに変数を使うにはどうすればいいんでしょうか?↓だと検索がヒットしません

$today = Get-Date -Format "yyyyMMdd"
Select-String -path c:\a.txt -pattern $today
0003デフォルトの名無しさん2020/01/01(水) 20:08:13.94ID:kGjhqYZD
怒らないで教えて欲しいんだが

WSLでよくね?
0005デフォルトの名無しさん2020/01/01(水) 20:48:49.03ID:MALUlSLD
$today に適当な文字列を代入して、sls しても出来る!
一応、パス区切りが\ の場合は、クォートした方が間違いない

たぶん、そのファイルが存在しないか、エラーが起きているのかも。
それか、文字コードが異なるとか?

$today = "file"
echo $today

Select-String -path c:\Users\Owner\Documents\a.txt -pattern $today
Select-String -path "C:/Users/Owner/Documents/a.txt" -pattern $today

漏れは、UTF-8 を、WSL で、grep してる
000622020/01/01(水) 21:05:16.52ID:dhZuPVlL
ごめんなさい。凄い勘違いをしてた・・・。
今日は1月2日だと思い込んでて、テキストファイル内には20200102という文字列しかなくて
Get-Dateで今日の日付で検索してもヒットしない訳だ・・・。
Select-String -patternには変数が問題なく使えることが確認できました。お騒がせして申し訳ない
0008デフォルトの名無しさん2020/01/01(水) 23:40:11.34ID:MALUlSLD
WSL なら、これでフォルダ内のすべてのファイルから検索できる。
grep -i '文字列' ./*

Windows 側のフォルダに、alias も貼っているから、カレントフォルダの移動も簡単

shopt -s expand_aliases

alias windoc='cd /mnt/c/Users/Owner/Documents'
0009デフォルトの名無しさん2020/01/02(木) 00:33:51.58ID:Qw2T8cPg
コーディングとは直接関係ないのですが、
WMF をわざわざインストールせず、WindowsUpdate のみ適用し続けた Windows7 の場合、
Windows PowerShell のバージョンって 2.0 のままでしょうか?

試せる環境が手元に無くて…。ググっても分かりませんでした。
よろしくお願いします。
0011デフォルトの名無しさん2020/01/02(木) 09:32:26.45ID:m85p0XAo
>>5
>>8
やっぱりbashの方が優秀なんだな、、
Powershellてアホやろ
0014デフォルトの名無しさん2020/01/02(木) 14:34:14.71ID:osenxolW
つまりbashを使ってるとあほになる
やっぱりPowerShellの方が優秀なんだな、、
0015デフォルトの名無しさん2020/01/02(木) 14:58:28.80ID:80VOHiHM
poewrshellはcmd内蔵にはあったバイナリのコピーが簡単にできなかったり色々半端だよね
0018デフォルトの名無しさん2020/01/02(木) 17:02:09.06ID:SnzEOw/h
Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね
革新性面白さに主眼が置かれて運用をきっちりこなす為の地味な部分は蔑ろにされた
0022デフォルトの名無しさん2020/01/02(木) 18:19:47.57ID:d4KLeRXS
魚を下ろすなら出刃包丁、鉛筆を削るならカッターナイフ。一つだけに限定する必要はない。
スクリプティング環境も同じ。WSL でも PowerShell でも、適材適所で選べばいいだけだろ。

俺の場合は WSL ではなく Cygwin と PowerShel を併用してるけど。
0023デフォルトの名無しさん2020/01/02(木) 18:26:02.49ID:diWefbzT
>>22
パワー汁
0024デフォルトの名無しさん2020/01/02(木) 19:34:13.71ID:LqVuN/CI
>>18
robocopyレベルの機能が欲しいなら欲しい機能をPowerShellで実装すればいいだけだろ
出来合いのものが欲しい人が見るスレじゃないよ?
0026デフォルトの名無しさん2020/01/02(木) 21:32:35.62ID:ShHqIFTQ
漏れは、スクリプトを下のように、Ruby で書く

powershell は、そのスクリプト内で、コマンドを呼び出す程度にしか使わない。
長いコードでは圧倒的に、Rubyの方が可読性が高い

# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
0028デフォルトの名無しさん2020/01/02(木) 23:12:10.06ID:Luby4/oL
>>26
あっ、Rubyはいいです(^^ゞ
もう終わった言語なんで

PythonかJavaScriptでお願いします
0030デフォルトの名無しさん2020/01/03(金) 09:33:21.20ID:3Uhjf7eS
PowershellはWPFと同様に
こんなことできちゃう俺ってすごい?
って承認要求を満たす為のツール
0031デフォルトの名無しさん2020/01/03(金) 10:07:45.44ID:fRk42gOq
こんな低い程度で承認欲求満たせるなんて
さぞかし安っぽく薄っぺらな人生を歩んで来たんだろうね
君のような知恵遅れクンが羨ましい限りだよ
0033デフォルトの名無しさん2020/01/03(金) 14:14:41.25ID:wJkHBgCK
>>18
>Copy-Itemがrobocopyレベルに作り込まれていたらcmdに置き換わっていただろうね

見当違いだよ
あんたがrobocopy相当でないことに不満を持っているのは分かったが、世の中が同じ不満を持っていると勝手に決めつけてもしょうがない
自己と他者の境界を混同する癖があると生き辛さの原因になるぞ

Powershellもcmdもシェルなんだから、どっちからでもrobocopyを呼べばいい
変な固執がなければそれで解決

そもそもPowershellが完璧に作り込まれていたとしてもcmdは置き換わってない
長年のデファクトスタンダードとして居座ったシェルスクリプトを書き直す人はほとんどいないし、そこで覚えた知識を必要に迫られてもいないのにアップデートする人もいない
Powershellへの移行は強制されない限り極めて緩慢にしか進まないんだ
0034デフォルトの名無しさん2020/01/03(金) 14:18:05.13ID:E2rkGUYG
>>30
いや普通にぱぱっと学んで普通に道具として使うだろ
どんだけ頭わるいのかコンプレックス丸出し
0035デフォルトの名無しさん2020/01/03(金) 14:34:10.57ID:/oC1Ys4Z
PowerShell使いよりUNIXシェル使いのほうが凄い
同じコマンドなのに仕様が全然違うのを我慢できるんだぜww
0036デフォルトの名無しさん2020/01/03(金) 14:51:58.50ID:E2rkGUYG
ごめんな
シェルを使うのに凄いとか凄くないとかちょっと俺には理解できない
チンパンジーが箸を使うとすごいとかそういうレベルの話なのかな
0038デフォルトの名無しさん2020/01/03(金) 21:26:42.13ID:LoHkYQxe
WSLは手間が掛かりすぎてNG
・「入れとけ」というが、ユーザー毎にいちいち手動で入れさせる手間が掛かる。しかも厄介なストア配布形態
・一番使いたいはずのログインスクリプト等に使えない
全く話にならない
0039デフォルトの名無しさん2020/01/03(金) 22:06:06.23ID:ZgWtqjsT
過去の遺産があるならWSLでもいいけど、どちらでも使えて新規で組むならPowerShellだな
0041デフォルトの名無しさん2020/01/04(土) 02:12:51.07ID:aSKFbY9r
>>40
bashかパワーシェル(爆笑)で比較しませんか、ドザさんwww
0042デフォルトの名無しさん2020/01/04(土) 02:52:56.44ID:eFXyJY/2
今日日こんなのでマウント取ろうとする化石がいるとは
もう令和だぞおっさん
0043デフォルトの名無しさん2020/01/04(土) 08:03:14.83ID:T5YxFwCT
えっ、この幼稚さはガキなんじゃねーの?おっさんだとしたらヤバいな
0045デフォルトの名無しさん2020/01/04(土) 10:38:35.92ID:uBZCVRc/
>>44
あなたノンプログラマの人?w
0047デフォルトの名無しさん2020/01/04(土) 14:44:48.90ID:fYLLjFYo
前提条件(要件)の提示もなく優劣を論じちゃうのって、典型的な「自称パワーユーザ」だな
0052デフォルトの名無しさん2020/01/05(日) 08:35:56.46ID:8wcedpaS
その「おバカ」とやらに使ってもらおうって気がないから
いつまでたってもLinuxデスクトップは普及しないんだよ
0054デフォルトの名無しさん2020/01/05(日) 14:43:55.52ID:ZEXd5sZ7
それはシェアをあきらめるって事だと分かってて言うならそれでもいいんだけどね
0057デフォルトの名無しさん2020/01/06(月) 21:40:32.90ID:ID1ddVMh
>>50
> いろいろな *[!c]sh 実装のキライなところ
UNIX系シェルは古くからあるから色々意見があっていいけど、嫌いなとこ言うだけってのは馬鹿。
> まだBashで消耗してるの?
読んだけど2年前のスライド&スライド発表者が馬鹿過ぎる。
現在のTwitterアカウントを見たけど「進歩がない…」の一言。
makeのアルゴリズムを紹介するよ!的なことやってて…大丈夫かこいつ…いやはやく(周りが)何とかしないと駄目だろ…。
ていうか >>48 の記事の筆者か…。
生きてて楽しいのかこいつ…。
0058デフォルトの名無しさん2020/01/07(火) 08:15:41.91ID:5fudPZU/
>>57
> 読んだけど2年前のスライド&スライド発表者が馬鹿過ぎる。
> 現在のTwitterアカウントを見たけど「進歩がない…」の一言。

スレチな話題を延々と繰り返すバカよりは256倍マシだと思うよ
0059デフォルトの名無しさん2020/01/07(火) 08:38:58.32ID:Ks+JfxYO
>>57
> 嫌いなとこ言うだけってのは馬鹿
> 生きてて楽しいのかこいつ…

ここでPowerShell叩きだけやってるやつそのものじゃん
0060デフォルトの名無しさん2020/01/10(金) 01:58:55.42ID:orNiqaoM
ところでWSLを入れて
Windows10の制御はどういう風にやるんだろ?
0061デフォルトの名無しさん2020/01/10(金) 02:00:24.71ID:orNiqaoM
そもそもUNIXからの流れって
スクリプトがないと何もできなかった
というだけだよね。
0063デフォルトの名無しさん2020/01/10(金) 12:28:21.35ID:vcBIqSBB
>>62
たいして設定項目ないからcomfig.sysとかを直接編集してただろ
ちなみに同時期のunixも似たようなもんだった
スクリプトで設定するようになったのはだいぶ後だったように思う
0064デフォルトの名無しさん2020/01/10(金) 14:42:27.33ID:IxDycp4w
>>63
> だいぶ後だったように思う

80年代からマイコンを使ってた世代からすれば、確かに「だいぶ後」ですねw
0065デフォルトの名無しさん2020/01/10(金) 18:17:26.14ID:PkgwRlbI
Windows10, WSL, Ubuntu(Linux)側から、

Wondows側のC ドライブへのアクセスは、
/mnt/c/Users/ユーザー名/Documents/〜

漏れは、いつも、WSL側から、Windows側をgrep してる。
なぜなら、Windowsでは、CP932 と、BOM 無しUTF-8 を区別できないから

BOMが付いていれば区別できるけど、
普通、ウェブ系開発ではバグるので、BOMを付けない
0067デフォルトの名無しさん2020/01/12(日) 03:08:17.75ID:gh55rPFY
Lnuxユーザは大変やね
Winodowsユーザは、そんな面倒なことはしないわな
それなりのツールつかうから
0068デフォルトの名無しさん2020/01/12(日) 03:10:21.78ID:gh55rPFY
要はLinuxなどの場合は、近頃はいいだろうが
そういうことのためのツールが用意されていないんで
スクリプトに頼るしかなかったということなんだろうな
0070デフォルトの名無しさん2020/01/12(日) 04:22:58.37ID:Uj5X0q1W
設定ファイルがスクリプトということに何も疑問を持たなかったんだろかと思うことはある。
0072デフォルトの名無しさん2020/01/12(日) 09:20:24.49ID:Uj5X0q1W
Linux板は荒らししかいないし、末期のウェブ板やPHP板みたいになってる。
まともな住人はここに移住してきても良いよね?
ウェブ板やPHP板も移住してるんだし。
0073デフォルトの名無しさん2020/01/12(日) 09:21:14.45ID:Uj5X0q1W
Linux板は志賀何とかさんのことを語る板になってしまった。
0074デフォルトの名無しさん2020/01/12(日) 10:59:33.84ID:FbSdnFnB
まさかとは思うがツールというのはGUIのことだろうか
PowerShellスレでCUIよりもGUIが無条件に優れているという話をしているのだろうか

スレチを自己正当化する理由が、然るべきスレが機能不全を起こしてるから行きたくないと?
しつこいスレチがここに機能不全を招くとは思わないのだろうか

前スレに続いての「WSLでよくね」なんて明らかに反応を楽しむ愉快犯なのに、まんまとLinuxのほうが残念だもん!って
いいかげん落ち着いてくれよ
0076デフォルトの名無しさん2020/01/12(日) 19:02:16.18ID:Uj5X0q1W
bash最高って書いてあるけど。
0077デフォルトの名無しさん2020/01/12(日) 21:27:38.66ID:gh55rPFY
>>74
>まさかとは思うがツールというのはGUIのことだろうか

なわけないよ。
要は今は良くなってきているが
シェル言語なないと処理できないようなのがUnix系の世界
だったということ
ほかにろくなものないから
0078デフォルトの名無しさん2020/01/12(日) 22:41:27.46ID:gh55rPFY
ま、そりゃいいか。
PowerShellを語る板だから
ごめん。
PowerShellの話に戻します。
0079デフォルトの名無しさん2020/01/13(月) 13:13:43.40ID:GhUCXbF0
意味不明。結局、CUIでない、GUIでもない"ツール"とはいったい何だったのか
0081デフォルトの名無しさん2020/01/28(火) 00:59:10.36ID:b7mfcqCA
刻々と変化する変数をフォームに表示させたいんだけど
当然この例だと実行した時点での変数しか表示されません。
フォームのラベルの変数を動的に表示し続ける方法を教えてください(この例だと時計のように動かしたい)

$time = Get-Date
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$label = New-Object System.Windows.Forms.Label
$label.Text = $time
$form.Controls.Add($label)
$form.ShowDialog()
0083デフォルトの名無しさん2020/01/28(火) 05:27:11.17ID:gua2EZr0
正確な時間じゃなくても良いなら、Ruby なら、sleep で簡単にできる。
ただし、OS がバッファリングしてると、最後にまとめて出力されてしまう!

STDOUT.sync = true # バッファリングしない

3.times do
puts Time.now
sleep 3
end
0085デフォルトの名無しさん2020/01/28(火) 19:45:19.95ID:xyAuIeAM
>>81
別スレッドで非同期にフォームを起動すればいい

using namespace System.Windows.Forms
using assembly System.Windows.Forms

$label = [Label]@{ Dock = "Fill"; Font = "Meiryo,20" }
$form = [Form]@{ Size = "350,100" }
$form.Controls.Add($label)

$runspace = [RunspaceFactory]::CreateRunspace()
$runspace.Open()
$pipeline = $runspace.CreatePipeline()
$pipeline.Commands.AddScript({ param ($form) $form.ShowDialog() })
$pipeline.Commands[0].Parameters.Add("form", $form)
$pipeline.InvokeAsync()

foreach ($p in 1..10) {
  if ($Runspace.RunspaceAvailability -ne "Busy") { break }
  $time = [datetime]::Now
  $label.Text = $time
  sleep 1
}

if ($Runspace.RunspaceAvailability -eq "Busy") { $form.Close() }
$runspace.Dispose()
0088デフォルトの名無しさん2020/02/01(土) 10:30:55.09ID:escHc8OK
PowerShel で凝ったことやろうとすると、どうしても C# の知識が必要になるよな。
おかげで、C# を勉強する良いきっかけになったわ。スキルの幅が広がるのは嬉しい。
0091デフォルトの名無しさん2020/02/01(土) 22:22:36.87ID:QN2fVxGF
$label = [Label]@{ Dock = "Fill"; Font = "Meiryo,20" }
という式を初めて見て驚いてるんだけど、これについてのドキュメントってどこかにありますか?
0093デフォルトの名無しさん2020/02/02(日) 11:46:03.71ID:9GpNdTap
>>92
ありがとう
だいぶ楽になった

こういうの知ってる人ってMSDNのヘルプに全部目を通してるの?
0094デフォルトの名無しさん2020/02/04(火) 17:22:37.51ID:Rq+qX9o+
オブジェクト志向ライクでいいんだけど、
powershellへbatやVBSから置き換えようとすると機能によってはバージョンチェックをしないといけないのがもどかしい
.NETにしろそうなんだけどね
0095デフォルトの名無しさん2020/02/04(火) 20:42:27.29ID:uL6VAIkG
ご教示ください。
商品の価格を定期的にWebサイトから取得したいのですが、Invoke-WebRequestで取得したHtmlWebResponseObjectから要素の内の文字列を取り出そうとすると「Windows セキュリティの警告」のポップアップが表示されてしまいます。
ポップアップを出さずに要素の内の文字列を取得するにはどうすればよいでしょうか?

$response = Invoke-WebRequest -uri "https://www.yodobashi.com/product/100000001002955686/";
$price = $response.ParsedHtml.getElementById("js_scl_unitPrice").innerText

これを実行すると「この Web サイトから個人用の情報を提供できるように、Cookie と呼ばれる小さなファイルをこのコンピューターに配置できるようにしますか?」と表示されます。
0097デフォルトの名無しさん2020/02/04(火) 22:40:04.72ID:tW1M7Be/
cookie powershellでぐぐればやり方は出てくる
javascriptとか出てきたら素直にseleniumを使う
seleniumをpowershellで使う方法もある
0098デフォルトの名無しさん2020/02/07(金) 03:46:32.51ID:eL08TT0Y
DateTimePickerで翌日の日付をデフォルト選択する方法ありませんか?
0101デフォルトの名無しさん2020/02/09(日) 17:36:01.93ID:7dfvQcUC
同スクリプト重複実行抑止する場合
皆さんどうしてますか?
pid書き出し?Mutex?
0106デフォルトの名無しさん2020/02/10(月) 15:13:30.85ID:8uBZGbTk
スクリプトブロックを渡すか、関数なら
$function:関数名
で渡す
実行は & でやるのが基本で他にもいろいろ方法がある
0107デフォルトの名無しさん2020/02/10(月) 18:46:32.72ID:D64OFTKi
スクリプトからフォームをshowメソッドで表示すると固まってしまい、
showDialogメソッドで表示すると操作できるようになります。
例えばモーダルフォームを表示した親フォームが固まるのは分かるのですが、
呼び出したモードレスフォームが固まってしまうのは何故なのでしょうか。
0109デフォルトの名無しさん2020/02/11(火) 13:53:02.82ID:iYccZVyV
コールバックはこの説明が分かりやすい
https://wa3.i-3-i.info/word12295.html

Powershellだと「スクリプトブロック」というコードを { } で括った物がコールバック関数として使える
引数として直接書いてもいいし、一度変数に代入して変数を引数に渡してもいい
{$True} という部分がそれ

でも今回は「スクリプトブロック」じゃなくて「RemoteCertificateValidationCallback」でと指定されている
三つ目のコンストラクタの引数の型に注目
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.security.sslstream?view=netframework-4.8#constructors

なので -as 演算子で型変換をしてる
0110デフォルトの名無しさん2020/02/11(火) 14:24:03.53ID:AAFADizG
とりあえず、引数がご飯で戻り値がウンコと言う事だけはわかった。
0111デフォルトの名無しさん2020/02/11(火) 15:25:48.37ID:LmagV5MS
>>107
win32APIでウィンドウ作ったりしたことなかったら分からないかもしれないけどざっくり言うと
ウィンドウがOSからのメッセージ(マウスがクリックされたとか、ボタンが押されたとか)
を処理するにはOSからのメッセージをウィンドウに知らせてやる必要がある(メッセージループ)
ShowDialogはその辺をよしなにやってくれる
0112デフォルトの名無しさん2020/02/15(土) 04:04:02.58ID:Nij30Obe
>>111
ありがとうございます。

モーダルがどうのこうのというよりも、
Showコマンドだとクリックなどの命令を受け付けないという感じでしょうか
0113デフォルトの名無しさん2020/02/15(土) 08:45:46.45ID:Ba23wrvp
>>109
103です。ありがとうございます。なんとなくわかったような気がしますが、自分には.netクラスライブラリのリファレンスマニュアル読めるほどのオブジェクト指向プログラムの知識が足りてないようです。

powershellでちょっと小難しい事しようと思うといつもこの壁にぶち当たります。
0114デフォルトの名無しさん2020/02/15(土) 09:54:27.30ID:/QpUFa9s
>>112
デバッガで実行ステップを追う感覚で捉えると分かりやすいよ
Powershellのようなコンソールアプリって基本シングルスレッドで、上から下に処理が流れて最後まで行ったら終わりでしょ
Showメソッドは表示するだけ
ShowDialogと違って閉じるのを待たずに呼び出し元に処理を戻すから、メインスレッドはすぐに続きのスクリプト処理を再開してしまう
ウィンドウっていつでもユーザーのマウス操作に反応できて、閉じられるまでは処理が終わらないよね
それは無限ループを回し続けて、マウス操作のような指令が来るまでキューを調べて待つ体制に入ってるから
その仕事を直接的にも間接的にもやってないならウインドウはだんまりになって当然
結論、コンソールアプリから最初に呼び出すウィンドウはモーダル表示にすべし
0115デフォルトの名無しさん2020/02/16(日) 00:31:35.72ID:EHy9IoT2
>>114
ありがとうございます
スッキリしました

よくC#でShowDialogで表示した時はDisposeを呼ばないとダメと言いますが、
これもイベントループを作るのか作らないかの差なのでしょうか
また、PowerShellでもDisposeした方がいいのでしょうか
0117デフォルトの名無しさん2020/03/06(金) 04:35:17.20ID:fNVi1eTS
インストーラで出てくるスパイダーマンのパチモンみたいなの何なの
0119デフォルトの名無しさん2020/03/06(金) 09:18:25.45ID:jyEHwxlL
https://blog.shibata.tech/entry/2017/10/14/153510

このキャラクターはあまり認知度は高くないと思いますがPowerShell公式のキャラクターです。

名前はそのまま PowerShell の様です。(よくある言語の擬人化なのでしょう)
中の人からはPowerShell HeroやPosh-Chan*2と呼ばれている様です。

いまではPowerShell TeamのTwitterアイコンにも採用されています。
0122デフォルトの名無しさん2020/03/06(金) 17:17:48.60ID:mKExt1TS
>>121
Windows が関係するインフラ系の管理ではデファクトだと思ってたけど違うんかい?

自分はインフラ系の仕事が多いんだけど、MS 製品は言うに及ばず、
VMware、AWS、HPE の設定とか構築で使うためのモジュールが用意されてるんで、
そっち系の人は全員使ってるのかと思ってた。

今関わってる案件だと客先で用意された作業用 PC でも PowerCLI は
入れさせてもらえるんで、VMware の構築&設定が超絶はかどってすごく助かってる。
0123デフォルトの名無しさん2020/03/06(金) 19:23:36.96ID:EUcOgnT/
>>122
IT系ですらない製造業の人間なので、インフラとかよく知らんです
CSVファイルとか扱う定型業務でVBAの代わりに流行らないかなーと思ってる
会社PCに標準で入ってるのが何よりありがたい
たまたまC#の経験あるからPowerShellが使いやすく感じるだけなのかもしれんけど
VBAは古すぎるし、文化が違いすぎて好きになれない…
0124デフォルトの名無しさん2020/03/06(金) 22:15:50.08ID:mKExt1TS
>>123
確かに、RPA 的な用途にも使えるわね。

そう言われてみれば、IT プロ向けの PowerShell の資料は山ほどあるけど、
エンドユーザの業務効率化に的を絞った資料ってあまり聞かないね。

エンドユーザが手作業でやってる定型業務を PowerShell +αで
自動化/半自動化する事例を紹介する資料を作れば需要ありそう。
0126デフォルトの名無しさん2020/03/09(月) 17:26:48.99ID:BZZ4ItAR
パワーシェルでテキストファイルを一行ずつ読み取って環境変数化するのはどうやるんでしょうか?

バッチファイルだと簡単にできるのにパワーシェルだと難しい
イメージ的にはこんなことをパワーシェルでやりたいです
for /f %%a “usebackq” in (./testfile.txt) do (
set testenv=%%a
echo !testenv!
)
0127デフォルトの名無しさん2020/03/10(火) 14:15:31.74ID:qUF7p1Fi
こーゆー感じのことやりたいのか?

cat .\testfile.txt | %{ $env:testenv = $_; $env:testenv }
0128デフォルトの名無しさん2020/03/10(火) 14:32:38.22ID:j2kTK4tI
>>126
Get-Content -Path .\TextFile.txt | ForEach-Object -Process { $env:TestVar = $_ }

もしくは
$ContentData = Get-Content -Path .\TextFile.txt
foreach ($LineData in $ContentData) {
$env:TestVar = $LineData
}

こんな感じじゃないかな
知らんけど

グローバルな環境変数への代入はどうするのかな?
0129デフォルトの名無しさん2020/03/11(水) 20:45:46.50ID:lIDu6EwW
>>128
上の方の感じでできました!ありがとうございます

グローバルな環境変数とはなんですか?
0130デフォルトの名無しさん2020/03/11(水) 20:47:48.33ID:lIDu6EwW
あ、システム環境変数のことですか
シェルスクリプト内の一時環境変数?で良いのです
0131デフォルトの名無しさん2020/03/13(金) 14:02:44.23ID:MwEg+WGB
javawみたいな感じで、スクリプト実行時にコマンドプロンプトを出さない方法はありませんか?1ファイルで。
ショートカットやvbs等の2ファイル使う方法なら解ってます。
0134デフォルトの名無しさん2020/03/13(金) 19:15:38.63ID:cafRoH7X
>>131
1,まず、.ps1 で動作するスクリプトを作る
2,1を BASE64 でエンコード
3,powershell.exe にオプション -EncodedCommand と 2をつないで実行
4,3を .cmd (.bat) に書く

詳細は「powershell EncodedCommand」みたいな感じでググればいいでしょう。
013511342020/03/13(金) 19:18:46.13ID:cafRoH7X
>>131
すまん、コマンドプロンプトを出さずに、か。勘違いしてました。
>>134 は取り下げます。
0137デフォルトの名無しさん2020/03/15(日) 16:23:53.40ID:ake3THHi
Windows PowerShell in Action、900ページあるけど面白かった
次はPowerShell fo Sysadmins読もうかな
0140デフォルトの名無しさん2020/03/20(金) 21:08:31.06ID:hI9v4wSz
win10 バージョン5.1
Invoke-RestMethodの"-body"にjsonを入れる方法を教えてほしい
google photos apiで日付を指定して一覧を取得したい
ubuntu + curlで
curl -s -X POST -H "Authorization: Bearer " -H "Content-type: application/json"
-d '{"filters":{"dateFilter": {"dates":[{"year":2019,"month":11,"day":15}]}}}'
https://photoslibrary.googleapis.com/v1/mediaItems:search
これだと取得出来るんだけど

powershellで
$header = @{"Authorization" = "Bearer "};
$body = '{"filters":{"dateFilter": {"dates":[{"year":2019,"month":11,"day":15}]}}}';
Invoke-RestMethod -Uri https://photoslibrary.googleapis.com/v1/mediaItems:search
-Method Post -Headers $header -Body $body ;

(400) 要求が不適切ですでエラーになる
たぶんbodyの入れ方が悪いだと思うんだけど

アルバムIDの絞り込みだったら
$body=@{
"albumId"="id"
}
で取得出来た
0141デフォルトの名無しさん2020/03/20(金) 23:34:49.75ID:fNo2jQuJ
-ContentType "application/json" を付けるか
もしくは全部ヘッダに入れる

$accessToken = "your access token"
$uri = "https://photoslibrary.googleapis.com/v1/mediaItems:search";

$response = Invoke-RestMethod $uri -Method Post -Headers @{
  Authorization = "Bearer $accessToken"
  Filters = @{
    DateFilter = @{
      Dates = @{ Year = 2016; Month = 3; Day = 1 }
    }
  }
}
0142デフォルトの名無しさん2020/03/21(土) 00:10:00.03ID:AKmTgF3+
ごめんやっぱBodyに入れないといけない

$body = @{
  filters = @{
    dateFilter = @{
      dates = @(@{ year = 2019; month = 11; day = 15 })
    }
  }
} | ConvertTo-Json -Depth 100

$param = @{
  Uri = $uri
  Method = "Post"
  Headers = @{ Authorization = "Bearer $accessToken" }
  Body = $body
  ContentType = "application/json"
}
$response = Invoke-RestMethod @param
0143デフォルトの名無しさん2020/03/21(土) 00:24:48.78ID:WepcD5N+
>>141
>>142
なるほど、curlの"Content-type: application/json"の部分を指定してやらんといかんかったのか。
そしてちょっとあきらめてた連想配列も提示してもらっちゃって
超ありがとうございました。
ばっちり動いたっす
0147デフォルトの名無しさん2020/03/21(土) 17:39:49.06ID:vJ0Lurek
Windows PowerShell in Actionの改3版、日本語訳してくれないかなぁ…
0148デフォルトの名無しさん2020/03/23(月) 10:55:55.25ID:wpOCnP6k
パイプラインを繋げる先を条件で分岐って可能ですか?
イメージとしては

Get-Nantoka |
Switch ($_.Name)
Case ('A') | Get-NantokaA
Case ('B') | Get-NantokaB
Case ('C') | Get-NantokaC

な感じです
0149デフォルトの名無しさん2020/03/23(月) 22:15:40.05ID:nB8lN/u6
さすがにそんなシンタックスはないが同じような動作はできる

$continuation = @{
  A = { select Name,Age | Write-Host -f Cyan }.GetSteppablePipeline()
  B = { select Name,Gender | Write-Host -f Magenta }.GetSteppablePipeline()
  C = { select Name | Write-Host -f Yellow }.GetSteppablePipeline()
}
$continuation.Values.ForEach("Begin", $true)

@"
Name,Age,Gender
A,12,Male
C,93,Female
B,32,Male
A,52,Female
C,73,Female
"@ | ConvertFrom-Csv | foreach { $continuation[$_.Name].Process($_) }

$continuation.Values.ForEach("End")
0150デフォルトの名無しさん2020/03/24(火) 02:11:10.59ID:1omVAMXs
結局処理を別々に書かなきゃいけないなら書いてる通りswitch文でいいんじゃねって気はする
0151デフォルトの名無しさん2020/03/24(火) 12:26:04.21ID:/23EZweg
switch文だと毎回新規にGetNantokaAとかが呼ばれてしまうため例えばGetNantokaAがMeasure-Objectだと意味がなくなる
0152デフォルトの名無しさん2020/03/24(火) 13:30:06.69ID:n2AHJDo3
>>149
ありがとうございます
やっぱり分岐先を埋めたオブジェクトや関数を作らなきゃいけない感じですね

いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな
0153デフォルトの名無しさん2020/03/24(火) 16:14:53.92ID:/23EZweg
>>152
> いま、もしかして上にある「パイプラインの並列化」って分岐の事じゃね?と思ったのだが違うのかな
同じルーチンが複数同時に走るってことだとと思う
排他制御とか順序の保証とかがどうなってるのかが気になる
0154デフォルトの名無しさん2020/03/24(火) 19:15:33.49ID:n2AHJDo3
>>153
オブジェクトをパイプライン上に並列で走らせるって事?
非同期通信的な・・・
0156デフォルトの名無しさん2020/03/24(火) 21:24:12.31ID:LC2xv/4E
>>149が何やってるのかサッパリ
GetSteppablePipelineでぐぐっても日本人はほとんど存在士らないのかなって具合
0158デフォルトの名無しさん2020/03/24(火) 23:52:12.51ID:LC2xv/4E
>>149の最初の連想配列作ってるとこは判る
問題は次
>$continuation.Values.ForEach("Begin", $true)
これ何してるの?
Values.ForEachて。
こんな書き方でSteppablePipelineのBeginメソッドが呼べるの?
C言語の配列で"A"[0]みたいなトリッキーさを連想させるのだが
0159デフォルトの名無しさん2020/03/25(水) 03:41:09.46ID:IDfpoHeN
.ForEachはメソッド形式のForeach-Objectで、要するにC#のLINQをPowerShell風にアレンジした何か
どっちかというと.ForEach({ ..... }) みたいにスクリプトブロックを渡す使い方が主流だと思うけど、メソッド名を文字列で渡してオブジェクトのメソッドを呼び出すこともできる

ステッパブルパイプラインは任意のパイプライン(文)をメソッド形式で呼び出せるようにするための何か
渡された引数を先頭のコマンドにパイプして実行させることができる
0160デフォルトの名無しさん2020/03/25(水) 18:56:02.32ID:8IWtSBvh
powershellで2つのファイルの差分のみを抜き出して追加や削除されたものは別ファイルに出力したいです
例えば

fileA.txt
aaa
uuu
iii

fileB.txt
iii
uuu
eee

とあった場合にfileBをマスタとしてaaaの文字列をdelete.txtにeeeの文字列をadd.txt出力したいです。
やり方教えてください!
0161デフォルトの名無しさん2020/03/25(水) 19:05:36.15ID:D/1vKEW+
素人ですまんけど、
$test0 = "a", "b", "c"
$test1 = $test0[1]
こういった時に、$test0のbを同時に削除する書き方はありますか?別途処理を書く必要あり?
0162デフォルトの名無しさん2020/03/26(木) 00:05:42.98ID:fIJkkKI3
>>160
function Marge([object[]]$Adds,[object[]]$Deletes){
$Adds|Where-Object{$_ -notin $Deletes}
}
Marge $(Get-Content fileB.txt) $(Get-Content fileA.txt) > add.txt
Marge $(Get-Content fileA.txt) $(Get-Content fileB.txt) > delete.txt
0163デフォルトの名無しさん2020/03/26(木) 00:09:27.46ID:fIJkkKI3
>>161
bを削除という条件なら

$test0 = "a", "b", "c"
$test1 = ($test0 -ne "b")[1]

-ne演算子は左オペランドがコレクションの場合、差分を返す
0164デフォルトの名無しさん2020/03/26(木) 00:14:14.98ID:fIJkkKI3
-ne演算子の場合は大小比較をしないので注意
もし比較する場合は>>162のように-notin演算子とWhere関数でフィルタする
0165デフォルトの名無しさん2020/03/26(木) 08:51:19.38ID:BddTdfqa
>>162
ありがとうございます
Mergeって関数の中で処理している感じですね
詳細な処理の内容は理解していないので調べつつやってみます!
0167デフォルトの名無しさん2020/03/30(月) 02:08:56.05ID:VM+VSYRD
> $a = try{get-content data.txt}catch{@()}
> $a = if(3 -ne 4){11}else{22}
ダメ元で試してみたらこんな書き方出来たのかよ
0168デフォルトの名無しさん2020/03/30(月) 07:08:11.36ID:PN3/f/57
うん、だから三項演算子入れないでほしかった
なんでわざわざ評判微妙な記法を取り入れたんだろ
0170デフォルトの名無しさん2020/03/30(月) 18:44:14.41ID:kxtxXuN0
C#8.0のswitch式見ててあれってなったけど、そういえば右辺に文を持ってこれるのってPowerShellくらいなんだっけ
0172デフォルトの名無しさん2020/03/31(火) 09:18:05.97ID:hmCJ2D6X
# RSSの内容を取得
$url="https://rss.itmedia.co.jp/rss/2.0/ait.xml";
$webclient = new-object System.Net.WebClient
$webclient.Encoding = [System.Text.Encoding]::UTF8
$rss = [xml]$webclient.downloadstring($url)

とやった場合に$rssの内容を手早く調べるにはどうやればいいですか?
$rss | ConvertTo-Json -Depth 100
$rss | Out-GridView
なんかは表示が貧弱すぎてわかりません
多少長くてもいいので正確に(できればJSONで)階層化する方法が知りたいです
$rssはあくまで一例で類似の複雑なオブジェクト全般について知りたいです
0173デフォルトの名無しさん2020/03/31(火) 12:14:42.73ID:b44czDa9
>>172
$rss.rss.channel.item で一覧表示される(もちろんGridViewで見てもよい)けど、そういうことではなくて?
01751722020/03/31(火) 15:56:05.63ID:hmCJ2D6X
ISEからVSCodeに変えてデバッグ&インスペクトしたら大体望み通りの表示が得られました
https://i.imgur.com/HRVgQP3.png

[xml]な$rssも細部まで階層表示が出来ました
余計なプロパティがあまりにもごちゃごちゃしていて目視で$rssの把握は無理気味でしたが…

ありがとうございました
0178デフォルトの名無しさん2020/04/01(水) 20:40:01.19ID:wuY/0uuQ
classとclassを使うスクリプトの場所を分けたい場合
例えば

c:\workフォルダに
main.ps1

c:\work\class フォルダに
class1.ps1
class2.ps1

class2.ps1はclass1.ps1を読込ので先頭に
cd $PSScriptRoot
. ".\class1.ps1"

main.ps1はclass2.ps1を読込ので先頭に
cd $PSScriptRoot
. ".\class\class2.ps1"

これでmain.ps1動かすとディレクトリがc:\work\classに変わっちゃうから
class2.ps1を読み込んだ後にもう一度cd $PSScriptRootでディレクトリを移動し直すのが
なんか気持ち悪いんですが、絶対パスでやる以外に方法はあるんでしょうか
0180デフォルトの名無しさん2020/04/02(木) 23:47:54.92ID:W0wv5F0P
. "$PSScriptRoot\class1.ps1"

と絶対パスでやるのが一般的
カレントディレクトリの移動はやらんほうがいい
0182デフォルトの名無しさん2020/04/08(水) 19:04:23.59ID:bFKpwotA
連想配列をカンマ区切りに置換してファイル出力する方法教えてください
配列の場合はわかるんですが連想配列の場合がわかりません

@{id=001;name=hoge}

みたいなやつを↓

001,hoge

みたいな感じにしたいんです
0185デフォルトの名無しさん2020/04/09(木) 10:17:18.42ID:qPytwYgo
powershellのエラー発生時のログ出力って皆さんどうやってますか?
単純にpowershellの画面上に出力されてるエラーをログに吐き出したいだけなのですがイマイチやり方が分かりません!
0187デフォルトの名無しさん2020/04/19(日) 17:57:40.84ID:LL/F5W9x
シフト右クリックからpowershellウインドウをここで開くでウインドウ立ち上げた時にアクティブな状態で立ち上がらないから一回クリックしたりして選択し直さないかんのが地味にストレス
0189デフォルトの名無しさん2020/04/19(日) 18:14:16.64ID:vjiWfekt
シフト右クリックするとメニューが出る
このとき先にシフトを離してから開く操作をするといい
シフトを押した状態でアプリを起動すると非アクティブで開くのはWindowsの昔からの機能
0195デフォルトの名無しさん2020/04/28(火) 10:53:40.07ID:+ujIhWuh
メンバを呼ぶ.(ドット)の演算子を逆参照演算子と呼ぶらしいんだけど、どこら辺が逆なんだろう
0197デフォルトの名無しさん2020/04/28(火) 19:06:19.94ID:+ujIhWuh
逆参照演算子もdereferenceの直訳っぽいね
参照の反対の行動という意味で逆なのかな
0198デフォルトの名無しさん2020/04/29(水) 08:59:09.87ID:pj1FfIiR
参照先のオブジェクト実体を見る、参照じゃなくなるからdereference(逆参照)
0200デフォルトの名無しさん2020/04/29(水) 11:22:32.85ID:HjIuTJYT
Powershellに逆参照演算子なんてないでしょ
ドットはMember access operatorとDot sourcing operatorの二種類のはず
ほかの言語との混同があるのでは
C言語の & と * を参照演算子、逆参照演算子と訳すなら分かるし、-> を逆参照演算子と呼ぶのもまあ分かる
0201デフォルトの名無しさん2020/04/29(水) 12:43:39.55ID:YtBfjahw
日本語版Windows PowerShell in Actionにそう書いてあった気がするんだが、
確かにMSDN見るとMember access operatorだ
0202デフォルトの名無しさん2020/04/29(水) 12:50:10.22ID:YtBfjahw
vscode上だと高度な関数のbeginブロックで定義した変数が、
processブロック中で使ってるにも関わらず未参照の警告が出るんだけど良い解決方法ないでしょうか
未参照確認自体は便利なので黙らせたくはないです
0206デフォルトの名無しさん2020/05/01(金) 00:27:41.37ID:iyqswZZm
一般的には
参照 アドレスを取り出す
逆参照 アドレスに入っている値を取り出す
だけど値を取り出すことを「逆」と訳した経緯がわからん
0208デフォルトの名無しさん2020/05/01(金) 12:57:54.38ID:578ddPng
dereferenceはやっぱ参照外しかな
referenceってポインタ(または名前)が主語で、実体に向かって矢印が向いている、ポイントしている状態
逆参照というとこの矢印を逆に辿る、変数からポインタを探すになっちゃう
接頭辞de-を「離れる」と理解せずに、かなり派生的な「逆」と訳して定着した誤訳に近い語だと思う
0209デフォルトの名無しさん2020/05/01(金) 12:58:58.53ID:578ddPng
いずれにしてもPowershellでdereferenceなんて概念を持ち込む必要がないからメンバアクセス演算子って名前に改善されたんでしょう
0210デフォルトの名無しさん2020/05/01(金) 16:33:54.54ID:5CcYXcTT
C系は逆参照じゃないの
むしろ参照外しのほうがわからんかったが
0211デフォルトの名無しさん2020/05/01(金) 17:34:48.85ID:578ddPng
どっちがデファクトスタンダードかって話とどっちが正しいかって話は別だから
確信犯とか姑息みたいに誤用の方が普及して定義が揺らいでる言葉はいろいろあるけどどう使うかは話者次第
0212デフォルトの名無しさん2020/05/04(月) 01:09:24.67ID:hArtKUaR
初心者です
move-item等でファイル名に[]があるとエラーがある事を知りました
ようやく -LiteralPath つければ良いと分かりましたが、
デフォルトの仕様がワイルドカード受け付けるのって初心者殺しというか…
なれてる人はこっちの方が便利なんでしょうか
0215デフォルトの名無しさん2020/05/04(月) 09:28:04.92ID:hArtKUaR
>>213
やっぱりそうですよね・・・

比較演算子も、-matchで[ ]があるとエラーになって困りました
これもいろいろ調べてようやく-match [regex]::escape() にすれば良いと分かりましたが・・・

PowerShellって参考書もあまりなくて古いし、ネットの情報もあまりなくてなかなか学習が進みません・・・

そもそもPowerShell ISEのヘルプで -pathは「ワイルドカード文字を許可する false」って嘘書いてあるのが・・・
0216デフォルトの名無しさん2020/05/04(月) 11:59:27.10ID:dnvbBZmT
ファイル名はともかくmatch が正規表現で比較ってのは割と知られているような気もするけど
0217デフォルトの名無しさん2020/05/04(月) 13:19:22.94ID:XmeTIU4M
対になるlike演算子があるからなんとなくわかる
ところでreplaceの正規表現じゃない版が欲しい・・・
0218デフォルトの名無しさん2020/05/04(月) 13:22:34.10ID:eeiLu4M/
たしかに-matchの話に限っては単なる勘違いだな
match(一致)と言われて部分一致だと思うかといえば、普通はpattern matchでしょう
参考にしたサイトが悪かったのかもしれない
正規表現を使わないなら "a[b]c".Contains("[b]") でいい
0221デフォルトの名無しさん2020/05/04(月) 16:06:32.60ID:hArtKUaR
>>216 >>218
教えていただいてありがとうございます。
自分がやりたかったのは、例えば hoge[hoge] というファイル名で拡張子の違う
複数のファイルの移動だったんですが、最初は

$hoge = "hoge[hoge]"
Move-Item "C:\test\$hoge.*" "C:\test2"
これは失敗しました([ ]があるファイルを処理していて気がつきました)

いろいろ調べて
Get-ChildItem "C:\test\*.*"|Where-Object{$_.basename -match [regex]::escape("$hoge")}|Move-Item -Destination "C:\test2"
してみて成功しました

今回教えてもらって
Get-ChildItem "C:\test\*.*"|Where-Object{$_.basename.contains("$hoge")}|Move-Item -Destination "C:\test2"

これでOKみたいです。まだ冗長な気もしますが・・・
0222デフォルトの名無しさん2020/05/04(月) 17:06:49.01ID:LlR+aKwZ
パスの角括弧の扱いはpsの一番いけてないとこだからね
角括弧のみをエスケープする場合は次のようにする

move "C:\test\$hoge.*".Replace('[', '``[') "C:\test2"

もしくは-Filterパラメータが角括弧をワイルドカード扱いしないことを利用して

move "C:\test\*" "C:\test2" -Filter "$hoge.*"
0223デフォルトの名無しさん2020/05/04(月) 18:54:18.78ID:hArtKUaR
>>222
なるほど。 [  だけエスケープすれば大丈夫なんですね

ようやく引っかかってた所から脱出できそうです
皆さん大変ありがとうございました
0224デフォルトの名無しさん2020/05/06(水) 21:11:41.78ID:prm5gj7H
これってクラス多めのオブジェクト指向でやるべきなのか、
高度な関数多めのパイプライン志向(?)でやるべきなのか、
どっちがいいのかな
0225デフォルトの名無しさん2020/05/07(木) 01:36:33.14ID:k5uIH00p
オブジェクト使い回す設計のほうが読みやすそうならそうする

高度な関数ってどんなんやねん
0226デフォルトの名無しさん2020/05/07(木) 02:22:01.91ID:GVyLSOna
高度な関数ってずいぶん懐かしい単語だな、普通に関数でいいと思うよ
全ては無理に和訳しようとしたMSが悪い
0227デフォルトの名無しさん2020/05/07(木) 08:07:17.17ID:O8jL8wQb
>>224
本来のシェル的な使い方がメインなら
関数でパイプライン多用した方が使いやすい

普通のアプリに近いものを作る場合には
クラスでOOPした方が使いやすい
02298432020/05/07(木) 09:38:19.28ID:1Drf/TcZ
PSのクラスって機能が足りないとかはあるけど特に難しい所はないと思うが…
0230デフォルトの名無しさん2020/05/07(木) 23:47:47.43ID:cnY/r+Lf
教えてください。
WindowsServer2012のADユーザー情報の取得についてです。

testunyo.local
┗ユーザー
  ┗Users
上記OUにあるユーザーの情報のうち、
 ログオンID
 フルネーム(表示名)
 所属するグループ名 の情報をcsvで抽出したいとき、

Get-ADPrincipalGroupMembership -identity test | Select-Object name | Format-Wide -Column 20 | Out-String -Width 500 >> C:\work\logtest.csv

とすると所属するグループ名しか抽出できません。
A列にログオンID、
B列にフルネーム、
C列以降に所属するグループ名
と、1ユーザー1レコードで表示させたいとき、
どのようにするのが良いでしょうか?

Get-ADPrincipalGroupMembershipではなく、csvdeを使うのが良さそう
とは思ったのですが、うまく抽出できませんでした。
0232デフォルトの名無しさん2020/05/08(金) 12:22:27.69ID:Fn4yfVbS
>>221
Ruby で作った。
DryRun なので、実際には実行されません

require 'fileutils'

dest_dir = "C:/test2"
keyword = "hoge[hoge]"

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/test/*"
src_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select { |full_path| File.basename( full_path, ".*" ) === keyword } # 拡張子を取り除いた部分のファイル名
.each do |full_path|
dest_path = dest_dir + "/" + File.basename( full_path ) # ファイル名
FileUtils::DryRun.move( full_path, dest_path )
end

出力
mv C:/test/hoge[hoge].txt C:/test2/hoge[hoge].txt
0233デフォルトの名無しさん2020/05/08(金) 13:46:42.62ID:fxtS7XW6
GetNewClosureで作ったクロージャからトップレベルに定義した関数にアクセスできんのだがスコープどうなってんだ?

function Hoge () {}

{ Hoge }.Invoke() #うごく
{ Hoge }.GetNewClosure().Invoke() #うごかん
0234デフォルトの名無しさん2020/05/08(金) 15:09:04.88ID:eZ8FT/L5
またキチガイが湧いてきたか
NG しやすいように、コテハン付けて欲しいわ
0235デフォルトの名無しさん2020/05/10(日) 09:05:34.07ID:oQrk4XHl
>>233
トップレベルと呼んでいるのは、(仮に) Hoge.ps1 の Script スコープでいいよね?

PowerShell のクロージャは、動的モジュールにバインドされたスクリプトブロック。
モジュールの Script スコープは、常に Global スコープの直接の子なので、
クロージャの Local スコープは、Hoge.ps1 の Script スコープの子孫にならない。

スコープの親子関係:
[Global] - [Script(Hoge.ps1)] <== Hoge 関数の定義されているスコープ
[Global] - [Script(動的モジュール)] - [Local] <== 問題のクロージャ内のスコープ
0238デフォルトの名無しさん2020/05/12(火) 21:11:03.62ID:2xTEfvW8
Closures in PowerShell
https://devblogs.microsoft.com/scripting/closures-in-powershell/

Windows PowerShell uses dynamic modules to create dynamic closures.
A closure in computer science terms (at least as defined in Wikipedia) is “a function that is evaluated in an environment containing one or more bound variables.”
A bound variable is, for our purposes, a variable that exists and has a value. The environment in our case is the dynamic module.
0240デフォルトの名無しさん2020/05/15(金) 09:54:10.26ID:JVqn6ak1
昔ながらのPowerShellとPowerShell Coreって共存できんの?
PowerShell CoreってクロスプラットフォームだけどWindowsの管理コマンドとか旧PowerShell資産とかとどれぐらい互換性あるのかな
0241デフォルトの名無しさん2020/05/15(金) 12:11:51.23ID:spGK6l8f
>>240
共存できる。Core をインストールしても、PowerShell 5.1 を置き換えない。
インストールされるパスが違うし、そもそも実行ファイルのファイル名も違うので。
0243デフォルトの名無しさん2020/05/16(土) 02:28:51.69ID:LVL/9uGV
むしろCore版を上書きしてほしんだが

Powershellで検索すると大量に出てきてうざいし、
Win+Xのショートカットから起動したいし
0246デフォルトの名無しさん2020/05/19(火) 11:55:42.51ID:1h+Pwucu
C#クラスFooをAdd-Typeして
Fooを継承するpowershell class Barを定義しようとするとVSCodeの静的解析に型Fooが無いって言われる
実行時には問題なく動作するんだけど鬱陶しい
どうにかならんのかこれ
0247デフォルトの名無しさん2020/05/19(火) 16:52:18.17ID:JYrNQD+Z
>>246
現状では継承クラスを別ファイルにして読み込み元で先にadd-typeしてから遅延読み込みするしかない
core系統ではusing assemblyの実装が保留されてるから
将来的にはおそらくそこをクリアしたusing assemblyが実装されると思うけど

>実行時には問題なく動作するんだけど

それはどこかしらで自分で先にadd-typeしてるからだと思う。そうじゃないとエラーで止まる

今の段階で最善と思われる方法はマニフェストモジュールにして
psd1内でRequiredAssembliesに継承元のアセンブリを設定すること
それをusing moduleで読み込むようにすれば最も自然に使える
0248デフォルトの名無しさん2020/05/19(火) 20:59:56.70ID:JYrNQD+Z
>>246
ごめんよく読んだら的外れなレスだったわ
C#のコードをadd-typeするってことね
.NETのクラスを継承すると勘違いした
0251デフォルトの名無しさん2020/05/25(月) 18:56:03.39ID:1KC3re4i
教えてください。Windows10です。
クリップボードに次の文字をコピーします。
Get-ChildItem -Path "c:\doc★"
これをPowershellに貼り付けると、勝手に★が削除されて
Get-ChildItem -Path "c:\doc"
になってしまいます。正常に貼り付けるには、
どのようにすればよろしいでしょうか?
0254デフォルトの名無しさん2020/05/26(火) 08:41:22.73ID:Ay3ltgvo
コンソールじゃなくてPSReadLineのバグでしょ
Remove-Module PSReadLine を実行した後なら普通に貼り付けできる
0255デフォルトの名無しさん2020/05/26(火) 08:45:00.47ID:TWTiQG7J
>>251
知らんかった、こんなバグが有ったのか。ウチの環境でも再現した。

echo '★★★★'
echo '☆☆☆☆'

これを貼り付けると、

echo ''
echo ''

こうなったわ。
0260デフォルトの名無しさん2020/05/26(火) 19:42:26.62ID:wDroaLCo
echo 'yatta-man★ko-hi-★raita-'
いやー、もう少しで社会的に抹殺されるところだったよ
0262デフォルトの名無しさん2020/05/28(木) 16:49:06.82ID:NkjBuM4x
Get-ADPrincipalGroupMembership -identity testuser1 | Select-Object name | ・・・

というshellを2つ続けて流すと、ログファイルに記載されたとき、
1つ目のshellの結果と2つ目のshellの結果に3行の空白が生まれます。

なぜでしょうか・・・?
0264デフォルトの名無しさん2020/05/29(金) 09:24:43.84ID:AL+gVKfO
https://ejje.weblio.jp/content/shell

shellとは
貝殻、(カキの)殻、(カメ・エビ・カニなどの)甲羅、(カブトムシなどの)硬い外皮、(鳥の卵の)殻、(果実・種子などの)殻、(豆類の)さや、(建物・乗り物などの)骨組み、外郭、船体
0265デフォルトの名無しさん2020/05/29(金) 09:26:47.27ID:d1uEOplb
>>263
すみません。
PowerShellスクリプト、です。
0266デフォルトの名無しさん2020/05/29(金) 12:54:04.01ID:1C1s9P85
ログファイルはフィルターして見るから、どうでも良くね?

サーバー運用部門しか見ないし。
一般社員が見ないだろ

数年保存して捨てるだけの、ログファイルの書式にこだわっても、仕方ない
0267デフォルトの名無しさん2020/05/29(金) 14:16:17.31ID:8xO19nFy
なぜそうなるかを知りたいってことだろ
>>262がどういうスクリプトを流してるのかさっぱり要領を得ないから原因は全くわからんけど
0268デフォルトの名無しさん2020/05/29(金) 15:24:58.90ID:GJdaxgw0
>>265
(1)1回目と2回目は、パラメータが違うのですか?それとも、全く同じ内容で実行のタイミングが違うだけですか?
(2)何度も尋ねるのは煩雑なので、可能であれば端折らずに記述内容を全て記載してもらえませんか?
0270デフォルトの名無しさん2020/05/29(金) 15:53:45.83ID:d1uEOplb
>>266
 正にその通りなんですが、サーバー運用部門としてみる人数が多いので、
 可能な限り整った書式で出力したい次第です。

>>267
 今までも様々なログを出力してきましたが、
 今回のような不思議な現象は初めてで、どうしてなのか解明したいです。

>>268
 (1)1回目と2回目はほぼ同じスクリプトです。
 (2)端折っていない実行したスクリプトを記載します。

>>269
 センス、出ますよね・・・。

端折っていないスクリプトです。
以下二つを、同時に流しました。

Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Width 1000 >> C:\work\logtest0528.csv
Get-ADPrincipalGroupMembership -identity test222 | Select-Object name | Format-Wide -Column 20 | Out-String -Width 1000 >> C:\work\logtest0528.csv

よろしくお願いします。
0271デフォルトの名無しさん2020/05/29(金) 16:13:12.46ID:1C1s9P85
たぶん、1つ目のアプリが、3行の改行コードを出力してるからだろ

例えば、HTML みたいに、データ内の区切りに、CR・LF の改行コードを使っているものもある。
それらを出力すると、空行ができる

それか、アプリにバグがあって、
正しくデータが取れず、空行だけが出力されているとか
0272デフォルトの名無しさん2020/05/29(金) 16:16:40.36ID:yQdVc2qs
>>262 > というshellを2つ続けて流すと
>>270 > 以下二つを、同時に流しました。

相手を混乱させて遊んでるっていう理解でいい?
0273デフォルトの名無しさん2020/05/29(金) 16:45:48.92ID:d1uEOplb
>>271
 バグですか・・・
 必要なデータは取得できているんですが、
 その下に不必要な空行が発生するのは、もう、仕方ないんですかね・・・

>>272
 混乱させるつもりはなかったのですが、
 >>270のスクリプトは、エクセルで作成をしました。
 (A1に1つ目のスクリプト、A2に2つ目のスクリプト・・・という感じです)
 作成したスクリプトの全てをコピーし、PowerShellに貼り付ける、
 という作業をしました。
0274デフォルトの名無しさん2020/05/29(金) 16:56:48.51ID:xfksWnzq
そもそも Get-ADPrincipalGroupMembership が何個の要素をパイプラインに流してるか見てみたら?
0275デフォルトの名無しさん2020/05/29(金) 17:01:45.38ID:GJdaxgw0
>>270
ユーザが所属しているグループをファイルに吐きたいわけですよね。
1ユーザごとに1ファイル、グループは横に並べて出力、という条件は必須ですか?
0276デフォルトの名無しさん2020/05/29(金) 17:11:08.51ID:GJdaxgw0
>>273
力技だけど、これでどうですかね。うちの環境ではうまく行ってます。
(Get-ADPrincipalGroupMembership -identity testuser111 ).name | %{"$_`t"| Out-File -NoNewline -Encoding ascii -Append -FilePath "C:\a.txt"}
0277デフォルトの名無しさん2020/05/29(金) 17:38:52.98ID:d1uEOplb
>>274
 その考えは無かったです・・・
 調べてみます。

>>275
 >>270のコードでtest111,test222としているところ、
 実際には3000程の数があります。
 実行するスクリプトの結果(ログ)は一つのファイルに追記する形で、
 理想の出力は、
 1ユーザーの所属するグループが、1セル1グループに横並びになることです。

     A      B     C
  1 グループ1 グループ2 グループ3   ←1つ目のスクリプトで流したtest111の所属するグループ
  2 グループ1 グループ3 グループ4   ←2つ目のスクリプトで流したtest222の所属するグループ

 というイメージです。

>>276
 ありがとうございます!
 検証してみます。
0278デフォルトの名無しさん2020/05/29(金) 18:01:42.95ID:d1uEOplb
>>276
 -NoNewline でエラーになります・・・
 Out-FileのパラメーターとしてNoNewLineというものが無いと表示されます。

 276さんはうまくいったとのことなので、
 環境が違うのでしょうか・・・?
0279デフォルトの名無しさん2020/05/29(金) 18:11:11.49ID:GJdaxgw0
>>278
じゃあ、最初の趣旨とは違ってますけどこれでどうでしょう。
"C:\users.txt"には、対象となるユーザ名を1行に一つという形式で記述してください。
まあ、対象ユーザも Get-ADObject で取得したほうがスマートですけどね。「特定のコンテナ内のユーザ」といった条件なら簡単なのですが。

$users = Get-Content "C:\users.txt"
foreach ($user in $users) {
if($user -eq ''){
break
}
echo $user
$grps = (Get-ADPrincipalGroupMembership -identity $user ).name
$line = ''
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding utf8 -Append -FilePath "C:\grp.csv"
}
0280デフォルトの名無しさん2020/05/29(金) 18:22:56.82ID:d1uEOplb
>>279
 ありがとうございます。
 すでに私に理解できる範囲を超えているのですが、、、

 データを取得したい対象ユーザーは”特定のコンテナ内”です。

 その場合であれば、どこを変更するようになるでしょうか?
 すみません。ご教示ください。
0281デフォルトの名無しさん2020/05/29(金) 18:44:52.24ID:GJdaxgw0
>>280
じゃあこれが良いと思います。
3行目の「"OU=Newusers,DC=example,DC=local"」となっている箇所を、実際の環境に置き換えてください。
以下は、ドメイン名が「example.local」、最上階層の「Newusers」という OU 内の UserObject を全て取得する場合の例です。
デスクトップ上に 'yyyyMMdd_hhmmss.csv' を出力します。1カラム目はユーザ名で、2カラム目以降がグループ名です。

$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
foreach ($user in $users) {
if($user -eq ''){
break
}
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding 'utf8' -Append -FilePath $logPath
}
0282デフォルトの名無しさん2020/05/29(金) 18:48:35.39ID:GJdaxgw0
>>280
追伸。まず、
Get-ADUser -Filter * -SearchBase "OU=Newusers,DC=example,DC=local"
だけ実行して希望通りのユーザオブジェクトが出力されることを確認してください。
"OU=Newusers,DC=example,DC=local"の記述方法がキモになりますが、
よくわからない場合は「distinguished name」でググってください。
0283デフォルトの名無しさん2020/05/29(金) 23:38:38.95ID:d1uEOplb
>>281
>>282
 本当にありがとうございます!
 今は検証環境に繋げないので、明日、試してみます!
 また結果を明日の夜します!
0285デフォルトの名無しさん2020/05/30(土) 07:47:46.25ID:Z2NT1d95
PowerShellを使って結果出す事それ自体が目的になってしまう事はよくある
0286デフォルトの名無しさん2020/05/30(土) 08:49:02.75ID:d859mrLa
結果を出すことが目的なのはいいだろw
PowerShellを使うことが目的になると言いたいんだろうけど
0287デフォルトの名無しさん2020/05/30(土) 10:31:28.21ID:KjUAf8QQ
>>284
このスレでそれを言うのは、料理レシピサイトで「ファミレスで食うほうが楽じゃね?」って言うのと同じ
0288デフォルトの名無しさん2020/05/30(土) 13:24:05.40ID:9sn/rA++
余計なソフトのインストールを禁止している会社って
PowerShellでプログラミングするのは認められているの?
0290デフォルトの名無しさん2020/05/30(土) 23:54:06.76ID:iu9cBMrA
合法とも禁止とも明示してる企業は見たことないな
はっきり禁止されてないなら使ってOKって解釈で今まで問題になったことはない
0292デフォルトの名無しさん2020/05/31(日) 01:57:51.20ID:81hmFEht
うちは、総務部の担当者に許可を求めることになっているが、
その担当者がよく解らない人のようで、ダメと言われたことはないな。
0295デフォルトの名無しさん2020/05/31(日) 23:56:26.74ID:iB7Renkw
>>281
報告が遅くなりました・・・。
検証環境で実行した結果、
A列にログオンID、B列に所属するグループ1、が表示されました。
ここまではかなりいい感じだったのですが、
所属するグループの2つ目以降が出力できませんでした・・・。
2つ目以降を出力できるよう考えてみましたが、
取ってつけた知識では太刀打ちできませんでした。
すみません。2つ目以降を出す方法を教えていただけますでしょうか。

csvdeも考えたのですが、
先に形になったのがGet-ADPrincipalGroupMembershipだったので、
そちらを主軸に考えていました。
理想形が出力されればcsvdeでも全く問題ありません!

レジストリはいじれますが、あくまでもシステム管理部であるから、
という感じですね。

あー、PowerShellを使うこと、が目的になってしまってる感はありました。
理想の出力結果が出れば、フリーのツールでもOKなんですが、、、
0296デフォルトの名無しさん2020/06/01(月) 00:21:41.64ID:vdF2NbM2
余分な空白さえ消えればいいなら
Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()}
02972812020/06/01(月) 08:58:32.48ID:Pn8bHbMj
>>295
説明がしにくいので、pastebin に貼りました。
https://pastebin.com/g40VkBXe

こちらで試している限り、所属グループが複数でも正しく出力されています。
現象的に、12行目の
$line += '"{0}",' -f $grp
が、「+」が抜けて
$line = '"{0}",' -f $grp
になっているように思えます。

確認1:
コードはコピペされてますか?それとも、画面を見ながら手打ちで転記でしょうか。
もし後者の場合はコピペで試してみてください。
また、仮にコピペだったとしても、5ちゃんからではなく上記 URL の pastebin からコピペしなおしてみてもらえますか。

確認2:
ファイルに書き出すものと同じ内容を画面にも出力するようにしています。
グループ名が一つだけ、というのは画面上でもでしょうか?
0298デフォルトの名無しさん2020/06/01(月) 20:38:24.16ID:6WpvIjeC
>>296
 ありがとうございます。
>>270に記載のスクリプトを編集して、
 Get-ADPrincipalGroupMembership -identity test111 | Select-Object name | Format-Wide -Column 20 | Out-String -Stream | ?{$_ -ne ""} | %{$_.trim()} >> C:\work\logtest0528.csv
 という感じになるでしょうか?

>>297
 ありがとうございます。
 確認1:5ちゃんをコピペしてました。
     明日検証環境を使えるので、URLのpastebinからやってみます。
 確認2: グループ名が一つだけ、というのは画面上でもそうなってます。
     (実際には所属するグループが3つあるユーザーを作りテストしています)
「+」は確かに抜けているところがありますね・・・。
修正して、もう一度検証してみます。

ありがとうございます!
0299デフォルトの名無しさん2020/06/01(月) 23:33:53.68ID:5NIHbXOS
「慶應卒の学歴なんていらない」10代起業で成功する子の共通点
https://www.excite.co.jp/news/article/President_35457/
起業で成功するキャリア形成の仕方とは? 元プロサッカー選手で起業家の鈴木啓祐氏に聞いた
https://sogyotecho.jp/career-development/
【アプリ開発で起業】必要な心得とマネタイズ方法のすべて
https://www.dreamgate.gr.jp/contents/column/application-development
学生起業家が開発、「人を軸に本を探すアプリ」とは?読書通じて「考える力」養って
https://newswitch.jp/p/20168
島田商高生がアプリ考案、発表 ICT起業家育成プログラム
https://www.at-s.com/news/article/local/central/730010.html
医師コンビが「治療用アプリ」で起業、禁煙に続き高血圧治療アプリを開発
https://diamond.jp/articles/-/229375
好きが高じて“カレー起業”、キャッシュレス決済アプリ「TOKYO MIX CURRY」の挑戦
https://diamond.jp/articles/-/215868
0300デフォルトの名無しさん2020/06/02(火) 12:00:25.43ID:TaVu0Z+0
>>297
 pastebinに記載いただいたスクリプトをマルっとコピペで、
 理想形として出力することができました!!
 本当にありがとうございました!!

 一文で作成しようと考えていましたが、
 こんなに長いスクリプトが必要とは思いませんでした・・・。
03012972020/06/02(火) 13:51:33.65ID:4gU+uBDd
>>300
うまく動いたようで良かったです。

あのスクリプトですが、1行ごとに見ていけば実行してることは単純です。
また、記述する際も省略表記はなるべく避けるようにしましたので、
ググって意味を調べるのも容易かと思います。

Windows 系インフラの構築/運用では PowerShell を活かせる場面が
多くありますので、この機会に覚えておくと強力なスキルになると思います。
0302デフォルトの名無しさん2020/06/02(火) 16:16:22.57ID:e5f6kXC+
csvdeは全部エクスポートしておけば適当なスクリプトでどこでも試せるけど
PSはいちいちAD鯖に繋ぎに行く形だからテストが大変なんよね
0303デフォルトの名無しさん2020/06/02(火) 18:35:36.73ID:TaVu0Z+0
>>301
 本当にありがとうございました。
 次にこの出力したデータを加工して、今度はインポートする作業が待っていますが、
 調べて頑張ってみます。

>>302
 はい。家庭で検証ができないのでテストが大変でした。
 csvdeも今後使うことがありそうですので、注意してみておきます。
03043002020/06/03(水) 17:19:22.25ID:OSlS0ZCr
すみません。頑張り切れませんでした。
>>297 の出力結果に加え、
そのアカウントの有効/無効の情報を同時に取得したいと思い、
Enabledを加えてみましたが、うまく出力できませんでした。

Enabledは、Write-Hostの前に入れればよいと思いましたが、合っていますか?
03053002020/06/03(水) 18:10:05.65ID:OSlS0ZCr
Write-Hostの前じゃなかったです。
後ろでした。
これで


$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase " OU=ユーザー,DC=test,DC=local "
foreach ($user in $users) {
if($user -eq ''){
break
}
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
 Write-Host ('{0} : ' -f $user.Enabled) -NoNewline      ←★★ココ
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
foreach ($grp in $grps){
$line += '"{0}",' -f $grp
}
echo $line
Out-File -InputObject $line -Encoding 'utf8' -Append -FilePath $logPath
}

これで画面には出るようになりました。
出力するファイルにも出るようにするには、、、
03062972020/06/04(木) 11:06:18.52ID:TeZKrupD
>>305
$line = '"{0}",' -f $user.SamAccountName
の下に、
$line += '"{0}",' -f $user.Enabled
を追加してみてください。
あと、
if($user -eq ''){
break
}
は、対象のユーザ名をファイルから読み取っていたバージョン (>>279) の名残ですので、バッサリ削除しても良いですね。

まとめるとこうです。
https://pastebin.com/8iFFBCA5

念のため解説しておくと、$line は、最終的にファイルに書き込むことになる文字列を格納しています。
で、代入時に「=」ではなく「+=」を使ってますので、代入の都度「置き換え」ではなく「追記」になります(文字列の場合。数値の場合は加算)。

つまり、
$line += '"{0}",' -f $user.Enabled
を冗長な書き方に直すと、
$line = $line + ('"{0}",' -f $user.Enabled)
ということになります。

文字列の「-f」については以下を参照してください。
https://www.google.com/search?q=powershell+string+%27-f%27
オブジェクトのプロパティを指定したものを文字列に直接記述できないのでこうしています。
(こうは書けない $line += '"$user.Enabled",')
03073002020/06/04(木) 21:01:19.40ID:7LqTXEt1
>>306
解説までいただきましてありがとうございます!
ご提案のスクリプトで無事、第1段階のデータを出力することができました。

次の作業がまた待っていますが、教えていただいたことを参考に
作ってみます。

本当にありがとうございます。
0308デフォルトの名無しさん2020/06/04(木) 22:31:22.80ID:sBE+PUel
powershell学習したいのですが、どのようなことからやっていけばいいでしょうか?
とりあえず、バッチファイルを書き換えようかなぁとか思ったりしていますが
いかがでしょうか?
0309デフォルトの名無しさん2020/06/04(木) 22:43:28.06ID:7Yb6fwZR
自分で書いたバッチファイルを置き換えるのは効果的な学習だと思う
ただ対応するコマンドを置き換えていくだけだと
オブジェクトをパイプでつないでいくPowerShellっぽい部分を身につけるのが難しいから
Cookbook的な本で先人のコードを写経しつつ改変していくのがいいんじゃないかな
0310デフォルトの名無しさん2020/06/04(木) 23:21:46.10ID:hC0MsN2x
Ruby の方がよい。
Ruby 内で、powershell, clip コマンドなども呼べる

# クリップボード内の複数行文字列の、各行の先頭・末尾から、
# 連続する空白類を除去して、クリップボードに入れる

str = `powershell Get-Clipboard`
str.encode! Encoding::UTF_8, Encoding::CP932 # UTF_8 へ変換

ary = str.each_line.map( &:strip ) # 連続する空白類を除去する

IO.popen( 'clip', 'w:cp932' ) do | clip | # CP932 へ戻す
clip.print( ary.join "\n" )
end
0311デフォルトの名無しさん2020/06/05(金) 01:16:33.38ID:amrr7gLk
ttps://heetnote.com/semi-auto-ps/#more-2973
ここで公開されているスクリプトを自分なりに書き換えて使っているのですが、
FakeAacWavをfre:ac1.11に置き換えるとWrite-Hostで表示される日本語が全て文字化けするようになってしまいました。
以前はfre:ac0.9を使っていたのですが、その時は文字化けしませんでした。
処理開始時点では日本語は正常に表示されるのですが、fre:acの処理が始まると同時に、正常に表示されていたものも含めて
全ての日本語が「□□□」に置き換わるようになります。
多分ですが文字コードの問題ではないようです。ソフト側の問題であってどうしようもないものでしょうか?
0312デフォルトの名無しさん2020/06/05(金) 06:07:06.84ID:Trob9zBU
コマンドラインに その@ を張り付けると その だけになるの困る
なぜか @ 単独で張り付けると @ が入るのが謎

@あ@あ だと @ああ だったりもう……
0313デフォルトの名無しさん2020/06/05(金) 08:46:16.13ID:S6jGROW/
>>311
外部コマンド(*.exe)の出力が起因する問題なのであれば、
「& 〜〜」で同一のコンソール内で実行するのではなく、
「Start-Process 〜〜〜」で実行してみてはどうでしょう。
Start-Process の場合は新しいコマンドプロンプトのウィンドウが開いて、
そこで実行されます。
0314デフォルトの名無しさん2020/06/05(金) 15:49:55.88ID:amrr7gLk
>>313
ありがとうございます。試行錯誤しているのですがStart-Processでfre:acが起動しません…
Start-Process -FilePath (fre:acのパス。""で囲む) -ArgumentList (fre:acの引数。""で囲む)
…で書式は合ってますよね?
0315デフォルトの名無しさん2020/06/05(金) 16:56:17.03ID:S6jGROW/
>>314
CLI の外部コマンドは ※ 上で実行しますので、Start-Process で起動するのは
あくまでも ※ です。ですので、引数として CLI の外部コマンドを指定するといいと思います。

こんなかんじですかね。
https://pastebin.com/NFDDXARP

※ コード内の文字列が5ちゃんの NG ワードになっていて書き込めないので、Pastebin にしました
0316デフォルトの名無しさん2020/06/05(金) 17:15:12.53ID:O//h2yE5
初心者です。
あるlogフアイルの1行目を新しいlogファイルに書き出し、
続けて同じlogファイルから特定の文字列で検索した結果を上書きしたいのですが、
具体的には

Get-Content C:\test\stdout.log -totalcount 1 > C:\test\stdout_bk.log
Select-String -Path C:\test\stdout.log -Pattern 2020/0 -Encoding default >> C:\test\stdout_bk.log

こう書いてしまうとstdout_bk.log ファイルの2行目が改行してしまいます。
(3行目からSelect-String の結果がかき出される)
stdout_bk.log ファイルの2行目からSelect-String の結果をかき出したいのですが
どうすればいいでしょうか。また処理全体を2行に分けるのではなく
できたら1行にまとめたいのですが、可能でしょうか。
0317デフォルトの名無しさん2020/06/05(金) 17:50:49.18ID:Trob9zBU
>>316
これであってる?
Get-Content C:\test\stdout.log | & { Begin { $header = $true } Process { if ($header) { $_; $header = $false } elseif ($_ -match '2020/0') { $_ } } > C:\test\stdout_bk.log
0318デフォルトの名無しさん2020/06/05(金) 17:53:48.63ID:amrr7gLk
>>315
丁寧な解説ありがとうございます。しかしうまくいかない…。
ひょっとして外部コマンドになるので引数にPowerShellの変数を使用できないですか? こんな感じですが↓
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e sndfile-wave -d $OutputDir $AacItem.FullName")
0319デフォルトの名無しさん2020/06/05(金) 18:06:39.45ID:S6jGROW/
>>318
$AacItem.FullName を「"」で囲っても、$AacItem のプロパティ FullName は取り出せないです。
いろんなやり方があると思いますけど、私は「-f」を使うやり方が好みです。
Start-Process "一部省略" -ArgumentList ("/c","freacのパス",("-e sndfile-wave -d $OutputDir {0}" -f $AacItem.FullName))

でもこっちのほうが良さそうですね。
Start-Process "一部省略" -ArgumentList ("/c","freacのパス","-e","sndfile-wave","-d",$OutputDir,$AacItem.FullName)
0320デフォルトの名無しさん2020/06/05(金) 18:11:37.96ID:S6jGROW/
>>318
$OutputDir や $AacItem.FullName にスペースが含まれてると失敗するかもしれませんので、その場合はこうでしょうか。
Start-Process "一部省略" -ArgumentList ("/c freacのパス -e sndfile-wave -d '{0}' '{1}'" -f $OutputDir,$AacItem.FullName)
0321デフォルトの名無しさん2020/06/05(金) 18:22:39.72ID:O//h2yE5
>>317

}を1個つけると意図する結果が出力されました
ありがとうございました。
復習します。
0322デフォルトの名無しさん2020/06/05(金) 18:52:19.70ID:O//h2yE5
>>317
すみません、よろしければ少し解説いただけないでしょうか
$_の使い方がいまいち理解できません。
0323デフォルトの名無しさん2020/06/05(金) 19:56:13.96ID:amrr7gLk
>>319
3つとも試してみましたが、どれも正常に動きませんでした…。
一番上は何も処理せずpowershellが終了してしまい、2番めと3番めは黒いウインドウが一瞬表示されるものの
freacは何も処理せず次に進んでしまいました。
{0}と-fは
ttps://yanor.net/wiki/?PowerShell/%E6%96%87%E6%B3%95/%E6%96%87%E5%AD%97%E5%88%97%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97%E5%AD%90
ここの一番上で解説されているものでしょうか。
0324デフォルトの名無しさん2020/06/05(金) 20:50:39.26ID:Trob9zBU
>>322
Processブロックでは $_ に各行が入ってくるので必要な時だけ出力しました
$_の扱いはForEach-Objectと同じなので、そちらでたくさん例が見つかるでしょう

>>323
Windows限定かもしれませんが、コマンドラインで

prog arg1 arg2 arg3

と起動するプログラムならこれでいい気がします

Start-Process "prog" -ArgumentList @('arg1 arg2 arg3')
0325デフォルトの名無しさん2020/06/05(金) 21:15:18.94ID:Trob9zBU
例をつけ忘れました。こんな感じ。

Start-Process 'pwsh' -ArgumentList @('-nop -c "1 .. 3 | % { $_; Start-Sleep 1 }"')
0326デフォルトの名無しさん2020/06/05(金) 21:44:06.19ID:amrr7gLk
Start-Process "freacのパス" -ArgumentList @('-e sndfile-wave -d $OutputDir $AacItem.FullName')
単純にこれではダメでした。
0327デフォルトの名無しさん2020/06/05(金) 22:10:21.57ID:Trob9zBU
そりゃもちろんこうしないと

$args = '-e sndfile-wave -d {0} {1}' -f $OutputDir, $AacItem.FullName
Start-Process "freacのパス" -ArgumentList @($args)
0328デフォルトの名無しさん2020/06/05(金) 22:12:15.54ID:Trob9zBU
ってこれ >>320 に空白考慮版があるね
0329デフォルトの名無しさん2020/06/05(金) 22:17:17.85ID:Trob9zBU
と思ったけど >>320 は必要ないcmd(?)経由に失敗してる?
0330デフォルトの名無しさん2020/06/05(金) 23:21:02.62ID:C2qeZTUp
>>324
もう一つご教示ください。
header変数はどこで定義されている(という表現が適切か判りませんが)か教えていただけないでしょうか
0331デフォルトの名無しさん2020/06/05(金) 23:41:51.74ID:e4Todh9J
>>317
の、Begin { $header = $true }

Begin 節で、header という変数を定義して、初期値をtrue にしてるのでは?
0332デフォルトの名無しさん2020/06/05(金) 23:44:42.07ID:C2qeZTUp
ありがとうございます。
理解できてない。無知をさらけ出してしまいました。
0333デフォルトの名無しさん2020/06/06(土) 00:12:58.72ID:7YMZq5d4
>>312
@、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
UTF-8 で使えるのかどうか、不明

ひょっとして、ファイル名に、半角英数字以外を使っているのか?
ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
03343262020/06/06(土) 00:36:27.86ID:YeDbVwYY
>>372
すみません、それも結果は同じでした。
ここまで色々出していただいた記述例を全て試しても結果は同じで、cmdのウインドウは一瞬出るがfreacは何もせず終了という状態です。

プログラムに触るのが初めてというレベルの初心者で、ここで教えてもらったことを丸写しするくらいしかできないですか、
このままこの話題続けても大丈夫ですか? 大分長いこと占領していて申し訳ないのですが。
0335デフォルトの名無しさん2020/06/06(土) 01:43:36.18ID:7YMZq5d4
Powershell で文字コードを変更する(clip.exe へのリダイレクトもね)
https://www.vwnet.jp/Windows/PowerShell/CharCode.htm

「powershell 文字コード 変換」で検索!

本当は、込み入った処理は、Ruby でやって、
Powershell・コマンドプロンプトは、 起動部分だけの単純なものにすべき!

こういうシェルで、ややこしいプログラミングは無理
0337デフォルトの名無しさん2020/06/06(土) 07:07:30.54ID:3KBpE/OI
>>334
ようするに

$OutputDir = どこそこ
foreach ($InputItem in $Args) {

というループの中に

$AacItemList = Get-ChildItem 以下略
foreach ($AacItem in $AacItemList) {

というループがあって

& $fawclPath $AacItem.FullName

を書き換えて >>318 のようにしたいって理解であってますか?
なら $args を書き換えて使っちゃだめですし、
Start-Process も -Wait を付けた方が良さそうなんで

Start-Process 'freacのパス' -ArgumentList @('-e sndfile-wave -d "{0}" "{1}"' -f $OutputDir, $AacItem.FullName) -Wait

じゃないかな
0338デフォルトの名無しさん2020/06/06(土) 07:08:59.48ID:3KBpE/OI
>>336
それだ!
でもPSReadLineなしでは不便過ぎる……
03403192020/06/06(土) 09:23:51.93ID:2MzuylRm
>>323
こちらでも freac を入手して試したところ、>>319 のとおりで動作してます。
私は以下のようにして実行してみました。freac は ZIP で配布されていたものです。

※5ちゃんのNGワードに引っかかりまくって全く書き込みが出来ないため、コードは全て以下の Pastebin に記載しています
https://pastebin.com/M5hD1HXj

# パラメータ
# 例1

実際に試したところ、freac は ※ 経由でなくても動作しますね。
# 例2

【切り分け】
Start-Process で外部の CLI コマンドを実行した場合、終了後にウィンドウが
閉じられるので切り分けが難しくなります。

そこで、「-NoNewWindow」オプションを付けて実行してみてください。
freac (又は※) が出力するエラーが、PowerShell のコンソールに表示されるはずです。
# 例3
# 例4

【-f について】
{0} と -f に関してはご指摘のとおりです。
0341デフォルトの名無しさん2020/06/06(土) 10:08:38.99ID:B/uunGh7
>>333
横レスだが、
> @、つまり丸囲みの1 は、CP932 だけの環境依存文字だろ。
> UTF-8 で使えるのかどうか、不明
UTF-8というか、Unicodeには、一般的に使われている全ての
文字コードの全ての文字が含まれている。だから、Unicodeと呼ばれる。

> ひょっとして、ファイル名に、半角英数字以外を使っているのか?
> ファイル名・ユーザー名みたいなシステムに、半角英数字以外を使ったら、ダメ!
それはNEETの発想だ。職場の共有ファイル、取引先とやりとりする
ファイル等、一般社会では、ガチガチにファイル名のルールが規定
されていて自分勝手に決められない場合が多いのだよ。
0342デフォルトの名無しさん2020/06/06(土) 10:17:39.94ID:3KBpE/OI
>>340
端末設定を変えられて文字化けするから Start-Process させるんでしょ
-NoNewWindow で端末共有させたらエラーメッセージも化けてるんじゃ……
Start-Process のパラメーターを画面出力して Start-Process せずに exit
出力されたパラメーターが正しいか確認……かな
それをスレに貼ってもらえれば即解決な気がする
03433192020/06/06(土) 10:55:21.17ID:2MzuylRm
>>323
すみません、これまでの Start-Process の例では「-Wait」オプションが抜けていました。
そのうえで、>>342 の指摘も考慮して以下の通り3パターンでテストしてみました。
https://pastebin.com/yG2WUtPP

test1.ps1
Start-Process を使用するバージョン(-NoNewWindow 無し)

test2.ps1
Start-Process を使用するバージョン(-NoNewWindow 有り)

test3.ps1
オリジナルに近いバージョン(外部コマンドを「&」で実行)'

結果は以下の通りです。
https://i.imgur.com/b2tNZgy.png

test1.ps1、test2.ps1 が動作するのは想定どおりなのですが、test3.ps1 でも文字化けしてないんですよね・・・。
これまで「外部コマンドを Start-Process で別ウィンドウで実行すれば文字化けしない」という前提で
話を進めてきましたが、まったく関係なかったかも知れません。
0344デフォルトの名無しさん2020/06/06(土) 11:30:16.97ID:7wZTkIMZ
外部コマンドの出力をpowershell側で触ったら文字化けするって話してるなら

最初にコンソール出力時のエンコーディング設定変えて

$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8

最後に戻してやればいいんじゃない

[console]::OutputEncoding = $defaultEncoding
0345デフォルトの名無しさん2020/06/06(土) 13:53:01.40ID:3KBpE/OI
ちょっと話が脇にそれるんだけど……

あれ?
>>311 を読んで「表示済みの文字まで化ける」謎現象だと思ってたけど
「正常表示できてた文字を、新しく出力すると化ける」だけなの?

化けるのがコンソールアプリの出力だけで、PowerShellのその後の出力は正常なら
端末の受け入れるエンコーディングが変更されただけかも

出力関係のエンコーディングは

(a) コンソールアプリの出力を PowerShell がパイプなり代入なりで受け取る場合のエンコーディング (PowerShellが持ってる)
(b) 端末が受け入れるエンコーディング (端末が持ってる)

があって、PowerShell自身は勝手に(b)に合わせて出力するから化けない
コンソールアプリの出力は、PowerShellに食われる時は、(a)なら正常、違えば化ける
食われず直接端末に出力する時は、(b)なら正常、違えば化ける

コンソールアプリに(b)だけ変更されたのなら(a)に再設定すればいい
[console]::OutputEncoding を設定すると(a)と(b)の両方が設定される
(a)は [console]::OutputEncoding だから

[console]::OutputEncoding = [console]::OutputEncoding

すれば十分な気がする
03463262020/06/06(土) 13:53:57.50ID:YeDbVwYY
色々ありがとうございます。
まず結論ですが、>>344さんの方法で文字化けは一応治りました。
ただ、最初の行に
$defaultEncoding,[Console]::OutputEncoding = [Console]::OutputEncoding,[Text.Encodi ng]::UTF8
を記述すると
[console]::OutputEncoding = $defaultEncoding
が実行されるまで日本語が全て文字化けします。
なのでfreacが実行される行の上下をこれで挟むのが一応の解決方法でしょうか。

他の方々の書き込みですが、まずStart-Processに-waitをを付ける方法では完全に動作が停止して次の処理に進みませんでした。
>>340さんの例3、4を試してみると、File Not Foundになります。

原因が気になるところではありますが、本末転倒なので>>344さんの方法でとりあえず解決したことにします。ありがとうございました。
0347デフォルトの名無しさん2020/06/06(土) 16:15:55.11ID:3KBpE/OI
[console]::OutputEncodingの退避・復元で解決できるなら
退避なんかせずに freac(?) の実行直後に

[console]::OutputEncoding = [console]::OutputEncoding

入れるだけでいい気がするけど、もういいや
0348デフォルトの名無しさん2020/06/06(土) 17:37:53.88ID:7YMZq5d4
書き込み禁止ワードは、何かのコマンドだろ
cmd.@exe, ls @-l

外人のアプリだから、アプリ内部で、文字コードをASCII に決め打ちしてるのかも。
でも、そのアプリは、起動したPowerShellが親だとすると、子プロセスになるから、
子プロセス内で環境を変えたとしても、親プロセスに伝播しないだろ

親プロセスで環境を指定したら、子プロセスにその環境は引き継がれるけど

それかそのアプリは、文字コードをバイナリにしてるとかで、
データを受け取る方がテキストで受け取ると、文字化けするとか
0349デフォルトの名無しさん2020/06/06(土) 18:47:57.73ID:2MzuylRm
>>344
それ良いですね、勉強になります。
「俺専用ナレッジベース」にメモしときました。
0350デフォルトの名無しさん2020/06/09(火) 16:01:29.47ID:DriXa/wG
rem ff.cmd
@echo off
setlocal
cmd /k "pwsh -File ".\firefox-shutdown.ps1""
# firefox-shutdown.ps1
Start-Sleep -Seconds 10;
Get-Command;
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;
0351デフォルトの名無しさん2020/06/09(火) 16:26:23.01ID:DriXa/wG
Start-Sleep -Seconds 10;
mspaint "010371104.gif";
Start-Sleep -Seconds 3;
Get-Process firefox* | Stop-Process;
03523002020/06/11(木) 17:55:09.10ID:fJWIdGby
教えてください。

ADユーザーの最新ログオン日時を取得したいです。
記述としては、

$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase " OU=ユーザー,DC=test,DC=local "
foreach ($user in $users) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.LastLogon)

と思いましたが、最終ログオン日時を取得するのは
LastLogonであっているでしょうか?

また、最終ログイン日時の後にフルネームを取得したいときは、

$Now = Get-Date -Format 'yyyyMMdd_hhmmss'
$logPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ('{0}.csv' -f $Now )
$users = Get-ADUser -Filter * -SearchBase " OU=ユーザー,DC=test,DC=local "
foreach ($user in $users) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.LastLogon)
$line = $line + ('"{0}",' -f $user.Fullname)

となるでしょうか?
0354デフォルトの名無しさん2020/06/12(金) 10:07:01.73ID:tUTXhBxn
>>352
Get-ADUser は、デフォルトでは一部のプロパティしか取得しません。"LastLogon" が必要な場合は -Properties で指定する必要があります。
$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local"

$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local" -Properties 'LastLogon'

さらに、LastLogon で取得される日時データはシリアル化されたものですのでヒューマンリーダブルに変換する必要があります。
$line = $line + ('"{0}",' -f $user.LastLogon)

$date = [DateTime]::FromFileTime($user.LastLogon)
$line = $line + ('"{0}",' -f $date.ToString("yyyy/MM/dd HH:mm:ss"))

「フルネーム」ですが、プロパティとしては Name が該当するものになります。
$line = $line + ('"{0}",' -f $user.Fullname)

$line = $line + ('"{0}",' -f $user.Name)
03553542020/06/12(金) 10:07:36.18ID:tUTXhBxn
まとめるとこうです(ファイル書き出しの部分は省略)。
$users = Get-ADUser -Filter * -SearchBase "OU=ユーザー,DC=test,DC=local" -Properties 'LastLogon'
foreach ($user in $users) {
Write-Host ('{0} : ' -f $user.SamAccountName) -NoNewline
$grps = (Get-ADPrincipalGroupMembership -identity $user).name
$line = '"{0}",' -f $user.SamAccountName
$line = $line + ('"{0}",' -f $user.Enabled)
$line = $line + ('"{0}",' -f $user.Name)
$date = [DateTime]::FromFileTime($user.LastLogon)
$line = $line + ('"{0}",' -f $date.ToString("yyyy/MM/dd HH:mm:ss"))
Write-Host $line
}
03563542020/06/12(金) 10:09:03.73ID:tUTXhBxn
ただし、私自身も 10 年くらい前に AD の情報から LastLogon を取得することを検証したのですが、以下の理由から断念しました。

・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる
(各クライアントが認証要求を行ったドメコンでしか更新されず、各ドメコン間で同期されない)
・ユーザが PC でログオンしたタイミング以外でも、LastLogon は更新される (ログオフや長時間離席していた場合など)

正確なログオン日時が取りたい場合は、各クライアント上で取得する必要があります。イベントログを見れば分かります。
私は結局、ファイルサーバのテキストファイルにログオン日時とユーザ名を書き込むログオンスクリプトを作成したと記憶しています。
03573542020/06/12(金) 10:22:05.71ID:tUTXhBxn
追伸。

>・LastLogon のデータは各ドメコンが個別に保持しているデータなので、ドメコンが複数ある場合は各ドメコンごとに値が異なる

全てのドメコンから値を取得して、最も値の大きいものを採用する、というやり方も出来ます。
それでも、LastLogon がログオン操作以外でも更新されてしまうことには変わりませんので、確実に実行するならやはりログオンスクリプトをおすすめします。
0362デフォルトの名無しさん2020/06/12(金) 18:55:49.90ID:tr06rVi2
もうそれ最初からC#でやれば良くね?っていう
0363デフォルトの名無しさん2020/06/12(金) 19:42:03.65ID:sTuFS1ZK
大部分C#で書いてパワシェで書きやすい部分だけデリゲートでインジェクションするパターンなら多用しとるわ
03663002020/06/14(日) 00:11:44.27ID:JXZUsp2d
>>354
ありがとうございます!
検証環境で無事出力確認できました!
しかし最終ログイン日時の取得は難しいんですね。
今回はそれほど精密な値は求められないので良かったですが、
ドメコンには注意なんですね。
0367デフォルトの名無しさん2020/06/15(月) 19:20:43.36ID:KO8t20+1
ドメコンにリアルタイム性は期待できないと思ったがやっぱそうだよな
0369デフォルトの名無しさん2020/06/16(火) 11:32:29.65ID:r0rBA9XG
コマンドプロンプトでecho a b cを実行すると出力結果は
a b c
PowerShellでecho a b cを実行すると
a
b
c
なのはなんで?
エラーにもならずにbやcはどう扱われてるの?
0370デフォルトの名無しさん2020/06/16(火) 11:55:26.03ID:dJYiaODe
echo a b c
とかやってみれば、以下にcmdがクソかよくわかると思うよ。
0371デフォルトの名無しさん2020/06/16(火) 11:56:36.32ID:dJYiaODe
あ、間のスペースも消えてなくなるのか。
echo___a_____b____c
_をスペースに。
0372デフォルトの名無しさん2020/06/16(火) 12:32:39.69ID:0Yfa1k+l
いやいやいや
引数なんだから当然だろ
あとは出力で改行するかどうかだけじゃん
0374デフォルトの名無しさん2020/06/16(火) 12:53:01.50ID:r0rBA9XG
聞きたいのはそういう類じゃないんだな
echo (=Write-Output) のSyntaxが

Write-Output [-InputObject] <PSObject> [-NoEnumerate] [<CommonParameters>]

だからa が-InputObjectの<PSObject>になるのはわかる
bやcはどういう理屈で処理されるの?
0376デフォルトの名無しさん2020/06/16(火) 14:40:34.28ID:p9YvTGLE
まあ調べた374がpowershellの引数展開についてまとめて分かりやすく報告してくれるでしょ
0378デフォルトの名無しさん2020/06/16(火) 16:42:16.77ID:r0rBA9XG
del a b cはちゃんとエラーになる
さっぱりわからん😩
0379デフォルトの名無しさん2020/06/16(火) 17:12:01.69ID:MVe0R048
Write-Outputの-InputObjectパラメータにはValueFromRemainingArguments属性がついてるから
その場合はパラメータ名が明示されてないものはすべてInputObjectにバインドされるんよ

確認はしずらいけど以下で確認できる
(Get-Command Write-Output).ParameterSets[0].Parameters | where name -eq InputObject

まああんまりこの属性ついてるのはないからecho とかWrite-Hostあたりはこうなってるくらいの認識でいいよ
PowerShell7だとJoin-Pathもこの属性がついてる
0381デフォルトの名無しさん2020/06/16(火) 17:25:39.53ID:MVe0R048
>>379
訂正:パラメータ名が明示されてないものでポジショナルバインディングもできないもの
0382デフォルトの名無しさん2020/06/16(火) 17:45:58.38ID:r0rBA9XG
なるほど
ありがとう
0383デフォルトの名無しさん2020/06/16(火) 19:16:29.09ID:bkoiHKSB
PowerShellの起動がなんか凄いモタつくんだけどおまかん?
Windows10Home PS7.01

スクリプト書いて渡しても、
何も出ない黒い画面がしばらく出て怖がられたり、何個も起動されたりするし
0385デフォルトの名無しさん2020/06/16(火) 22:43:53.36ID:Tk9CpyzQ
cmd -L
9875   shinjyuku  Tokyo   Japan

の1列目を1行で変数に格納したいのですが、方法がわかりません。

$work=(cmd -L | Select-String "shinjyuku" )
$id=$work -split " "
Write-Output $work[1]

これを1行で書ける方法を教えてください。

よろしくお願いいたします。
0386デフォルトの名無しさん2020/06/16(火) 23:40:23.19ID:n71ojSL1
cmd -Lが何なのか判らないのでcmd /c echoの例で
(cmd /c echo 9875   shinjyuku  Tokyo   Japan | %{ $_ -split " " })[0]
0388デフォルトの名無しさん2020/06/17(水) 07:40:39.83ID:0yXiYm7U
>>386
ありがとうございます
特に隠すようなコマンドでもなかったのですが、
インターネット速度の自動計測スクリプトを作ってみようとしてます

.>\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)'

15047 OPEN Project (via 20G SINET) Tokyo Japan

> $i=(.\speedtest.exe -L | select-string 'OPEN Project \(via 20G SINET\)' | %{$_ -split ' '}[0])
> Write-Output $i[1]
15047
0389デフォルトの名無しさん2020/06/17(水) 07:50:00.92ID:PujUJ59z
cmd .exeに-Lオプションがあるのかと思った人は俺以外にもたくさんいるはず
03933922020/06/17(水) 10:13:28.30ID:U7B7s7qz
>>388
あれ、speedtest.exe の「-L」って、ネットワーク的に近い場所のサーバを
表示するだけで、実際の計測はしてないようですけど、これで良いんですか?
>>388 の続きがある、ってことですかね。
03943922020/06/17(水) 10:21:19.19ID:U7B7s7qz
>>388
タスクスケジューラで回すことを考えてるのかも知れませんが、単に
.\speedtest.exe -s 6766
とか
.\speedtest.exe -s 15047
といった感じにしないのはなぜですか?
speedtest.exe -L を実行する意図がよく分かりません。
03953922020/06/17(水) 10:29:32.27ID:U7B7s7qz
>>388
連投ごめんなさい、speedtest.exe は出力形式を CSV とか JSON とか色々
選べますので、ヒューマンリーダブルのものを加工するよりもそっちのほうが
簡単だと思います。

実行例:近隣サーバの列挙
PS > .\speedtest.exe -L -f csv
"ID","Name","Location","Country","Host"
"24333","Rakuten Mobile , Inc","Tokyo","Japan","ookla.mbspeed.net"
"15047","OPEN Project (via 20G SINET)","Tokyo","Japan","speed.open.ad.jp"
"28910","fdcservers.net","Tokyo","Japan","lg-tok.fdcservers.net"
〜以下略〜

実行例:サーバを指定した計測
PS > .\speedtest.exe -s 15047 -f csv
"OPEN Project (via 20G SINET) - Tokyo","15047","4.43","0.605","0","72540509","45781634","871440390","582254568","https://www.speedtest.net/result/c/e998102d-d04a-4258-9aae-6dd3afbbf323";
0396デフォルトの名無しさん2020/06/17(水) 15:45:25.40ID:UcA8Gcsf
ジョブをパイプの途中で使いたいと考えています

1 .. 3 | % { $_; sleep 1 } | & { process { ">$_" }}
これは1秒間隔で結果が出ます

Start-Job { 1 .. 3 | % { $_; sleep 1} } | Receive-Job -wait
これも1秒間隔で結果が出ます

1 .. 3 | % { $_; sleep 1 } | Start-Job { process { ">$_" }} | Receive-Job -wait
これは結果がまとめて出ます
1秒間隔で結果を得るにはどうすれば良いのでしょうか

# パイプラインで入出力がsjisのコマンドとutf8のコマンドを通すのが最終目的です
# データ生成 | sjis入出力 | utf8入出力 みたいなイメージ
# パイプラインでエンコーディングを混在させるのに$OutputEncodingの方は
# スコープで分ければすみますが、[console]::OutputEncodingはスコープ無関係
# なのでジョブで分けようかと
0397デフォルトの名無しさん2020/06/17(水) 16:28:19.33ID:pLBooGKC
なんでワンライナーでやる必要があるのかね、こういうの
保守とか考えないのかね
0399デフォルトの名無しさん2020/06/17(水) 17:44:32.75ID:UcA8Gcsf
>>397
コマンドラインで結果をすぐに見たいからですね
ページャーにつないで欲しい結果が出てきたら確認して終了
ステップごとに完了待ちしてたら時間がもったいない
0400デフォルトの名無しさん2020/06/17(水) 23:59:11.03ID:H0Dcbe9T
>>396
>1 .. 3 | % { $_; sleep 1 } | Start-Job { process { ">$_" }} | Receive-Job -wait

1 .. 3 | % { $_; sleep 1 }
この部分を、Start-Job の中に入れたら?
0401デフォルトの名無しさん2020/06/18(木) 05:52:46.25ID:7bz/apiR
$ary_names = @('太郎','次郎','三郎','四朗','五郎')
write-output $ary_name[@] #bashの記法
太郎,次郎,三郎,四朗,五郎

的なことをしたい。※区切り文字はなんでも可。


現状、配列に文字列をくっつけると1行で出るので
write-output ("a"+$aaa).trim("a")

という強引な方法をとっております。もっとPowershell的にスマートな方法があれば
お教えくださいませ。
0404デフォルトの名無しさん2020/06/18(木) 09:01:24.17ID:hwvpLd3O
>>400
それだと最終目的のためにはStart-Jobの入れ子が必要になるなあ
制御不能になりそうだし面倒なので避けたい
cmd.exeを使うことにします
0405デフォルトの名無しさん2020/06/19(金) 06:41:17.41ID:RNyMoV2a
$s=[datetime]::Now; 1 .. 5 | ForEach-Object { Start-Sleep 1; ">{0}" -f $_ } | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}

2秒間隔、トータル10秒という結果に困惑している
04074052020/06/19(金) 08:42:12.76ID:RNyMoV2a
最初は2秒、それから1秒間隔でトータル6秒だと思ってた
1秒待ちをStart-Sleepでなく別のプロセスで待たせても変わらなかった
0408デフォルトの名無しさん2020/06/19(金) 08:51:47.96ID:GhHOGZr1
パイプつなぎはいわゆるgenerator(PowerShellでの呼び方は知らない)になるってことかな?
0409デフォルトの名無しさん2020/06/19(金) 08:52:39.06ID:JIIBGf6G
1に対して最初のfor-eachの中身処理した後に次のfor-eachの中身処理。
2に対して...
3に対して...
4に対して...
5に対して...
ふたつのfor-eachの中身がどういう順に処理されてるか確認できるように表示を工夫してみたら?
04104052020/06/19(金) 09:08:23.61ID:RNyMoV2a
そこはなんとなくイメージできたんでもういい
パイプラインの各段を別のプロセスにすると6秒で終了する
同じように6秒で終了すると思ってたら違ったんで戸惑ったというお話
04114052020/06/19(金) 11:12:17.79ID:RNyMoV2a
$s=[datetime]::Now; 1 .. 5 | Start-ThreadJob { process { Start-Sleep 1; ">${0}" -f $_ }} | Receive-Job -Wait -AutoRemoveJob | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}

別スレッドを指定したらトータル6秒になった

一人研究発表会になっちまったな。すまぬ。
04124052020/06/19(金) 11:40:12.67ID:RNyMoV2a
よく見たら結果がおかしい。お手上げだ。諦めた。
04154052020/06/19(金) 21:01:31.39ID:RNyMoV2a
できたーーーー

$s=[datetime]::Now; 1 .. 5 | ForEach-Object { Start-Sleep 1; ">{0}" -f $_ } | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}
にちょい足しして
$s=[datetime]::Now; 1 .. 5 | ForEach-Object -Parallel { Start-Sleep 1; ">{0}" -f $_ } -ThrottleLimit 1 | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}
にしたらStart-ThreadJobを使った時より遅いけど簡単に予想してた結果になった
お騒がせしました
04164052020/06/19(金) 21:15:58.78ID:RNyMoV2a
こ、今度こそできたー

$s=[datetime]::Now; 1 .. 5 | Start-ThreadJob { $input | ForEach-Object {Start-Sleep 1; ">{0}" -f $_ }} | Receive-Job -Wait -AutoRemoveJob | ForEach-Object { Start-Sleep 1; ">{0} {1}" -f $_, ([datetime]::Now - $s).TotalSeconds}
やっぱりこれが最終版ということにしたい
お邪魔しました
0418デフォルトの名無しさん2020/06/20(土) 08:11:14.95ID:wKnheY+E
Powershellを使いこなすにはcomを知らなければならないと聞いたのですが、
comについてはどうやって学ぶのがオススメですか?
ググラビリティの悪い単語なので、
思うように検索できません
Excellの機能を使ってあれこれしたいです
0420デフォルトの名無しさん2020/06/20(土) 11:29:31.09ID:XppcwtFP
Powershellを使い始めました
皆さん、こんなの全部覚えてるんですか?
どうやって覚えました?

ファイル開いて書き込むだけで
こんなにもたくさん覚えないといけないって
大変だったんじゃないですか?

$output_file = "C:\bin\hoge.txt"
$sw = New-Object System.IO.StreamWriter($output_file, $false, [Text.Encoding]::GetEncoding("UTF-8"))
$sw.WriteLine("aaa")
$sw.WriteLine("あああ")
$sw.Close()


$sw.WriteLine("あああ")
$sw.Close()

この辺はまだ、覚えられるのですが、

New-Object System.IO.StreamWriter←InputOutputを、ストリームにライトするんだろうな
$output_file, $false,  ←ファイル名と、追記、上書を指定するんだろうな。
[Text.Encoding]:: ←なんで[]包むんだ、:: ←このダブルのコロンは何だ、
GetEncoding("UTF-8")) ←何でファイル作ってるのにGetなんだ、

単純に
$mojiko-do="UTF-8"で
New-Object System.IO.StreamWriter($output_file, $false,$mojiko-do)じゃないんだと、
覚えることや、なぜこうなってるんだに少々ビビってます。

皆さんが、どうやってこんなに複雑で面倒なものを覚えたか、コツがあったら教えてください。
0421デフォルトの名無しさん2020/06/20(土) 11:33:23.00ID:XppcwtFP
ほかにも、メソッド、プロパティ?クラス?で書き方がものすごいたくさんあるようで、めまいがします。

覚えれば仕事が楽になることは分かっているので、頑張りたいところなんですが
あまりの複雑さに、皆さんがどうやって覚えたのか、コツがあればぜひともお教えください。
0423デフォルトの名無しさん2020/06/20(土) 12:28:41.13ID:sltMp+ny
コード量が多いってことと覚えなきゃいけない知識量は必ずしも一致しないからな
Perlみたいに省略できまくるワンライナーのほうがスパゲティったときわけ分からなくなる
0424デフォルトの名無しさん2020/06/20(土) 12:29:17.17ID:dcvMDCGE
とにかく書いて動かす
やってみる、作ってみる
国語力、英語力は少しつけようとする
0425デフォルトの名無しさん2020/06/20(土) 12:31:14.10ID:E6EedD+K
.NETなんて前提にしなくてもマルチプラットフォームで使える文法を身につけるのが先
0426デフォルトの名無しさん2020/06/20(土) 13:13:11.69ID:w0A+CU3q
>>420
ファイルに書き込むだけならコマンドレットで足りる
痒い所に手が届かない時にググりながら.NETをボチボチ使って行けば良い
0427デフォルトの名無しさん2020/06/20(土) 13:13:46.53ID:F3e6GYXo
正直言ってPowerShellは覚える必要ない

スクリプトファイルを作って使うならC#を使うのと大差ない
それならC#を覚えて使う方がいい

コマンドラインシェルとして使うなら.NETやらCOMやら取り込む使い方は
何かあった時にシェルが巻きぞえになって、シェルを殺すしかなくなる
そうならない程度に言語自体の機能だけで使うなら、とりたて覚えるほどでもない
0428デフォルトの名無しさん2020/06/20(土) 13:42:16.03ID:dcvMDCGE
本番環境その場で場当たり的にコマンド打つのはあり得ないしな
まあすごくユルい会社なら知らんが
0429デフォルトの名無しさん2020/06/20(土) 13:50:27.59ID:zwBEwaPL
>>420
その書き方は.NETライブラリを使っているのでPowershellの初歩の枠を越えてる
追記するだけならこう
$output_file = "C:\bin\hoge.txt"
"aaa" | Out-File $output_file -Append -Encoding UTF8
"あああ" | Out-File $output_file -Append -Encoding UTF8
こうしてもいい
"aaa", "あああ" | Out-File $output_file -Append -Encoding UTF8
UTF16でいいならこれ
"aaa", "あああ" >> $output_file

Powershell 5以前には欠陥があって、BOMなしUTF8を新規作成する簡単な手段がなかった
だからStreamWriterを持ち出すようなサンプルが普及していて、初歩のはずなのに難しいと感じる要因になってる
0431デフォルトの名無しさん2020/06/20(土) 14:35:58.75ID:YZMPfrl8
最初から暗記する必要はなくて、機能を一覧表にしておいて
必要に応じてそれを参照、コピペすればいい
出現頻度の高いものは自然と覚える
いずれにしても手打ちするのは時間の無駄なので
コピペ推奨
0432デフォルトの名無しさん2020/06/20(土) 16:51:19.56ID:KBDfWM5t
習得してない人達のアドバイスは聞く必要がない
あっだからできないんだっていう見本にはなるけど
0434デフォルトの名無しさん2020/06/20(土) 17:35:07.43ID:6sC7z1nS
>>420
>コツがあったら教えてください。

PowerShell に限った話じゃないけど、学校の授業みたいに「勉強ありき」で
努力するよりも、「これをやるためには PowerShell を使うしか無い」という
状況に追い込まれると覚えやすいですね。

あと、積極的に英語のフォーラムなどから情報を得るようにしたほうが良いと思います。
やはり、日本語と英語では情報量が雲泥の差ですので。
Google 翻訳を使えば何とかなります。
0435デフォルトの名無しさん2020/06/20(土) 20:10:35.90ID:WPfafdOl
>>434
> 「これをやるためには PowerShell を使うしか無い」という状況
そんな状況は、普通は無い。

あるとすれば、>>428が言った
> 本番環境その場で場当たり的にコマンド打つ
ぐらい。
0436デフォルトの名無しさん2020/06/20(土) 23:24:31.04ID:tXS4Zxv6
PowerShell(PS)で、ビジネスロジック・複雑なものを書いたら、ダメ!

基本的に、CSV・JSON などは、Ruby で書いて、
起動部分だけを、コマンドプロンプト・PS・VBS などで作る
0438デフォルトの名無しさん2020/06/21(日) 08:39:56.92ID:PKUYu7rs
>>435
>そんな状況は、普通は無い。

仕事で MS のエンタープライズ系製品を扱ってると、嫌というほど
そういう状況に遭遇しますね。
Windows Server, Exchange, SQL Server, Office 365 あたりの
設計、構築、運用に携わってれば日常茶飯事です。

そういう仕事に携わるようになってから PowerShell を覚えた、って人が
多いと思ったけど、そうでもないのかな?プログラム板だから違うのかな?
0440デフォルトの名無しさん2020/06/24(水) 07:34:20.49ID:9MFoHisW
コマンドプロンプトでバッチを作るとちょっとした自動化に便利というのを最近知って調べたら
今はPowerShellCoreが現行とたどり着いたが
やっぱり移行するしないで揉めてる
04414362020/06/24(水) 08:08:25.26ID:rM4tv+8j
さすがに、バッチでプログラミングしてはいけない!
可読性が低すぎる

Ruby スクリプトなどを起動するだけにしておくべき
0442デフォルトの名無しさん2020/06/24(水) 08:40:10.38ID:L+v/qVAN
>>440
用途・要件次第。
業務利用という前提だけど、自分だったらこういうポリシーで緩やかに移行する。

・既存の cmd バッチや WSF、VBS → 基本的には移行(移植)しない
※例外:改修が必要になった場合は個別対応

・新規 → 基本的には PowerShell で作るべき
※例外:極々単純なもの、自分だけが使い捨てするもの
0444デフォルトの名無しさん2020/06/24(水) 09:05:28.99ID:W7e3ICMc
>>441
お前はRuby禁止のスレでRubyでは〜Rubyでは〜とやるのをやめろ。ノイズにしかならない糞レスはスレの可読性を下げるだけだ。
0445デフォルトの名無しさん2020/06/24(水) 09:51:09.11ID:LpqCs0qI
440で思い出したけど、powershell coreって今どうなってるんや
自分は実行環境としては5.1をメインで使ってるけど、みんなどこら辺なんや
0446デフォルトの名無しさん2020/06/24(水) 10:09:13.32ID:wIzfCOgT
win10プレインストールしか使っとらんわ
というかツール勝手に入れられない客先環境で戦うためのツールって認識
0447デフォルトの名無しさん2020/06/24(水) 10:48:39.06ID:oYgVDO6A
>>446
> ツール勝手に入れられない客先環境で戦うためのツール

ほんそれ。

いまメインでやってる案件だと、お客さんから貸与されてる作業用 PC があって、
お客さんの環境にはそのマシンしか繋げられない。もちろん、世に数多とある便利ツールを
好き勝手に入れることは出来ない。

でも PowerCLI などの PowerShell モジュールのインストールは純正管理ツール扱いで
許可されてるので、構築とか保守作業では PowerShell スクリプトを使いまくってる。

いちいちマウスでカッチンカッチンやってたら、日が暮れちゃうからね・・・。
0448デフォルトの名無しさん2020/06/24(水) 12:17:32.10ID:9MFoHisW
>>442
なるほど。
どうも。
0449デフォルトの名無しさん2020/06/24(水) 21:01:47.98ID:jVaXlMW4
scriptblock[] を受け取って、scriptblockをそれぞれスレッドで動かして
パイプでつないで実行するfunctionを書きたいんだがうまく書けない
ようするに
  $s = [datetime]::Now
  1 .. 10 |
    % { sleep 1; ">$_" } |
    % { sleep 1; ">$_" } |
    % { sleep 1; ">{0} {1} " -f $_, ([datetime]::Now - $s).TotalSeconds }
を実行すると
  >>>1 3.1179897
  >>>2 6.1354357
  >>>3 9.1403334
  >>>4 12.1434852
と3秒間隔で結果が出るんで
  $s = [datetime]::Now
  threadedpipe @( { 1 .. 10 },
          { % { sleep 1; ">$_" } },
          { % { sleep 1; ">$_" } },
          { % { sleep 1; ">{0} {1} " -f $_, ([datetime]::Now - $using:s).TotalSeconds }})
みたいに書いて、最初が3秒目で1秒間隔で結果出力したい
いろいろ試して諦めたんだが、そもそもPowerShellではこういうfunctionは書けないの?
0450デフォルトの名無しさん2020/06/24(水) 22:06:24.12ID:VGKuFIs7
powershellのコマンドはプロセス作らないから無理じゃね
マルチスレッドをそんなお手軽に制御できたら夢みたいだけど
0452デフォルトの名無しさん2020/06/25(木) 00:40:28.26ID:BtDpxRK3
並列に動かすってことは普通にやれば1秒間隔じゃなくてほぼ同時に出力されることになる
どういう意図なのかはわからないけど無理やりやるんなら入力側で一秒ずつ待ってやるか

$sw = [Diagnostics.Stopwatch]::StartNew()

1..10
| % { ">$_"; sleep 1 }
| % -pa { sleep 1; ">$_" }
| % -pa { sleep 1; ">$_" }
| % { "{0} {1:F2} " -f $_, $sw.Elapsed.TotalSeconds }


もしくは出力側で一秒ずつ待ってやるか

1..10
| % -pa { sleep 1; ">$_" }
| % -pa { sleep 1; ">$_" }
| % { sleep 1; "{0} {1:F2} " -f $_, $sw.Elapsed.TotalSeconds }
0453デフォルトの名無しさん2020/06/25(木) 00:44:41.05ID:LTqYJW83
シェルスクリプトみたいに各プロセスが並列的に流れてくるテキストを処理して…
みたいのをやりたいのかなと推測してる
0454デフォルトの名無しさん2020/06/25(木) 08:46:34.24ID:L3VdfOGw
そうそうそういうこと
イメージとしては https://ja.wikipedia.org/wiki/命令パイプライン

パイプラインのステージごとに1スレッド起動して全データで使いまわしたい
4ステージのパイプラインなら4スレッドで動かす
ForEach-Object の -Parallel はデータごとにスレッドを起動するから別物
スレッドプールで使いまわすにしてもちょっと違う

ちなみに sleep させてるけど時間がかかる処理の代用ね
0455デフォルトの名無しさん2020/06/25(木) 08:53:56.13ID:L3VdfOGw
こっちの方がイメージが近いかも
https://ja.wikipedia.org/wiki/パイプ_(コンピュータ)
0457デフォルトの名無しさん2020/06/25(木) 09:50:30.28ID:L3VdfOGw
ワンライナーなんか関係ないんだけど

原理は >>416 にあるから、それを簡単に実現できるように
function threadedpipe { param([scriptblock[]] $sbs)
を書きたいと言ってる
0459デフォルトの名無しさん2020/06/25(木) 10:49:27.00ID:dZiolc11
>パイプラインのステージごとに1スレッド起動して全データで使いまわしたい
これが根本的に間違ってるだろ。
パイプで連結するってことは、前後(依存)関係があるってことで、それぞれをスレッド分割したところで全く意味がない。
0460デフォルトの名無しさん2020/06/25(木) 11:16:02.92ID:L3VdfOGw
何言ってんの?
パイプラインってものをわかってない
これスクリプトファイルにして試してみ

function recvdata { foreach ($i in 1 .. 10) { sleep 1; $i }}
filter mul10 { sleep 1; $_ * 10 }
filter add1 { sleep 1; $_ + 1 }
filter fmtresult { "{0} {1}" -f $_, ([datetime]::Now - $script:s).TotalSeconds }

"スレッドなし"
$s = [datetime]::Now
recvdata | mul10 | add1 | fmtresult

"ステージごとに別スレッド"
$s = [datetime]::Now
Start-ThreadJob {
  filter add1 { sleep 1; $_ + 1 }
  Start-ThreadJob {
    filter mul10 { sleep 1; $_ * 10 }
    Start-ThreadJob {
      function recvdata { foreach ($i in 1 .. 10) { sleep 1; $i }}
      recvdata
    } | Receive-Job -Wait -AutoRemoveJob | mul10
  } | Receive-Job -Wait -AutoRemoveJob | add1
} | Receive-Job -Wait -AutoRemoveJob | fmtresult
0462デフォルトの名無しさん2020/06/25(木) 11:41:54.06ID:L3VdfOGw
んだからfunction threadedpipeを作って見やすくしたいっつってんだろ
0464デフォルトの名無しさん2020/06/25(木) 13:13:44.27ID:sZY/v5D+
>>462
単に興味本位で聞くんだけど、差し支えなかったら教えて。
具体的にどんなデータをどんな状況で処理しようとしてるの?
0466デフォルトの名無しさん2020/06/25(木) 20:19:35.75ID:hxSOAVLp
>>462
繰り返しになるけどPSはunixシェルと仕組みが全然違うから厳しいと思う
パイプのバッファリングはどう仕組むつもりなの?
0467デフォルトの名無しさん2020/06/25(木) 21:11:04.72ID:L3VdfOGw
いまだにこんな見当違いを目にしてびっくり
試せるように >>460 を書いたのに試してないのかな
Start-ThreadJobが使えない環境なら、代わりにStart-Jobを使っても動くぞ
スレッドとジョブの起動速度差で少し遅いけどちゃんと動くから試してみろよ

というわけで、動作することはちゃんと確認できてる
俺が聞いたのは、>>460 みたいにごちゃごちゃ書くのが面倒だから
threadedpipe @({recvdata}, {mul10}, {add1}, {fmtresult})
のように書けるような function threadedpipe が作れるかどうかなの
まあ制約付きで一応できたんだけど
04684202020/06/25(木) 23:05:56.80ID:ZIjS4UcO
とりとめもなく、推敲もなく適当に書き散らかしてごめんなさい
レスありがとうございます

理解して、Powershell組むのはかなり困難そうなので
Myコピペライブラリでも作って、理解しないでも組めるような
体制を作っていこうと思います

ありがとうございました。


ちなみにファイル作成は >>で用は足りました
0470デフォルトの名無しさん2020/06/26(金) 01:13:06.63ID:UcUHbC3j
質問者より明らかにレベル低いのにイチャモンだけは一流だな
だまってろよお前は
0471デフォルトの名無しさん2020/06/26(金) 05:47:21.88ID:ZKLfm8jC
>>466
> パイプのバッファリングはどう仕組むつもりなの?
普通にFIFOを実装するだけだろ
何が難しいと思ってるんだ?
0473デフォルトの名無しさん2020/06/26(金) 07:02:56.31ID:rwBI62Tc
ここがどうだとかじゃなくて、
汚いとかって言い方傷つくだろうが
0474デフォルトの名無しさん2020/06/26(金) 10:47:41.63ID:lJi08xny
>>449
こんな感じ?
ただ動くだけのサンプル。エラー処理とかオブジェクトの後始末とか何もしていない。

function Invoke-ThreadedPipeline([ScriptBlock[]] $ScriptBlock) {
 $p = $ScriptBlock | % {
  $p = [RunspaceFactory]::CreateRunspace().CreatePipeline()
  $p.Commands.AddScript($_)
  $p.Runspace.Open(); $p.InvokeAsync()
  $p
 }
 
 while ($p = @($p | ? {-not $_.Output.EndOfPipeline})) {
  $i = [Threading.WaitHandle]::WaitAny(($p | % {$_.Output.WaitHandle}))
  $o = $p[$i].Output.Read($p[$i].Output.Count)
  if ($i -lt $p.Length - 1) {
   $null = $p[$i + 1].Input.Write($o, $true)
   if ($p[$i].Output.EndOfPipeline) {$p[$i + 1].Input.Close()}
  }
  else {
   $o
  }
 }
}

$o = Get-Date
Invoke-ThreadedPipeline (
 {1..10},
 {process {Start-Sleep 1; ">$_"}},
 {process {Start-Sleep 1; ">$_"}},
 {process {Start-Sleep 1; ">$_"}}
) | % {'{0} : {1}' -f $_, (New-TimeSpan $o).TotalSeconds}
04754742020/06/26(金) 10:49:06.76ID:lJi08xny
スクリプトブロックのバインドとか、スコープとか、面倒な問題は見ないふり。
そもそも、PowerShell のスコープはスレッドセーフにはできていないので、
問題に対処するのは、ほとんど不可能なのかも。
0476デフォルトの名無しさん2020/06/26(金) 12:23:31.85ID:hzH3p+iw
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

PS malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0477デフォルトの名無しさん2020/07/05(日) 04:12:29.94ID:sb7IOZLx
教えてください。

powershell.exeに
"powershell.exe"が見つかりません。名前を正しく入力したかどうかを確認してから、やり直してください。
ってダイアログが出て怒られるのだが、
これってどういうことですか?
0478デフォルトの名無しさん2020/07/05(日) 08:19:48.13ID:EbIp5fqD
>>477
単なるウケ狙いなら別だけど、本気でなんとかしたいのならば、
前後の経緯を含めて詳細に説明してもらわないとなんとも言えない
0479デフォルトの名無しさん2020/07/05(日) 09:06:15.18ID:sb7IOZLx
そうですねすみません。

Python3.6、Bazel 2.0.0、MSYS2、Visual C++ Build Tools 2019、WMF5.1、
CUDA toolkit 10.1、cuDNN 7.6を入れて、Tensorflow 2.2をビルド。
x64 Native Tools Command Prompt for VS 2019から、bazel buildでビルド中に、
「powershell.exeが見つかりません。〜」のダイアログが出る。ダイアログの左上はpowershell.exe。
放置すると最大4個出てビルトが一時停止するが、ダイアログの「OK」で閉じると再開する。しばらくすると、また出る。

PCは、
OS:Windows7pro sp1 x64
CPU:Core2Quad Q9550
GPU:Geforce GTX1650super
MEM:8G
0481デフォルトの名無しさん2020/07/06(月) 15:26:47.18ID:ENMHKR++
powershell.exeが見つからない。
だからこそ、poweshell.exeが見つからなくてはと思っている。
0483デフォルトの名無しさん2020/07/06(月) 19:14:17.53ID:mGwQnOrU
PATHが通ってないんじゃないの
サポート切れのWindows7を使い続けてて大丈夫か
0485デフォルトの名無しさん2020/07/06(月) 20:54:49.43ID:zdAH+P0d
win7だって(自分で削除しなけりゃ)普通にpathは通っているはずだけど
まあ確かめてみることだね
0486デフォルトの名無しさん2020/07/06(月) 20:56:13.29ID:0H1iFJXS
ダイアログが出てる時にタスクの中にpowershell.exeがいませんでした。
誰が出しているのか追いかけてみます。
お騒がせしました。
0488デフォルトの名無しさん2020/07/07(火) 12:27:32.25ID:Csl+eNq2
Windows 10 なら、コマンドプロンプトで、
where powershell
と入力すると、

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
0489デフォルトの名無しさん2020/07/07(火) 21:09:26.46ID:IcFS4Epu
whereは10だけじゃなくて7にも標準搭載されてる
98や2000ならリソースキットに含まれてる
0490デフォルトの名無しさん2020/07/11(土) 09:02:38.89ID:n9XGFFVi
NuGetパッケージ使いたい時ってどうすれば使えんの
例えばSeleniumを使いたい場合C#なら
dotnet add package Selenium.WebDriver
これで使えるようになるけどPSの場合はどうすれば
0493デフォルトの名無しさん2020/07/24(金) 01:22:35.38ID:r0N61jeX
明治の「 おいしい牛乳 」ってあるけど
「 おいしい 」って自分で付けちゃうなんて
強気というかふてぶてしいよな?

「 PowerShell 」からも同じにおいがするぜ
0499デフォルトの名無しさん2020/08/05(水) 12:02:30.42ID:gYncIR+S
>>131 >>132
pwshw
普通のコンソールアプリだとリンクオプション変えるだけでできる気がするが
何が長引いとるんや?
windows以外にも対応するのが大変なんかな
0500デフォルトの名無しさん2020/08/13(木) 17:41:10.43ID:e4hfVbk2
ある値で、とあるファイルをgrep検索かけて
grepで引っかかったら 変数に0、grepで引っかからなかったら変数に1
ということをしたいのですが、どんな方法で実現できますでしょうか。

linux でいうとこういうものです

# cat hoge.txt | grep abc ←知りたいのはここ相当のもの
# echo $?
0 ←abcが引っかかった
#

# cat hoge.txt | grep abc ←知りたいのはここ相当のもの
# echo $?
1 ←abcが引っかからなかった
#

よろしくお願いいたします。
0501デフォルトの名無しさん2020/08/13(木) 18:00:29.06ID:3scCogHG
$r = gc hoge.txt | sls abc
if ($r -ne $null) {
# 引っかかった & $rにはslsの結果
} else {
# 引っかからない
}
0502デフォルトの名無しさん2020/08/13(木) 18:07:53.30ID:e4hfVbk2
>>501
ありがとうございます!ばっちりです。

追加で申し訳ないんですけど、これを変数をgrep対象にして
戻り値を取得する事ってできますでしょうか?

> Write-Output $hoge
aaa ←こんな感じで複数行はいってる変数
bbb
ccc
ddd
eee
ffff
0504デフォルトの名無しさん2020/08/13(木) 19:18:09.12ID:rGVB7rFL
(cat hoge.txt) -as [string] -cmatch "abc"

とか?
TrueFalseになっちゃうけど
0505デフォルトの名無しさん2020/08/13(木) 20:45:21.78ID:hEr1UF+A
ふつーはifに直接つっこむ
if (Select-String abc hoge.txt -CaseSensitive -Quiet) {
if ($hoge | Select-String abc -CaseSensitive -Quiet) {
0506デフォルトの名無しさん2020/08/13(木) 21:13:55.51ID:takIe+yE
個人的には>>504のTrueFalse管理が好きかな
01なら簡単に変換出来るし
$r = (cat hoge.txt) -as [string] -cmatch "abc";
[int]!$r;
0508デフォルトの名無しさん2020/08/14(金) 05:21:16.78ID:SCMnTycc
漏れは、Windows 10, WSL, Ubuntu 18.04 を入れているから、
grep は、Linux 側でやるか、Ruby などを使う

Windows側のPowerShell などでは、やらない。
複雑なスクリプトは、Linux側のRubyでやる
0509デフォルトの名無しさん2020/08/14(金) 07:16:55.02ID:fFUBtJk9
>>501
gcの結果って配列でしたっけ?
配列の$nullとの比較の場合、nullを左辺にしないといけないんじゃなかったでしたっけ?
もうpowershell側で修正されてるかな
0511デフォルトの名無しさん2020/08/14(金) 23:17:26.92ID:SCMnTycc
>>502
Linux のgrep なら、

AND 検索、パイプで
grep -i 単語1 ./* | grep -i 単語2

OR 検索、-e で
grep -i -e 単語1 -e 単語2 ./*

途中で改行しても、同じ
grep -i "単語1
単語2" ./*
0512デフォルトの名無しさん2020/08/15(土) 16:13:38.92ID:qyy6aN9C
>>509
-eqの配列フィルタのことだと思うけどgcやslsは$nullを含む配列は返さないから問題ない
0514デフォルトの名無しさん2020/08/25(火) 20:56:27.18ID:+ct4ya2Y
GitHubのPreviewとどう違うのかと思ったら、アイコンが違うな
なんか気持ち悪い色になってる
0515デフォルトの名無しさん2020/08/25(火) 22:59:28.31ID:SeBJUZXv
powershellスクリプトで高DPI対応をしたいのですが、可能でしょうか?
やりたい事は高DPI環境で画面キャプチャを取ることですが、
スケーリングに応じて実際の解像度より小さい値が画面サイズとして返ってきてしまいます。
SetProcessDPIAware()を最初に呼んでも効果がありませんでした。
普通のアプリのようにEXEにmanifestファイルを埋め込むこともできないので無理でしょうか?
0516デフォルトの名無しさん2020/08/29(土) 13:02:51.79ID:z6uRv8YY
使ってるエクセルアドインのアプデが不定期に入るんだけど、
その時はエクセルを閉じなきゃいけないので、エクセルVBAでアプデ処理できない
なのでVBSでセンドキーしてたんだけど、APIなら画面ロック状態でもOKと
でも素のVBSでAPIを使うには、エクセルを呼び出すと(エクセル4マクロ)

お、パワーシェルはAPIが使えるスクリプトか、やっと使う時が来た
ググると MessageBox のサンプルはあるものの、肝心の FindWindow と PostMessage のサンプルがない
MessageBox なんかどんなバッチで使うんだと
適当に書いてみたら、しれっとウィンドウハンドル0で沈黙
ググったら、管理権限がどうとかいう話もあり、それ以上は調べてないけどハマり警戒で断念
その話がほんとだとすると、サードパーティー製のアドインを起動してる標準ユーザーに管理権限を持たせるわけにいかない(スパイ警戒)

お、ワードにもVBAあるじゃんかで普通に解決w
VBA最強w
バッチはVBAとDOSが安定
ドキュメントを持たないVBAのみのスクリプト、「VBAS」をリリースした方が良かったんじゃないかね
(パスワードの暗号化だけパワーシェル使ってるが)
もっと言うと、VBAでドットネットコンポーネントを呼べるようにするとか(呼べる?)

んでパワーシェルはわざわざ長い名前のドットネットコンポーネントを呼び出してセンドキーのサンプルばかり
センドキーならVBAでもVBSでもいいじゃんていう
名前も短いし
0517デフォルトの名無しさん2020/08/29(土) 13:37:55.53ID:z6uRv8YY
関係ないけどアクセス権て、最重要が情報漏洩、つまり読み取り権限であって、インストール権限なんかどうでもいいんだよな
ソフトなんか他社製だし秘密でもなんでもない
壊れても、再インストールするだけ
0518デフォルトの名無しさん2020/08/29(土) 13:53:57.66ID:z6uRv8YY
ていうか WindowsUpdate や OfficeUpdate がまさにその考え方だよね
最新化は自動であるべきで権限は不要

Officeのアドインもそうあるべき
初回だけ許可が必要で、アプデは自動
0519デフォルトの名無しさん2020/08/29(土) 16:26:04.73ID:BYm68LqT
ID:z6uRv8YY
スレ住民に言いたいこと・聞きたいことがあるのであれば、もう少し簡潔に書いてもらえませんか?
あと、2〜3行ならともかく >>516 ぐらいのボリュームで書くなら、読点だけじゃなく句点も省略しないほうが良いですよね。正直、読みづらい。
申し訳ないのですが、斜め読みすら断念しました。
0520デフォルトの名無しさん2020/08/29(土) 17:29:18.45ID:uW7NzDft
>>519
読む必要ないよ
PS腐してVBAマンセーしてるだけ
セキュリティの基本も知らず、rwxのxなんて無意味って宣ってる
0521デフォルトの名無しさん2020/08/29(土) 21:29:35.58ID:2f/XylsB
スタートメニューを右クリックしたら、
一般ユーザー用・管理者用の、2種類のPowerShell がある

コードも管理者用では、ExecutionPolicy だったか忘れたけど、特別な書き方がある
0522デフォルトの名無しさん2020/08/30(日) 10:18:34.85ID:j2JU6h3h
>>520
セキュリティの基本が分かってないのはマイクロソフト
マイクロソフトはメーカーだからシステムを守ることをセキュリティと勘違いしてる

守るべきはユーザーの持つ秘密情報

プログラムが改変されようとも、最終的にそのユーザーコンテキストで読めてはいけないデータにアクセスできなければよい
プログラムは壊れても再インストールできるが、情報漏洩は回復できない
0523デフォルトの名無しさん2020/08/30(日) 10:21:08.45ID:j2JU6h3h
相変わらず、無内容の人格攻撃文化
腐ってんね
0524デフォルトの名無しさん2020/08/30(日) 11:22:28.54ID:roK+ZKVb
>>522
「MS は基本がなってない!MS よりも、俺のほうが正しいぞ!」
で、あなた様はどんなバックグラウンドを持つお方で、これまでどんなことを成してきた方なのですか?
0525デフォルトの名無しさん2020/08/30(日) 11:25:22.99ID:6EFwsuE9
>>523
自分の無理解を棚上げしてスレ違いでむやみにあちこち叩くの辞めた方が良いよ
人に教えを請う立場の書き込みにはとても見えない
PSスクリプトの実行に必要なのは監理者権限ではなく適切な実行ポリシーの設定
これだけ教えてあげたんだからもうここには書き込まず一人で調べてね
0529デフォルトの名無しさん2020/08/30(日) 17:34:08.47ID:6ShNfOXb
>>521
管理者権限じゃないと実行出来ないコマンドを使う時用くらいの認識しかなかったわ
0530デフォルトの名無しさん2020/08/30(日) 21:51:36.19ID:g5q4aE3p
Microsoftは「製品の問題点」と「仕様」を最初に明確にするので、それも批判されてたよね。

Linuxの場合、サポートを提供するベンダーで「バグと仕様を明確にできる」のはRedhatくらい。
その他のベンダーは明確にすることが出来ない。
Kernel作ってるのは他人だから。

「仕様として今後も維持される動作」か「バグとして修正される動作」か即座に知ることが出来るのは、待たずに作業を続けられるので、とても良いことのように感じるけど、実際は批判が多い。
0531デフォルトの名無しさん2020/08/31(月) 01:56:18.43ID:Sr2UUXBk
ついに公務員の副業が解禁される時代が到来した
https://hybridstyle.net/side-job065/
フリーランス市場規模が20兆円を突破 -副業は8兆円-
https://hybridstyle.net/work-style020/
時代は週休3日制へ【週休3日制導入企業まとめ】
https://hybridstyle.net/work-style016/
会社員の副業が急増、副業フリーランス4年で3倍、経済規模は約8兆円??副業収入は平均74万円
https://www.businessinsider.jp/post-165077#cxrecs_s
本業のストレス解消、副業で月70万、転職のお試し…会社に内緒で副業する人たちの本音
https://www.businessinsider.jp/post-176835#cxrecs_s
どんな仕事でいくら稼いでいる? 副業をしている13人に聞いたそのリアル
https://www.businessinsider.jp/post-180772#cxrecs_s
会社が個人を縛り付ける時代は終わった。これからは、個人が仕事を求めて、チャンネルのように会社を切り替えていく。
https://www.wantedly.com/companies/newpeace/post_articles/65530
誰も教えてくれなかった「フリーランスは厳しい」ではなく「甘い」という真実。
https://www.wantedly.com/companies/newpeace/post_articles/54124
【特集】年収1000万円以上「フリーランスの流儀」vol.2
https://tabi-labo.com/286733/journey-six-figure-freelance-nathan
「排出物ゼロ、廃棄物ゼロ、貧困ゼロ」究極のエコ・リゾートがフィリピンに
https://tabi-labo.com/284193/nautilus-eco-resort
仕事は9割外注すれば売り上げが爆増する
https://headlines.yahoo.co.jp/article?a=20190416-00028392-president-bus_all
0532デフォルトの名無しさん2020/09/01(火) 22:23:09.69ID:cXm81OcM
>>525
だって教えを請う立場じゃないから
それはそっちの勝手な思い込み
「普通に解決w」と言ってる通り、文字通り
出来事の感想を述べただけ
0533デフォルトの名無しさん2020/09/01(火) 22:34:51.67ID:mz7Z6faK
>>532
「MS は基本がなってない!MS よりも、俺のほうが正しいぞ!」
の次は
「俺は教えを請う立場じゃない」
ですか。Ruby厨に次次ぐ逸材が登場ですね。

で、あなた様はどんなバックグラウンドを持つお方で、これまでどんなことを成してきた方なのですか?
0535デフォルトの名無しさん2020/09/01(火) 23:15:36.13ID:cXm81OcM
>>524
ところで
建物でいうと、プログラムは家電等の快適装備
ユーザー情報は金庫

A.家電の設置
B.金庫の開錠

どっちがセキュリティレベル上かね?
どうも(MSというより)メーカーは、Aを最高権限と考えてる様子
(コンピューターでは物理的に、金庫機能も家電の1つに過ぎないからだろうけど)

ボタンをユーザーが押したからなんなのか
コンビニの年齢確認と同じで、何を確認したのか
ダイアログでベンダーを確認したか?
リアルな名称のダイアログなんか簡単に作れる(続く)
0536デフォルトの名無しさん2020/09/01(火) 23:15:52.09ID:cXm81OcM
>>524
(続き)
たとえ本物でも、ベンダーに悪意がないことをどうやって確認するのか
まして国が株価操縦してるモラル破壊な社会、大企業だからって信用できない
そこで

A.保護ユーザー(管理者)
B.実行ユーザー(標準)

こう分け、Bでベンダーソフトを実行すれば、Aの機密情報を読めない
と思いきや、アプデ時に昇格ボタンを押してしまうと、なんでも読める権限で実行される
ボタンをユーザーが押そうがバッチで押そうが同じ
全くセキュリティになってない

ならば、あえてBを管理者にし、B自身のコンテキストでアプデさせる
Aのフォルダから「Administrators」を外しておけば、
インストール権限がありながら、Aの機密情報を読めない、はず
(この時、所有権や偽装でUACが反応しない状態なら、
その特権からも「Administrators」を外し、かわりにAを設定しておく)
0537デフォルトの名無しさん2020/09/01(火) 23:16:32.08ID:cXm81OcM
>>524
くしくも偶然一部を書いてたが
http://mevius.5ch.net/test/read.cgi/tech/1451927425/876-877
さらに言うと、複数の権限があり、ケルベロスによってサーバー機能による高速取込までユーザーコンテキストを通したシステム
ユーザー問合せに即時対応するため、操作ログも一元管理される
操作ログは全ユーザーに追加権限だけがあり、閲覧はシステム権限が必要
アクセス権はテーブル自身にあり、どのようなルートからも突破不可能
行政手続に係る深いプライバシーを大量に扱うので、情報漏洩が命取りになる企業

しかし、そういう別件逮捕のようなことを、「人格攻撃」と言う
別件が議論に関係してはならない
それにプライバシー侵害は「誹謗中傷」の要件の一つ
@嘘(無根拠な憶測)、Aプライバシーの侵害、B人格攻撃、「誹謗中傷」の3要件を全部兼ね備えるというw

で、お前は何をしたのか
こっちは人格攻撃気質じゃないので、当然興味ないが
0538デフォルトの名無しさん2020/09/01(火) 23:29:07.92ID:XzhpNrm1
>>535
下手な例えをだすのは無理解の証
>>536
昇格ボタン押せる時点で既に怪しい
まともな運用してたら昇格ボタン押すのに監理者のアカウントが必要
例え昇格ボタンを押しても読み取り権限が得られるとは限らない
これもまともな運用してたら所有者にしか読み取り権限は得られない
つまりユーザーフォルダ内は当該ユーザーしか読み取れないのがまともな運用

結局無理解由来の誤解なわけで、まさに>>527
0539デフォルトの名無しさん2020/09/04(金) 06:56:56.59ID:BT/SeEq8
客先も何も自社もポリシー変更できないからバッチは実行できないわ
簡単なファイル操作とかも.batでやることになってる
Powershellに移行できない
0540デフォルトの名無しさん2020/09/04(金) 08:30:44.47ID:PFscGLUJ
ps1をポリシー付きで呼び出す1行バッチを書けばいいんじゃない?
冗長だけどbatをメンテするのに比べたらずっといいと思う
0542デフォルトの名無しさん2020/09/04(金) 10:38:48.17ID:HOWqt3vZ
>>539
まともな情シスを抱えていて、かつ運用ルールが徹底している会社なら、
きちんと申請すれば大丈夫なように思えるけど。
0543デフォルトの名無しさん2020/09/04(金) 10:55:49.00ID:9bn0no2k
Powershellってマイクロソフト提供のスクリプトですら証明書の期限切れがあるからちょっと不安になる
0545デフォルトの名無しさん2020/09/04(金) 17:55:32.72ID:pFNwt9H1
まぁそれはそうなんだけど10年後にいきなり動かなくなると軽くパニックになるのは容易に想像できる
って言うか何件か証明書切れを経験すると不安になるのも理解できる
0546デフォルトの名無しさん2020/09/04(金) 21:29:53.57ID:GUj1t4WA
MSの怖いところはいつサポートを切られても文句が言えないんだよな
よくそんなもん使うよ
0547デフォルトの名無しさん2020/09/04(金) 22:08:14.36ID:r9WlhdFA
vbsなんてもうサポートされてないけどドメインのログオンスクリプトでいまだに大活躍ですよ
0551デフォルトの名無しさん2020/09/04(金) 23:13:47.33ID:pFNwt9H1
サポートガーとか言い出したらすべてのソフトメーカーも同じだしMSはサポート期間を明示してる分マシな方
0553デフォルトの名無しさん2020/09/05(土) 01:11:02.97ID:F930ZZ+s
しかもMSは予告したサポート期間切れたようなのでも
なんだかんだズルズルと最低限のサポートはしよるしな
0554デフォルトの名無しさん2020/09/05(土) 09:05:47.68ID:Z+0szYX9
オープンソースでも、誰もメンテしなくなったらサポート切れたと同じになるけどな
0556デフォルトの名無しさん2020/09/05(土) 14:23:09.94ID:NgOfEUV/
VB6のサポートって切れたんではないの?
でも実際にWin10でもそれなりに動くってことは
相当配慮してるんだろうね
0557デフォルトの名無しさん2020/09/05(土) 14:38:02.26ID:poolRPMo
>>556
> VB6のサポートって切れたんではないの?
IDEの話と混同してないか?

Microsoft は、Windows Vista、Windows Server 2008 (R2 を含む)、Windows 7、Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、Windows 8.x、および Windows 10 上で実行される既存の Visual Basic 6.0 アプリケーションをサポートすることにコミットしています。
https://docs.microsoft.com/ja-jp/lifecycle/faq/developer-tools#what-lifecycle-policy-does-visual-basic-60-follow
05595562020/09/06(日) 12:44:28.70ID:K+uwWPzG
>>557-558
ああ、そうなのか。
どうりでうちの開発現場でエラーが出まくってるのに
無理やりIDEをインストールしてた訳だわ。
当然まともに動かなくてソース見る用になってたがw
0561デフォルトの名無しさん2020/09/07(月) 10:29:11.62ID:LrNxLO4b
教えてください!
数学関数よく使うので、[math]打たなくていい方法ありませんか?
pythonだと
from hoge import *みたいなやつです。
usingの使い方はよく分かりませんでした…
0562デフォルトの名無しさん2020/09/08(火) 13:39:15.42ID:Czt9vV5Q
RubyってNGした方がいいの?
0564デフォルトの名無しさん2020/09/08(火) 21:32:03.60ID:gglleEZ2
>>561
クラス名なので省略出来ない
$m = [System.Math];
$m::PI;
でちょびっとだけ短くなるけど
0567デフォルトの名無しさん2020/09/09(水) 21:07:17.97ID:Mz5kQg8j
System.Mathを表すTypeクラスのインスタンス
C#のtypeof(System.Math)に相当する
0568デフォルトの名無しさん2020/09/09(水) 23:13:42.66ID:COY4N7BF
>>567
ありがとうございます
インスタンスとして受け取ったからstaticメンバーは参照できるのか
何でもありだな
0569デフォルトの名無しさん2020/09/10(木) 18:44:59.29ID:tjN1C/3z
Typeクラスのインスタンスが特定のクラスとして振る舞うのか。
オブジェクト志向のメタ構造というか自己言及的というか、
頭の悪い俺はクラクラしてくる。
0570デフォルトの名無しさん2020/09/10(木) 21:10:45.59ID:Cm2gzsSs
"".GetType()::IsNullOrEmpty("foo") なんてものもちゃんと動く
わざわざこんな書き方するメリットは知らん
0571デフォルトの名無しさん2020/09/11(金) 22:50:14.76ID:7Cy3Hp6X
Type型クラスがクラスとして振る舞うんじゃない
静的メンバ演算子(::)がRuntimeType型の値と文字列値を取って、静的メンバを返す

だから
$parent = [System.Math];
$child = "E";
$parent::$child;
はちゃんと評価される
0572デフォルトの名無しさん2020/09/13(日) 12:34:16.51ID:pT8kzvft
whileの条件式がうまく動かないので教えてください。

Test-NetConnectionでサーバのポートが開いているかチェックして
開いていなかったら、開くまで待つ処理をしたいのですが、
なぜかWhileループに入ってくれません。
条件を$result -ne "True"にすればうまく動くのですが、なぜFalseの条件だと動かないのでしょうか

あとTest-NetConnectionでポート開いていないときにWARNINGメッセージが表示されるのですが
これって表示抑止できませんか?

コード

$ProgressPreference="SilentlyContinue"
$ErrorActionPreference = "silentlycontinue"
$server = "127.0.0.1"

$result = Test-NetConnection $server -port 22 -InformationLevel Quiet

while ($result -eq "False") {
Write-Output "OFF"
$result = Test-NetConnection $server -port 22 -InformationLevel Quiet
}

write-host "kaishi"
0573デフォルトの名無しさん2020/09/13(日) 12:53:42.29ID:NB1HNIe8
Booleanと文字列を比較してるからかなぁ
while ($result -eq $false) {
にするとか
while ($result.ToString() -eq "False") {
にするとか
0575デフォルトの名無しさん2020/09/13(日) 13:03:07.97ID:pT8kzvft
while ($result -eq $false) {
でうまく動きましたー!ありがとうございました

trueは文字列比較で動くのにfalseはダメなのは不思議です。
0576デフォルトの名無しさん2020/09/13(日) 13:10:32.29ID:NB1HNIe8
trueの場合には-neにしてたから、動いてる様に見えただけなんじゃね?
0580デフォルトの名無しさん2020/09/13(日) 23:32:26.16ID:NpK7vu/k
>>579
こういう風には使えないんだね。残念。

get-childitem C:\Windows | select fullname, length/1KB
05825802020/09/14(月) 15:59:14.68ID:O60yV8/t
>>581
( ;゚Д゚)マジカ…
0585デフォルトの名無しさん2020/09/15(火) 17:44:30.49ID:vvfuKi+i
会社のパソコンでvscodeでのスクリプト作成
しようとしているのですが
下記問題に当たって苦しんでいます。
助言ください

1.vscodeのextentionのインストールができない。
→会社ネットワークは認証付きプロキシ環境なのでその設定が必要ぽいが設定してもダメ、とりあえずファイルを個別にインストールして対処

2.powershellデバッグしようとすると、初めて使うモジュールの分析をしています。と表示されて進まない
対象モジュールはpackagemanegement.psm1 1.4.7
これもプロキシの問題でインストールに苦労しました。
0586デフォルトの名無しさん2020/09/15(火) 17:51:28.05ID:7Yffzl/8
>>585
認証付きプロキシでも普通に使えてるけど…って思ったらいくつもissue上がってるし、こっちの環境でも「XHR failed」ってエラーになるな
0588デフォルトの名無しさん2020/09/25(金) 01:41:03.68ID:hFZS0B6G
ヒアドキュメントの変数使う時に変数を前方参照(後方参照?)したいんですが、
できませんかね

# スクリプトの頭の方で参照したい
$heredoc

# ヒアドキュメントはスクリプトの後ろにまとめたい
$heredoc = @`
abc
`@
0591デフォルトの名無しさん2020/09/25(金) 22:07:41.04ID:hFZS0B6G
UNIX系のシェルの仕様見ても前方参照できるようなことは書いてなありませんでした
だめっぽいですね
一旦ファイルとして後ろまで読むみたいなアクロパティックな方法しかなさそう
0592デフォルトの名無しさん2020/09/25(金) 22:15:02.42ID:5mEzuFCz
自分自身をファイルオープンして末尾を読み出すとか。
昔、自分自身を解凍するシェルスクリプトがUNIX系アプリのインストーラとしてよく使われてたよね
0594デフォルトの名無しさん2020/09/25(金) 23:45:08.08ID:BU0fUt+3
処理をスクリプトブロックや関数の中に入れてもいいなら

$f = {
echo $heredoc
}

$heredoc = @`
abc
`@
. $f
0595デフォルトの名無しさん2020/09/26(土) 22:07:47.79ID:BjfAYIo4
わけがわからん現象にでくわした
シンボリックリンク作成権限を付けたユーザーなんだけど

New-Item -Type Directory -Name dir
New-Item -Type SymbolicLink -Name sym -Target dir

これを管理者で実行すると SYMLINKD になるんだけど
管理者にならずに実行すると SYMLINK になるのはどういうこと?
0596デフォルトの名無しさん2020/09/27(日) 09:30:31.69ID:HvAokpg1
chcp 65001
をやっても画面のユニコード文字列が文字化けするのはなんで?
0599デフォルトの名無しさん2020/09/27(日) 12:01:00.23ID:45wzgCn0
Windows Terminalは絵文字とかもちゃんと表示できるらしい、使ってないけど
0600デフォルトの名無しさん2020/09/27(日) 16:37:33.79ID:zpUujZFe
管理者にならずに New-Item でフォルダーへのシンボリックリンクを張ると
SYMLINKD でなく SYMLINK ができるという >>595 なんだが
PowerShell を C:\Users\ユーザー で起動した場合だけ起こるっぽい
Windows PowerShell では起きないし、起動フォルダーを変えても起きない
なんだこれ?
0601デフォルトの名無しさん2020/09/27(日) 18:25:49.52ID:4AaMSaam
>>600
うちの環境 (Win10 2004) だと以下の通り。いずれもシンボリックリンク作成権限を与えた一般ユーザ。

PowerShell 5.0
開始ディレクトリに関わらず、再現せず

PowerShell 7.0.3
開始ディレクトリに関わらず、再現する

よく分からんね。
0602デフォルトの名無しさん2020/09/27(日) 21:02:03.10ID:qVXRXcgH
昔からpsのアクセス権周辺の実装は怪しいと思ってる
専用コマンド呼ぶなり.NET呼ぶなりした方がいいよ
0603デフォルトの名無しさん2020/09/27(日) 22:00:17.33ID:zpUujZFe
なぜうち(Win10 1909 18363.1082)では起動フォルダーで挙動が変わるんだろう

C:\Users\ユーザー で起動した PowerShell 7.0.3 だと、どこで New-Item しても発生する
その PowerShell で、さらに PowerShell を起動すると
C:\Users\ユーザー で起動した場合は、どこで New-Item しても発生する
別のフォルダーで起動した場合は、どこで New-Item しても問題ない

こうなる理由が予想もできない
0604デフォルトの名無しさん2020/09/27(日) 23:03:00.71ID:zpUujZFe
あーごめん
管理者でも C:\Users\ユーザー で起動したら発生した
管理者になるかどうかは関係なかった
理由はさっぱりだが……
0605デフォルトの名無しさん2020/09/28(月) 10:27:40.26ID:6RK1A/yN
>>601 >>604
もしかすると、

1. ターゲットをフルパスで指定する
2. ターゲットの相対パスを「.\\」か「./」で始まる形式で指定する
3. New-Item の直前に [Environment]::CurrentDirectory = Get-Location を実行する

のどれかを試すと、PowerShell 7 でも問題は起こらなかったり?
0606デフォルトの名無しさん2020/09/28(月) 20:33:13.25ID:1OU6a08X
試した

1 〇 (でも張りたいのは相対パスのリンク)
2 ×
3 〇

[Environment]::CurrentDirectory を基準にターゲットのフルパスを求めて
フォルダーだったら SYMLINKD 、それ以外は SYMLINK を作ってるっぽい
# >>603 を書く時 C:\Users\ユーザー では試してなかった……。

カレントディレクトリを移動しても [Environment]::CurrentDirectory は変わらない
となると悪いのは
カレントディレクトリを返さない [Environment]::CurrentDirectory ?
それとも [Environment]::CurrentDirectory を参照する New-Item ?
0607デフォルトの名無しさん2020/09/29(火) 11:44:19.44ID:xkYzZNyK
>>606
ごめん。ソースの履歴を見たら、v7.0.3 のときは、2. の方法は無意味だったみたい。
v7.0.3 の実装は、>>606 さんの想像のとおり。

そもそも、ターゲットの相対パスを解決するときの基準は、カレントのパスではなくて、
シンボリックリンクそのもののパスだよね。
なので、プロセスのカレントディレクトリ([Environment]::CurrentDirectory)の代わりに、
PowerShell のカレントロケーション($PWD)を基準にしたとしても、やっぱりバグる。
New-Item -Type Symbolic -Name Foo\Bar -Target .\Zot みたいなケースとか。

でね。最新のソースには、相対パスのターゲットのための修正が施されているのだけれど、
これが、「.\」か「./」で始まるパスのときは、基準にカレントロケーションを使う、
という中途半端かつ誤ったもので...。
0608デフォルトの名無しさん2020/09/29(火) 20:49:56.27ID:J7wCjMtV
常に リンクのフルパス → ターゲットのフルパス とたどるだけなのに……w
早く修正されますように
0609デフォルトの名無しさん2020/09/30(水) 08:50:32.18ID:6kAerFE6
[Environment]::CurrentDirectoryや[IO.Directory]::GetCurrentDirectory()の罠
他のモジュールも同じ問題を抱えてないか心配になる
0610デフォルトの名無しさん2020/10/01(木) 10:19:36.95ID:tnCBqate
New-Itemはハードリンクもバグってる
こっちはWindows以外のOSでも問題になるはず

New-Item -Type Directory -Name linktest
New-Item -Name linktest\target
New-Item -type HardLink -Name linktest\hardlink -Target linktest\target

に対して、こんなメッセージでエラーになってしまう

New-Item: Could not find item linktest\target.

興味深いのは

New-Item -Type HardLink -Name linktest\hardlink -Target target

と間違えてみると

New-Item: Cannot find path 'カレントディレクトリ\target' because it does not exist.

ちゃんと正しいエラーメッセージが返る
不思議だ
0611デフォルトの名無しさん2020/10/01(木) 21:05:38.94ID:NSqrZd61
>>610
>New-Item -type HardLink -Name linktest\hardlink -Target linktest\target

5.1と7.0.3で試したけどエラーにならなかったぞ
0612デフォルトの名無しさん2020/10/01(木) 21:26:37.01ID:tnCBqate
これでどう? (長すぎて切れるかも)

$origCurDir = [System.Environment]::CurrentDirectory
New-Item -ItemType Directory -Path linktest

Push-Location linktest
New-Item -ItemType Directory -Path dir

Push-Location dir # linktest/dir
New-Item -ItemType Directory -Path subdir
Set-Content -Path file -Value "hello"
New-Item -ItemType HardLink -Path hardlink_1 -Value file
New-Item -ItemType SymbolicLink -Path symlink_1 -Value subdir

Pop-Location # linktest
New-Item -ItemType HardLink -Path dir/hardlink_2 -Value dir/file
New-Item -ItemType SymbolicLink -Path dir/symlink_2 -Value subdir

Push-Location dir # linktest/dir
[System.Environment]::CurrentDirectory = $PWD
New-Item -ItemType HardLink -Path hardlink_3 -Value file
New-Item -ItemType SymbolicLink -Path symlink_3 -Value subdir

Pop-Location # linktest
[System.Environment]::CurrentDirectory = $PWD
New-Item -ItemType HardLink -Path dir/hardlink_4 -Value dir/file
New-Item -ItemType SymbolicLink -Path dir/symlink_4 -Value subdir

Pop-Location
[System.Environment]::CurrentDirectory = $origCurDir

Get-ChildItem -Path linktest/dir | Sort-Object -Property CreationTime | Format-Table Attributes,LinkType,Target,Length,Name
0614デフォルトの名無しさん2020/10/02(金) 13:57:48.64ID:w3BWfVBY
>>613
これを思い出した
********
アメリカのNASAは、宇宙飛行士を最初に宇宙に送り込んだとき、
無重力状態ではボールペンで文字を書くことができないのを発見した。
これではボールペンを持って行っても役に立たない!
NASAの科学者たちはこの問題に立ち向かうべく、10年の歳月と120億ドルの開発費をかけて研究を重ねた。
その結果ついに、無重力でも上下逆にしても水の中でも氷点下でも摂氏300度でも、
どんな状況下でもどんな表面にでも書けるボールペンを開発した!!

一方、ソ連は鉛筆を使った。
0615デフォルトの名無しさん2020/10/02(金) 14:35:00.30ID:Ck+HovvX
リンクを張ることが目的なのではない
PowerShellの不具合を見つけることが目的なのだ
0616デフォルトの名無しさん2020/10/02(金) 21:34:24.75ID:ljpWPhwK
誰か英語ができる人 >>612 のテストを添えて「New-Itemでのhardlink/symlink作成に
[Environment]::CurrentDirectoryが影響する」ってタイトルでイシューを立てて欲しい
0619デフォルトの名無しさん2020/10/03(土) 22:48:38.93ID:7NrhvCrT
バージョン上がって使いやすくなってきたねpowershell
Shellより扱いやすいからmacにもインスコしたわ

コンソールに貼り付けて実行した時に右クリックの貼り付けとctlvの貼り付けで動きが違うのは何で?
0621デフォルトの名無しさん2020/10/07(水) 01:28:53.25ID:OLUeUK9d
あるファイルを消そうとしたら「このファイルは開かれているため〜」と表示されて消せなかった。
こういう場合、自分はリソースモニターでファイルを開いているアプリを探すんだけど
最近入った現場では管理者以外はリソースモニターを使えないように設定されていて困った。

それで質問なのですが、powershellのコマンドでファイルを開いているアプリを探す方法はあるのでしょうか?
06236212020/10/08(木) 03:04:42.09ID:daaVvwfY
>>622
めっちゃ参考になります。っていうかこれでやります。
サンクス!
0624デフォルトの名無しさん2020/10/08(木) 19:15:35.07ID:zkqa7tbj
試せば判るけど >>622 はプロセスがロードしてるDLLとかのモジュールしか得られないよ
開いてるファイルはプロセスに紐付いてるハンドル取得して一個一個チェックするしかないよ
実装はpowershellじゃかなり大変だからhandle.exeっていうMSが公開してるツール使ったらいいよ
0625デフォルトの名無しさん2020/10/14(水) 06:30:09.66ID:JjVHZHwh
セキュリティガチガチでネットにも繋がらないうちの現場じゃ無理だな
0626デフォルトの名無しさん2020/10/14(水) 11:09:36.08ID:s64A8YK8
うちの会社は「キッコーマン」のHPが見れません、”コーマン”がフィルターに引っかかるのですw
0628デフォルトの名無しさん2020/10/17(土) 17:51:59.12ID:2b9DYeQb
職場で「さすがパワーシェラー!」って言われたんだけど
パワーシェルを使う人のことをそう呼ぶものなの?
0631デフォルトの名無しさん2020/10/18(日) 21:28:34.46ID:6x+7Jy+N
in actionは読んだのかね
あとはCoreのソース読んでくのが手っ取り早い
0633デフォルトの名無しさん2020/10/24(土) 21:41:19.65ID:1s91cR1z
多次元配列(ジャグ配列ではなく)を1次元配列に平坦化する高速な方法ありませんか?
データ数は100万個くらいです。

@($a | % {$_})

検索したら↑のカッコいい方法が出てきましたが、
私の環境で6秒ほどかかり速度に不満があります。
0634デフォルトの名無しさん2020/10/24(土) 23:22:07.28ID:ZaC2aARH
パイプとForeach-Object自体が遅いからね
データがオンメモリにあるならforeach文のが速い
0635デフォルトの名無しさん2020/10/24(土) 23:28:40.40ID:ZaC2aARH
あとは万個の繰り返し処理になるわけだからpowershellで書いたら全体的には当然遅い
対策としては繰り返し部分だけC#に渡すとかだね
06376332020/10/25(日) 00:13:47.38ID:orpbcY2p
foreach文にすると0.8秒まで速くなりました!
とりあえずこの方法でやってみます

$b = foreach($x in $a){$x}
0638デフォルトの名無しさん2020/10/25(日) 02:13:33.54ID:8PerFZ8f
>>636
美人穴が「この商品は累計○万個も売り上げたということです!」とかいうとおっきする
0639デフォルトの名無しさん2020/10/25(日) 20:51:17.25ID:Bltg1B/v
>>633
>多次元配列(ジャグ配列ではなく)を1次元配列に平坦化する高速な方法ありませんか?

なんでジャグ配列ではなく多次元配列なんだろう
0641デフォルトの名無しさん2020/10/25(日) 23:57:20.55ID:sGr6+tXm
多次元配列のほうがメモリ上で綺麗に配置されている分、高速化の選択肢が多いかもしれないって発想じゃね
06426332020/10/26(月) 00:00:33.37ID:R7zaLxag
>>639
ExcelファイルからCOM経由で範囲データを取ってくるとobject[,]になるためです
0646デフォルトの名無しさん2020/10/26(月) 14:41:24.14ID:RInXL5ja
PowerShellというか.NETの仕様

.NETには1次元配列の要素にアクセスするための専用命令があるので速い
多次元配列の要素にアクセスするにはプロパティみたいなアクセサメソッドを使わなきゃいけないので遅い
0651デフォルトの名無しさん2020/10/26(月) 17:46:52.74ID:l+r11Fp5
要は根拠もなしに
> 実際には多次元配列の方が遅い
と妄想をほざいてただけって話かよw
06576332020/10/26(月) 20:09:14.97ID:5qWbLIDu
>>643
Excelファイルから取得したデータを更に別の処理に使うのですが、その際に1次元で渡す必要があるためです
0658デフォルトの名無しさん2020/10/26(月) 20:09:30.70ID:/TCFG/M1
実装としては添え字でメモリの位置を計算して参照するだけだから
一次元でも多次元でも原理的には速さは変わらないぞ
0659デフォルトの名無しさん2020/10/26(月) 20:13:28.15ID:jItJ//Mq
>>656
きみが絶対的に正しいことはスレ住人の総意で共通認識なのだから、もう十分だろう?
そのへんで勘弁してもらないかな。なんなら土下座して謝るよ。
0660デフォルトの名無しさん2020/10/26(月) 20:17:45.03ID:mujdTIU3
ちゃんとアンカー追えよ
ジャグ配列vs多次元配列が1次元vs多次元配列に化けてるぞ

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

「倍以上遅い」なんてどこから来たんだろう
0661デフォルトの名無しさん2020/10/26(月) 20:28:30.59ID:l+r11Fp5
>>658
>>646によると専用命令があるらしいけど、嘘なのかね?

>>660
ああすまん、脳内で二次元配列 ⇔ ジャグ配列 って思ってたわ
まあ3次元以上なら専用命令とやらがもっと速くないとダメだけど
0664デフォルトの名無しさん2020/10/26(月) 21:49:29.23ID:AmD6br2D
#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++
}
}
}

たしかに初期化の段階でジャグ配列のが速いね
0665デフォルトの名無しさん2020/10/26(月) 22:09:49.38ID:l+r11Fp5
>>662
ジャグ配列知らんの?
二次元相当のジャグ配列だと2回辿らないとダメだから倍は速くないとトータルで遅くなるでしょ
0671デフォルトの名無しさん2020/10/27(火) 15:37:54.18ID:az6RTKF7
処理系の実装に寄るけど、うまくインデックスを張れば
速度的には同等になるはずだけどな
0672デフォルトの名無しさん2020/10/27(火) 19:29:05.55ID:k9DNZwa6
>>671
どういう理論なんだ?
ランダムアクセスだとジャグ配列は次元毎にメモリーアクセスして辿らないとダメだけど多次元配列ならインデックスの計算してその場所にアクセスするだけだから多次元配列の方が速い
シーケンシャルアクセスだとアクセスの多くは最後の次元のアクセスだから毎回インデックスを計算する多次元配列よりジャグ配列の方が速いと思う
まあめっちゃ最適化して多次元配列を1次元配列に展開するようなコードにまで落とせたら多次元配列の方が微妙に速くなるかも
0673デフォルトの名無しさん2020/10/27(火) 19:52:31.91ID:Sd8akiyh
なんにせよ多次元配列を1次元配列に高速に平坦化する方法分からないんだろ
グダグダスレ引き延ばしておきながらなw
0677デフォルトの名無しさん2020/10/28(水) 19:54:09.10ID:RpzUgl/d
>>674
>@($a)
PSってこんなオチが多いね
$aって打てば全部列挙されて出てくるんだからあれれとは思うんだけどさ
06786332020/10/29(木) 21:32:08.09ID:/oXwNFXj
>>674
返信遅れてすみません。
0.2秒まで速くなりました。

シンプルかつナンバーワンですね
目からウロコでした。
0679デフォルトの名無しさん2020/10/29(木) 23:08:28.85ID:u3CTd5OP
>>677
こういうトリッキー系?は趣味PGならいいんだけど
業務PGに実装するには躊躇するんだよなあw
0681デフォルトの名無しさん2020/10/30(金) 08:08:54.65ID:xvehW8+X
PowerShell使うならほぼ常識、てか知らないと辛いレベル
そもそもPowerShell自体が色々トリッキーな動作するし、特に配列周り
0682デフォルトの名無しさん2020/11/02(月) 13:12:42.29ID:cgiVh2xg
$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 が特例のように思えてきた
どうしてこうなるのかきちんと理屈が知りたい
0683デフォルトの名無しさん2020/11/02(月) 14:39:03.01ID:Q6ZeZ8N8
配列での 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
06846822020/11/02(月) 17:29:09.65ID:cgiVh2xg
明示的な foreach の使用は興味がないなあ
$b = $a も $b = & { $a } も $a を $b に代入するのに
なんで結果が違うのかが知りたい
0685デフォルトの名無しさん2020/11/02(月) 17:46:27.91ID:O692h/lZ
最初のやつ以外はシンプルな代入じゃなくて演算してるから、演算の結果が一次元配列になっただけじゃないの
06866822020/11/02(月) 17:50:23.99ID:cgiVh2xg
$b = & { $a } も演算?
具体的にどういう演算になるのかわからない
0687デフォルトの名無しさん2020/11/02(月) 17:54:46.38ID:Razdsa9H
>>682
>$b = & { $a }; $b.Rank だと 1
>$b = $a + @(); $b.Rank でも 1
この2つは$aがそれぞれ評価されて1次元になって$bに代入されてる
$b = & { $a }
の場合$aの前にカンマを入れれば型は保たれる
$b = & { ,$a }
PowerShellの謎仕様
0688デフォルトの名無しさん2020/11/02(月) 18:05:40.51ID:Razdsa9H
おそらくスクリプトブロックを通過するときと
右辺や左辺に置いて演算するとき
それぞれ1次元に変換されてしまう仕様みたい
0689デフォルトの名無しさん2020/11/02(月) 18:07:36.92ID:O692h/lZ
>>686
起動演算子にスクリプトブロックを渡してるんだから演算でしょ
スクリプトで
$a
とだけ書くと$aが評価されて左上から順に9行分の出力が得られる
$b=&{$a}はその出力の代入になってる
06906822020/11/02(月) 18:14:48.39ID:cgiVh2xg
じゃあやっぱり単純な代入 $b = $a だけが特別で
それ以外は配列が展開されるってことか
理解した

>>687
& { $a } だと配列 $a が展開される
& { ,$a } にすれば配列の配列 ,$a が展開されて配列 $a がそのまま渡される
06916822020/11/02(月) 18:50:05.02ID:cgiVh2xg
あれ違うな
単純な代入だけでなく Comma operator も特例になるのか
0692デフォルトの名無しさん2020/11/02(月) 18:58:29.51ID:WQUINiFK
>>691
特例だとか自分勝手な解釈をする癖を直さないと、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
自分が既に頭の中に描いているイメージに合わせて無理に解釈方法を寄せていくのではなくて、本来理解すべき仕様の方に自分の中の理解を修正して近づけていく方がいいぞ。
0694デフォルトの名無しさん2020/11/02(月) 19:59:31.61ID:D4NZ1UY1
>>692
TPO をわきまえられずトンチンカンな御高説垂れる人も、他人とのコミュニケーションで苦労するぞ(主に周囲の人間の方が...)。
0695デフォルトの名無しさん2020/11/02(月) 20:30:51.76ID:Razdsa9H
>>690
原理的にはジャグ配列にして空評価させて返すで合ってると思う
恐らく処理系のソース読み込まないと判らないよ
配列返す関数作る時も同じ方法
06966822020/11/02(月) 20:44:58.19ID:cgiVh2xg
,$a は Comma operator で1要素の配列を返すけれど
その時に $a は展開されずに2次元配列のまま
これは単純な代入と同じ扱いだよね
0698デフォルトの名無しさん2020/11/02(月) 22:48:01.97ID:O692h/lZ
ウザかろうと思って特例云々につっこむのやめたけどやっぱり書くわ
代入は代入でしかなく特例も何もない
いつだって右辺の値をありのままの型と値で代入するだけ
$b=&{$a} というのを代入として認識するからおかしくなる
$b=$a.Rank と書いたら$bは数値になるわけだけど、代入したから数値になった!とは思わないでしょ
あくまで.Rankを評価した結果が数値になって、その数値を$bに代入したに過ぎない
$b=&{$a} も &{$a} の評価結果が一次元配列になる仕様なだけで、代入が何かの法則性に寄与している訳ではないし、一次元配列になるという一貫したルールや思想があるわけでもない
06996822020/11/03(火) 00:15:03.20ID:Da50zhuo
operand を展開してから operator にわたすんじゃなくて
operand をそのままわたして operator が展開したりしなかったりする
たぶん理解した
0700デフォルトの名無しさん2020/11/03(火) 08:59:33.05ID:HUEo3Cdu
>>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 を見ろ
0701デフォルトの名無しさん2020/11/04(水) 10:50:57.08ID:ZJcGuVz6
>>694
初学者が変な誤解すると二度と修正する機会ないからな
みんな巡り巡って自分が被る迷惑を未然に防ごうと必死なわけよ
0703デフォルトの名無しさん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)の中でうまく拾ってくれる
書き方を教えてください。
0705デフォルトの名無しさん2020/11/08(日) 02:53:16.74ID:mlfH60EQ
スコープの話だと思うよ
関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
関数を次のように書き換えて明示的にスクリプトスコープの変数を更新してやればいい

function get_stop_code {
$script:hoge=(Get-Content stop_code.txt)
}

PSのスコープって特殊で悩ましい
特にループの初回、ほかの言語みたいに未宣言の変数だぞとエラーになってくれればまだいいんだけど、変数が作られて親からも見えちゃうから混乱する
0706デフォルトの名無しさん2020/11/08(日) 08:09:56.71ID:0BM2Z5Uf
おれも一瞬ではなく数分、>>703の問題がわからなかった
とりあえず頭にSet-StrictMode -Version Latestを付けとけばエラーにはなる
0707デフォルトの名無しさん2020/11/08(日) 10:11:33.41ID:vf10kFcr
>>705
ありがとうございます。
>関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
というのは、

>>703だと、
同じシェル内にある$hogeであっても、

 @get_stop_code関数内の$hoge
 Awhile ($true)内にある$hoge

の2種類があり、
while ($true)内で、get_stop_code関数を実行しても、
@の$hogeしか書き換わらないから、求める結果が得られない。

って事でしょうか。
0708デフォルトの名無しさん2020/11/08(日) 12:20:50.04ID:mlfH60EQ
そんな感じ
関数はローカルスコープを作る
whileの方はその外側にあたるから親スコープになる
ちなみにPSではwhileブロックはローカルスコープを作らないのでスクリプト全体のスコープと同じ
0709デフォルトの名無しさん2020/11/08(日) 14:40:55.27ID:vf10kFcr
>>708
ありがとうございます。
スコープですね、勉強になりました。

きっと、しっかり理解すれば便利な仕様なんでしょうが、
初学者にとっては罠でしかありませんね・・・こういうの・・・。
0712デフォルトの名無しさん2020/11/09(月) 13:18:24.63ID:hpK1fX+1
>>707
その前にシェルという単語の使い方がおかしい
ファミリーベーシックで「ファミコン書きました」と言ってる感じで
恥ずかしいのでやめたほうがいい
0718デフォルトの名無しさん2020/11/09(月) 22:31:51.42ID:NYGqo7nG
ポンタポイントが付くか楽天ポイントが付くかの違いで基本的には一緒だよ
0719デフォルトの名無しさん2020/11/10(火) 02:41:01.00ID:TotITmpP
スクリプトスコープ以外にも、関数スコープがあるのは便利。
C, Ruby と同じ

関数スコープが無い言語は、プログラミングが異常に難しい
0720デフォルトの名無しさん2020/11/10(火) 04:19:48.53ID:UHXHz0W1
その程度の事で「異常に」難しいんじゃ向いてないんじゃない?
多少面倒臭いなと思う事はあっても
0722デフォルトの名無しさん2020/11/10(火) 09:42:32.98ID:v1zmG+Gm
むしろローカル変数の恩恵に理解を示し、グローバル変数を強制されたら不安だと思う感性の方が普段たくさんプログラミングしてるんだろうなと感じる

変数iを使ったループの中でさらに別の変数iを使った関数を呼ぶと無限ループのバグになる
代わりにjにしようとか考えてると早晩行き詰まるので「i_関数名」みたいな変数名を常に使うことを思い付く
関数名は短くしたいと考えるようになって可読性がまずいことに

短いスクリプトしか書かない用途の言語ならいいけど、そうでないなら品質の低いコードを招く言語になるだろうな
0724デフォルトの名無しさん2020/11/10(火) 13:43:57.86ID:xsn7mmhw
自分のいる世界の常識が他の場所で通用するかどうか

それを生きていて初めて見せられた例がプログラミングのローカルとグローバルだった

なんていうPCヲタも少なくないだろうなあw

ブロック過ぎたらまっさらに戻る言語なら
関数が動かないと思ったらちゃんと戻り値にして出さないとなあ

報告連絡相談 と同じ
0726デフォルトの名無しさん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自体が動作しません。
書き方を間違えているでしょうか? 普通に開ける動画ファイルもあるので相性の問題かもしれないのですが…。
0727デフォルトの名無しさん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をフルパスで指定してみたら?
0728デフォルトの名無しさん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です。
0729デフォルトの名無しさん2020/11/13(金) 03:41:57.52ID:TgKG6lgf
あ、そうそう、このAviUtlControlというソフトは、もともとコマンドラインの無いAviUtlに
強引にコマンドラインを外付けにするため、実際の動作はAviUtlの「ファイルを開く」を遠隔操作しているだけみたいですね。
windowsのファイルを開くダイアログボックスが表示されるので。
そういう動作をしているのに、ps1ファイルにフルパスで直接ファイルを指定した場合は正常に開けて
$argsを使ってps1ファイルにD&Dした場合は「ファイルが対応していない」というエラーが出るよく分からない挙動になります。
$argsもwrite-hostしてみましたが、ちゃんと目的のファイルがフルパスで格納されています。
07307262020/11/13(金) 03:56:04.19ID:TgKG6lgf
$args[0]ではなく$argsをGetType().FullNameしてみるとsystem.object[]になっていました。
$args = [string]$argsとして文字列に変換してみましたが結果は同じ。
あと、$args[0]をwrite-hostしてみると拡張子の末尾に[0]がついていましたがこれは正常ですか?
0731デフォルトの名無しさん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]

こんな簡単な話じゃ無いよなあ?
07337262020/11/13(金) 12:38:30.15ID:TgKG6lgf
>>731
>>728で試しました。

バッチファイルで (フルパス)auc_open.exe %1 とし、動画ファイルをD&Dしたら正常に開けました。
powershellと動画の相性か、書き間違えているかです。
pastebinに貼っておきます。 ttps://pastebin.com/Dupj68Z4
このスクリプトで何がやりたいのかというと、録画したテレビ番組のCMカットするのに
動画ファイルを開く→音声ファイルを追加読み込みという手順を踏まなきゃいけないのをボタン一発で済ませたいんです。
0734デフォルトの名無しさん2020/11/13(金) 13:31:59.37ID:907SkV9V
"$args" は$argsって文字列と解釈されるから、
$argsは参照されない
& $open "$args"は$argsという引数として解釈されてる
"$m2v" + "*.wav"も$m2v*.wavと解釈される
変数を参照したいなら変数はダブルクォートで囲ってはダメ
& $open $args
$m2v + "*.wav" のようにする
07357262020/11/13(金) 13:57:21.84ID:TgKG6lgf
>>734
ありがとうございます。結果は変わりませんでした。
最初に書いたように正常に開ける動画ファイルもあるので本当に相性問題かもしれません…
0736デフォルトの名無しさん2020/11/13(金) 16:35:19.24ID:907SkV9V
すぐ相性問題で解決したことに使用とする奴嫌い
変数内にダブルクォート付きの文字列を格納してないのは分かってる?
0737デフォルトの名無しさん2020/11/13(金) 19:25:55.17ID:pkjRHYH3
"$args"と書いたらinterpolationされるので$argsの内容は参照されるよ
PSもモダンなので "my name is $name" みたいな書き方ができる
リテラルになるのは'$args'と書いた場合

でも"$args[0]"と書いたらダメ
どこまで変数でどこから文字列なのかが想定と合わない
"$($args[0])"と書く必要がある

[0]を付けないと配列への参照になるから"$args"だと引数間に改行コードが入る
読み込めない動画はパスに空白に含まれているのかもしれないな
0738デフォルトの名無しさん2020/11/13(金) 19:30:14.24ID:34jLv13e
>>726
cmd[.]exe(コマンドラインと呼んでいるものの実体)に引数が渡るときの
パースの問題の可能性がある
フルパスに空白が入っているかどうかで成否が変わったりしない?
"$args" を ""$args"" or `"$args`" にしてみたら
0740デフォルトの名無しさん2020/11/13(金) 19:37:05.80ID:pkjRHYH3
これスペースが連続するファイル名があると失敗するな…
切り分けにはなるからいいか
0741デフォルトの名無しさん2020/11/13(金) 19:40:36.71ID:lrdHTx5A
psって難しいんだな
0742デフォルトの名無しさん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:\に置いてみたら開けるんじゃないかな?
0743デフォルトの名無しさん2020/11/13(金) 20:45:29.62ID:HX9sr4kC
>>738
>フルパスに空白が入っているかどうかで成否が変わったりしない?

空白とかマルチバイトとかあっちの問題か!
0745デフォルトの名無しさん2020/11/13(金) 21:28:03.15ID:n6TD+JMZ
ぱわーしぇるがシェルではない事が証明されたな
0746デフォルトの名無しさん2020/11/13(金) 23:47:58.29ID:LLS1FCOb
ファイルパス・ユーザー名に、空白・日本語を使うと、バグる。
半角英数字・ハイフン・アンダーバーだけにする

Windows のパスには、空白が入っているものがあるので、ヤバイ
07477262020/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
07487262020/11/14(土) 01:10:54.25ID:8FDial4y
あ、下記忘れましたが"$args"と$args[0]も最初と変わらずファイル読み込みに失敗します。
0749デフォルトの名無しさん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"
のように呼んでもいいらしい
07507262020/11/14(土) 03:06:15.72ID:8FDial4y
>>749
行けました! ありがとうございます!
後半の意味がちょっと分からないんですが、動画ファイル名を明確にしろということでしょうか?
0751デフォルトの名無しさん2020/11/14(土) 04:21:18.02ID:C2BVBS/P
引数をシングル・ダブルクォーテーションで囲む事で、
1つの引数として解釈される

囲っていないと、複数の引数として解釈されてしまうから

こういうのは、Linux では、うるさいぐらいに注意する
0752デフォルトの名無しさん2020/11/14(土) 05:26:16.13ID:/XxpwyFY
最初にPCに自分の名前を流用した名前を付ける時点で
半角英数にする、空白入れないというのを徹底しないと自動化には程遠い
0755デフォルトの名無しさん2020/11/14(土) 10:49:04.93ID:OfQ57GBv
>>750
自分で引数名を定義して渡すやり方
引数ひとつひとつの範囲を明確にできるのでPSにおかしな解釈をされようがなくなる
どちらかというと経験者向けの参考として書いたから動いたなら気にしなくていいと思う
Powershell Paramで検索したら詳しく出てくる
0756デフォルトの名無しさん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個の配列になるという事象

経験から問題を矮小化しがちになるのは老化による成長鈍化だと思う
自戒を込めて
0757デフォルトの名無しさん2020/11/14(土) 11:18:40.57ID:xztQReuw
省略しないで実際に流したコマンドをそのまま晒したほうがいいような気はする
せいぜい数行だろうし
0758デフォルトの名無しさん2020/11/14(土) 13:03:46.86ID:eAmLQM6Q
WindowsのD&Dによるバグ仕様を回避するためにはpathに半角spを含めておいた方が良い
0759デフォルトの名無しさん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 になるぞ
0760デフォルトの名無しさん2020/11/14(土) 15:37:31.99ID:OfQ57GBv
>>759
バージョン5.1をcmdから呼び出して確認した
再現しなかったのは-fileを指定したからじゃない?
0761デフォルトの名無しさん2020/11/14(土) 15:44:28.74ID:cwgCwaC3
>>759
Windowsのパラメーターの分解は呼ばれ側プロセスで処理すんだけど
powershellは起動時のバージョンと実行時のバージョンが違うことがある
powershellのバージョン違いを複数入れてる場合が恐らく該当する
引数4になるパターンはpowershellバージョン2で実行されてる
powershell -v 2 で起動した場合は引数4
powershell -v 5 は全部バラけて引数6
俺はこういうバグだか仕様だかに付き合うの嫌だから一時ファイルや環境変数とかでやりとりする
0762デフォルトの名無しさん2020/11/14(土) 16:04:59.98ID:cwgCwaC3
[Environment]::CommandLine

[Environment]::GetCommandLineArgs()
を使うとpowershellに因らない.NETで処理したパラメーターが得られるからこれが安全かもね
0763デフォルトの名無しさん2020/11/14(土) 16:05:13.61ID:OfQ57GBv
-v 2 で起動したらたしかに引数4になったけど $args[0] は a になったわw
-v 2 だと全角スペースが区切りとして解釈されない
0764デフォルトの名無しさん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のバージョン次第
0768デフォルトの名無しさん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" 相当になるからうまくいく模様
0769デフォルトの名無しさん2020/11/16(月) 22:11:59.00ID:ssVCI5qt
Excelのセル内の文字列全部ではなく、セル内の一部の文字列だけ文字色を変更する事は出きますか?
0772デフォルトの名無しさん2020/11/28(土) 20:01:43.24ID:ako3hAti
.Net Frameworkの質問になるかもしれんが、Powershellから使うのでこちらに
対話型のスクリプト作っててユーザーからファイルやフォルダのパスの入力を求めるのにGUIにしようと思って
System.Windows.Forms.FolderBrowserDialogとか
FileBrowserDialogとかを使ってやろうとしてますが、
ダイアログ画面が他のウインドウに隠れてユーザーが気づきません。
最前面表示させるにはどうすればよいでしょうか?
0773デフォルトの名無しさん2020/11/28(土) 21:23:54.75ID:ako3hAti
自決しました。
topmostプロパティをtrueに設定したFormオブジェクトを
FolderBrowserDialogオブジェクトのShowDialogメソッドの引数に渡すんですね。

こういう方法はマニュアル読んでもまったくわからない。苦手。
07757262020/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でも同様の結果でした。
改行をする方法はありますか?
0776デフォルトの名無しさん2020/12/03(木) 20:44:02.20ID:gj1mOZdT
>>775
数字以外が出てきたらそこで区切ることで配列にする
配列要素のうち空文字列であるものを除外
配列をまるごとファイルにリダイレクトして改行された出力結果を得る

$utltrimfile = $(Get-Content (テキストファイルのパス)) -split '\D' | ?{$_ -ne '' }
$utltrimfile > (テキストファイルのパス)
07777262020/12/03(木) 21:29:21.46ID:AP2X4U04
出来ました! ありがとうございました!
0778デフォルトの名無しさん2020/12/07(月) 00:00:56.83ID:8Ddysj0U
PowerShellにinterfaceありますか? 空のクラス定義するしかないですか?
0779デフォルトの名無しさん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

.列の名前で指定したものしか出ない。


こういう(コマンド).列名っていうので、出力を絞る方法に名前ってありませんか?
0782デフォルトの名無しさん2020/12/07(月) 00:57:24.19ID:8Ddysj0U
>>781
そうなのよ
0785デフォルトの名無しさん2020/12/07(月) 07:24:15.67ID:Zb+BuNXc
. で出力を絞る方法、正確には対象を選ぶ方法は、一般的にはプロパティアクセスが該当するかな
0787デフォルトの名無しさん2020/12/07(月) 15:48:31.93ID:5uzreY+I
copy-itemでディレクトリを指定して、内部のファイルがパス260文字以上でエラーを出すとき、そのパスを取得する方法はあります?
0788デフォルトの名無しさん2020/12/07(月) 16:04:01.41ID:8iO4bdx+
>>787
Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathEnabled -Value 1
0789デフォルトの名無しさん2020/12/07(月) 18:20:51.52ID:5uzreY+I
>>788
ありがとう
ただそのやり方はwin10にしか出来ないようで、win8.1ではLongPathEnabledは存在しないようです
ググってもLongPathEnabledのwin8.1版は見つからないもので……
0792デフォルトの名無しさん2020/12/08(火) 15:51:45.96ID:CDSpQQd3
外部コマンド | PowerShellの関数って風にパイプでつないで処理するとき
出力側が終わるまで一旦全部バッファリングしてから、ようやくPowerShellに処理が移る感じになるんですが
並列で処理するようにするにはどうすればいいでしょうか?
0793デフォルトの名無しさん2020/12/10(木) 21:12:35.73ID:6BQNLUy5
#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回ループさせて終わるようにしたいです。



  
0794デフォルトの名無しさん2020/12/10(木) 21:25:03.78ID:3lwwmG32
$hoge="ikkaime_"

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

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

Write-Output $hoge$i

}
0795デフォルトの名無しさん2020/12/10(木) 21:59:45.86ID:/iej8cKu
foreach ($hoge in 'ikkaime_', 'nikaime_') {
for ($i = 0; $i -lt 10; $i++) {
Write-Output $hoge$i
}
}
0796デフォルトの名無しさん2020/12/10(木) 23:27:25.70ID:uqnVDABe
$ikkaime = @()
$nikaime = @()

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

Write-Output $ikkaime
Write-Output $nikaime
07987932020/12/11(金) 23:44:28.19ID:YtFbF7ro
ありがとうございました。

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

ありがとうございます。

ちなみに、>>795
で処理しました。
0799デフォルトの名無しさん2020/12/11(金) 23:55:43.98ID:BGcESmPN
インクリメントのループはこう書いたほうがスッキリする
foreach ($i in 0..9) {
0800デフォルトの名無しさん2020/12/13(日) 00:05:08.43ID:w0iK+TRN
>>797
こういうパイプがネストしてるのに違和感あるんだけど
多少効率悪くてもパイプ1本にできないかな
0801デフォルトの名無しさん2020/12/13(日) 01:22:24.35ID:cCJaeZ7C
for ($i=1; $i -le 2; $i++){
Switch($i) {
1 {(1..10) | %{"ikkaime_"+$_}}
2 {(1..10) | %{"nikkaime_"+$_}}
}
}
0802デフォルトの名無しさん2020/12/13(日) 07:32:06.23ID:5EW0FlRD
パイプは繋げてナンボ
UNIX文化からの流れで、シンプルなコマンド群からの組み合わせの可能性は無限大
長いパイプラインが違和感?
いやロシアからウクライナを経由してドイツまで延びてもいい…!ゴルビーもそう言ってるよ
0804デフォルトの名無しさん2020/12/13(日) 08:21:28.01ID:7zDtZqQK
function hoge($fuga) {
0..9 | ForEach-Object {Write-Output "$fuga$_"}
}
hoge 'ikkaime'
hoge 'nikaime'
0806デフォルトの名無しさん2020/12/13(日) 10:24:56.32ID:aJyBOeQT
>>802
長いパイプじゃなく、パイプライン処理の名にそぐわない、
行って帰ってくるようなネストされてるのが気持ち悪い
0808デフォルトの名無しさん2020/12/13(日) 22:17:37.96ID:aJyBOeQT
ゴルビーのパイプライン大作戦にだって行って帰ってくるようなパイプは無いだろ
0809デフォルトの名無しさん2020/12/14(月) 13:38:52.97ID:MCQs+fzK
変数を事前に全部固めた書いたほうがわかりやすいと思うのですが、
ループ前に定義した変数の値に、ループ時の変数を入れ込む方法がわかりません
$mynameis変数をループ中(コメントの位置)に持ってくると、問題ないんですが、
なんとか#変数ってしてあるところにもってきたいんです
定義したときには空で、あとから追加で変数に値をいれることってできないんでしょうか?

ソース

#変数
$watashi = "私は"
$fname = "佐藤"
$mynameis = "$watashi$fname$lname"

foreach ($lname in "一郎","二郎","三郎"){
#$mynameis = "$watashi$fname$lname"

#名を名乗る
Write-Output $mynameis

}
0810デフォルトの名無しさん2020/12/14(月) 14:58:28.73ID:0uVb17k3
$mynameis = { "$watashi$fname$lname" }
$watashi = "私は"
$fname = "佐藤"
foreach ($lname in "一郎","二郎","三郎"){
#名を名乗る
Write-Output (mynameis)
}
0811デフォルトの名無しさん2020/12/14(月) 15:01:37.07ID:0uVb17k3
>Write-Output (mynameis)
Write-Output (&$mynameis)

こうかも、PowerShell難しすぎ
0813デフォルトの名無しさん2020/12/14(月) 21:31:50.90ID:vj7TAroN
ごめんようやく理解した

最初にNew-Variableなり空文字で宣言するだけじゃ納得いかんのかな
変数が自動で書き変わるのは正直気持ち悪い
0814デフォルトの名無しさん2020/12/14(月) 21:43:34.54ID:MBsazS7x
$watashi = "私は"
$fname = "佐藤"
$mynameis = "$watashi$fname{0}"

foreach ($lname in "一郎","二郎","三郎"){

Write-Output ($mynameis -f $lname)

}
0815デフォルトの名無しさん2020/12/14(月) 22:30:25.12ID:LFps+YXF
モダンな言語を使って書くレガシープログラミングだね
先頭宣言教から改宗してもらうのが一番丸く収まるとか言ったらダメなんだろうな
0817デフォルトの名無しさん2020/12/14(月) 23:10:29.87ID:EXeKWskh
できないことはないってだけで、やめたほうがいい
他の人がコードを読む時にとても困惑させるし
半年後に自分が読んでも理解に苦しむかもしれない
0819デフォルトの名無しさん2020/12/15(火) 03:55:48.18ID:eKJAj5sp
>>810みたいにスクリプトブロックで評価順序制御するのは別におかしくないと思うけど
0820デフォルトの名無しさん2020/12/15(火) 07:38:16.79ID:T2M/UCWI
変数宣言を冒頭に集めるという、昔の言語ではルールだったけどデメリットの方が多いとして廃れた風習
その実現にスクリプトブロックを多用するのは可読性を落とすからやめとけという話じゃないかな

古典言語には存在しなかった文字列補間は、宣言したスコープで即時解決されるものだから冒頭部でリテラルを宣言する風習と相性が悪い
記法が似ていて混同したのだろうけど、質問者が暗に期待していたであろうフォーマットパターン文字列としてはPowershellでは -f 演算子が用意されているのでそれを使えばいい
0822デフォルトの名無しさん2020/12/15(火) 13:15:17.29ID:HMGpB1Xp
$watashi = "私は"
$fname = "佐藤"
$lname = "一郎","二郎","三郎"
$lname.ForEach{Write-Output "$watashi$fname$_"}
0823デフォルトの名無しさん2020/12/15(火) 13:34:51.98ID:/uFuBiiy
"私は"と"佐藤"を分ける意味がない
気持ちは分からなくもないけど
0824デフォルトの名無しさん2020/12/16(水) 09:44:04.15ID:VCJoAcsJ
1. webからテキストをDLしてカレントディレクトリに Shift-JIS で保存したい。どう書けばいいですか?
https://example.com/test.txt
文字コード:UTF-8
コマンドプロンプトから以下でDL出来るのまでは調べて分かったんだけど文字コードを変えて保存するのが分かりません
powershell -Command "Invoke-WebRequest https://example.com/test.txt -OutFile test.txt"

コマンドプロンプトにコピペかバッチから使いたいのでワンライナーで出来ると嬉しいです


2. 1に似た処理でweb上のUTF-8のtest.txtをカレントディレクトリのShift-JISのabc.txtに追記したい
こちらもコマンドプロンプトから powershell -Command "〜 みたいに出来ればワンライナーで
0825デフォルトの名無しさん2020/12/16(水) 13:22:09.75ID:JHzHImy2
>>824
Invoke-WebRequestのOutFileオプションじゃなくて、EncodingオプションのあるOut-Fileコマンドレットの方を使ったら?
(cmdじゃなくてpowershellから実行すれば、powershell -Command ""の部分はいらないよ)
Invoke-WebRequest https://example.com/test.txt | Out-File -Encoding default test.txt

追記するなら、Appendオプション
Invoke-WebRequest https://example.com/test.txt | Out-File -Encoding default abc.txt -Append
0826デフォルトの名無しさん2020/12/16(水) 19:10:36.45ID:VCJoAcsJ
>>825
レスありがとうございます。ですが出来ませんでした
Fileは作られるのですが内容が以下のようになります

StatusCode : 200
StatusDescription : OK
Content : ここに中身が複数行 尻切れ

RawContent : HTTP/1.1 200 OK
Connection: keep-alive
x-robots-tag: noarchive, nofollow, noindex
なんか色々

Forms : {}
Headers : 諸々
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength :

中身、Content +尻切れ部分 で保存するにはどう書けばいいですか?
Win10.0.18363.1256 PSVersion 5.1.18362.1171
0828デフォルトの名無しさん2020/12/16(水) 20:37:34.73ID:VCJoAcsJ
>>827
出来ました!ありがとうございます!
なんかオリジナル(UTF-8 LF)に比べ変換した(Shift-JIS CRLF)では末尾に改行コード1つ余分に追加されてしまいますが。。
バッチで読み直して再保存すれば行けそうです
やりたいことが可能になりました。感謝!
0829デフォルトの名無しさん2020/12/16(水) 21:11:10.07ID:CXRufgbD
>末尾に改行コード1つ余分に追加されてしまいます
こういうの気持ち悪い!
誰か助けてあげて!
0831デフォルトの名無しさん2020/12/16(水) 23:38:36.87ID:VCJoAcsJ
>>829
ありがとうございます。私もモヤモヤしてたので調べて報告するつもりでした

>>830
ありがとうございます
-NoNewline で末尾改行追加されませんがLFのままになってしまうようです
たぶんLFをCRLFにreplaceしてからOut-File -NoNewline で行けそうかも、というところまで来ていたのですが、、
置換のコマンドレットが分からず苦戦しています
0833デフォルトの名無しさん2020/12/17(木) 05:23:59.73ID:P27ySftq
powershell -Command "%{((Invoke-WebRequest https://example.com/test.txt).Content) -join '`r`n'}|Out-File abc.txt -Encoding default -Append -NoNewline"
powershell -Command "%{((Invoke-WebRequest https://example.com/test.txt).Content) -replace '`n,`r`n'}|Out-File abc.txt -Encoding default -Append -NoNewline"
リファレンスとにらめっこし何百回と色々試してこれに行き着いてこれなら行けそうと思ったのですがLFのまま。。
Get-ContentとかSet-Contentとかも試してみたのですが基礎的な書き方も知らず当てずっぽうではダメなようです
基礎的な事から覚えないとちょっと自分には無理かもです^^;
0835デフォルトの名無しさん2020/12/17(木) 11:14:10.52ID:aoellUFv
SurfacePro8の、一応待たれてはいるがあまり期待されてない感は異常
0837デフォルトの名無しさん2020/12/17(木) 17:50:06.55ID:P27ySftq
>>836
ヒントありがとうございます
最終的に以下で出来ました
ren jane2ch.brd jane2ch.brd.bak &&copy jane2ch.brd.bak jane2ch.brd &&powershell -Command "(Invoke-WebRequest https://example.com/bbsmenu.brd).Content -replace \"`n\",\"`r`n\"|Out-File jane2ch.brd -Encoding default -Append -NoNewline"
アドバイス下さった方皆ありがとう
0838デフォルトの名無しさん2020/12/18(金) 21:36:03.86ID:NKeMhQjy
Invoke-WebRequestはaliasで短くできるよ
(Get-Alias -Definition Invoke-WebRequest).Name
curl
iwr
wget
Out-Fileはaliasが無い
0839デフォルトの名無しさん2021/01/01(金) 16:52:16.58ID:jgut+Hkv
関数とクラスメソッドでreturnまわりの振舞い全然違うのかよ
ほんまクソやな
0840デフォルトの名無しさん2021/01/01(金) 17:32:29.13ID:iwrlPpxO
自分が言語を知らないだけなのに言語を叩くやつは技術力があれだって書込みをLinuxスレで見た
謙虚になって勉強もせずに自分の知ってる言語に固執するらしい
0843デフォルトの名無しさん2021/01/02(土) 14:38:10.21ID:SsQKjWAu
関数のreturnは単に関数を抜けるだけ
出力はストリームを使う
クラスのメソッドはreturn文でのみ値を返す
多くの言語でよくみられるやつ
Write-Outputしても無視される
0844デフォルトの名無しさん2021/01/02(土) 14:45:10.44ID:o3T1iAcx
変数のスコープも違うよねー

function f() {
 echo $a
}

$a = "test"
f

関数はこれが気持ち悪すぎてメソッドしか使わなくなった
0846デフォルトの名無しさん2021/01/03(日) 01:30:49.55ID:BT1KEPia
質問です。
.NETのKeyedCollectionクラスを使用したいのですが、
パイプラインに関するエラーメッセージが出てうまくいきません。
解決方法を教えていただけませんか。

環境はWindowsPowerShell 5.1をVSCode上で実行しています。
ソースコードとエラーメッセージは下記のとおりです。

◆ソースコード
class Record {
  [string] $Key
  [double] $Data
}

class MyCollection : System.Collections.ObjectModel.KeyedCollection[string, Record] {
  [string] GetKeyForItem([Record] $item) {
    return $item.Key
  }
}

$r = [Record]@{ Key = "pi"; Data = 3.14 }
$c = [MyCollection]::new()
$c.Add($r)
$c["pi"].Data # 3.14と表示されてほしい

◆エラーメッセージ:
パイプラインの作成中にエラーが発生しました。
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : RuntimeException

以上、よろしくおねがいします。
0848デフォルトの名無しさん2021/01/03(日) 04:09:59.45ID:ORVbOLX2
>>847
うちでも再現したわ Win10 1909
一応定義をC#で書いたら動いたから載せておく

Add-Type @"
public class Record {
public string Key;
public double Data;
}

public class MyCollection : System.Collections.ObjectModel.KeyedCollection<string, Record> {
protected override string GetKeyForItem(Record item) {
return item.Key;
}
}
"@

$r = [Record]@{ Key = "pi"; Data = 3.14 }
$c = [MyCollection]::new()
$c.Add($r)
$c["pi"].Data # 3.14と表示されてほしい
0849デフォルトの名無しさん2021/01/03(日) 04:29:20.63ID:ORVbOLX2
ごめん >>846 宛ね
>>847
まじですか
でもPSの運用的にクラス定義で複数ファイルに分けるとかありえないわ
コンソールからだと丸ごとコピペじゃなくて定義を1個ずつコピペするとエラーにならないし
なんなのかね
0851デフォルトの名無しさん2021/01/03(日) 12:17:05.18ID:n1qZMfJK
実行文が入っていない

単にコンパイルされる文、型の宣言・定義しか入っていない。
インスタンスを作ったりする、実メモリの割り付けをされる文がない
08528462021/01/03(日) 17:02:17.09ID:BT1KEPia
>>851
クラス定義のps1ファイルの中身はそうすべき、ということでしょうか?
>>849
確かにコンソールで全て定義すると動きますね。
クラス周りの動きが難しいです。。。
>>847
ありがとうございます。
下記のように書き直したところうまく動きました。
◆Record.ps1
class Record {
  [string] $Key
  [double] $Data
}

◆MyCollection.ps1
. .\Record.ps1 # ←これは無くても動く…??
class MyCollection : System.Collections.ObjectModel.KeyedCollection[string, Record] {
[string] GetKeyForItem([Record] $item) {
return $item.Key
}
}

◆Test.ps1
. .\Record.ps1
. .\MyCollection.ps1
$r = [Record]@{ Key = "pi"; Data = 3.14 }
$c = [MyCollection]::new()
$c.Add($r)
$c["pi"].Data # 3.14と表示されてほしい
08538512021/01/03(日) 18:34:59.83ID:n1qZMfJK
ファイルA の中で、ファイルB を読み込むと、
依存ファイルであるファイルBが、先に実行される事が確定するのだろう

一方、同じファイルに、複数のクラスを書くと、依存関係が分からないのだろう
0854デフォルトの名無しさん2021/01/07(木) 01:13:26.70ID:MvQgNxU+
すいません、Powershellって、変数が空だった場合の
デフォルト値を設定する方法ってありますか?

bashでいうところの、
${hoge:-fuga}

って方法です。
0855デフォルトの名無しさん2021/01/07(木) 02:45:37.83ID:CsAW39lY
ねーよ
VBSで言うIsEmpty相当すらない
せいぜい$nullかどうか調べてちっ仕方ねーなってやるしかない
0856デフォルトの名無しさん2021/01/07(木) 08:03:25.19ID:1A0NtNS9
($nullでなく)空って状態はないと思うから、しいてやるならGet-Variableで変数が存在するか調べるくらいかね
0858デフォルトの名無しさん2021/01/07(木) 08:28:41.55ID:6ewH2FY0
>>854
変数が空の定義次第だけど$nullでよくてPowerShell 7以降なら$hoge ?? 'fuga' でいける
空の定義に空文字を含むとかPowerShell 6以下とかなら素直に if([string]::IsNullOrEmpty($hoge)){ 'fuga' } else { $hoge } とやればいい
0864デフォルトの名無しさん2021/01/07(木) 22:50:20.03ID:iqGL0Mlk
ほげふがの語源ってサザエさんだったの!? マジで!
0868デフォルトの名無しさん2021/01/08(金) 11:53:36.70ID:zUQduDYO
>>867
そうか、それはすまなかった。
早とちりでございました。
お詫び申し上げます。
0869デフォルトの名無しさん2021/01/08(金) 12:25:26.48ID:eXVg8SYp
>>868
詫びろとは言ってない

>>867
誰かがマイナーと言ったとは言ってない

>>865
今週観たとは言ってない

>>861
ご指摘にはあたらない
0870デフォルトの名無しさん2021/01/08(金) 12:25:53.52ID:eXVg8SYp
これ万能論法ですな
0872デフォルトの名無しさん2021/01/09(土) 01:01:42.83ID:KQEfE/JM
※すべてのネットワークアダプタを無効にして、
Get-NetConnectionProfileは必ずエラーになる状態で実行しています。

$result=Get-NetConnectionProfile -InterfaceAlias Wi-Fi 2>$null
$?
False


$result=(Get-NetConnectionProfile -InterfaceAlias Wi-Fi 2>$null)
$?
True

この場合、マル括弧がどんな働きをして
結果が変わってしまうのか教えてください。
0873デフォルトの名無しさん2021/01/09(土) 01:03:45.10ID:KQEfE/JM
ちなみにこうしても

$result=Get-NetConnectionProfile -InterfaceAlias Wi-Fi
エラーメッセージ
$?
False


$result=(Get-NetConnectionProfile -InterfaceAlias Wi-Fi)
エラーメッセージ
$?
True

という状態でした。
0874デフォルトの名無しさん2021/01/09(土) 08:27:17.19ID:kPw1IBO3
>>872-873
まあバグ(MS的には仕様とも言う)みたいなもんやね

Until PowerShell 7, containing a statement within parentheses (...), subexpression syntax $(...) or array expression @(...) always reset $? to True , so that (Write-Error) shows $? as True.
This has been changed in PowerShell 7, so that $? will always reflect the actual success of the last command run in these expressions.

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.1#short-description

なのでPowerShellを7にすれば解決するかと
0875デフォルトの名無しさん2021/01/09(土) 09:13:27.43ID:iGxXP/Ic
5.1はメンテしないってことか?
OSにデフォで入ってるバージョンなんだから直せよ
0876デフォルトの名無しさん2021/01/09(土) 09:49:28.96ID:kPw1IBO3
いきなり直したらユーザースクリプトのバグが顕在化したりするだろ
どうでもいいようなスクリプトなら7に上げろよ
0877デフォルトの名無しさん2021/01/09(土) 10:38:48.10ID:amtktMoR
どうでもいいスクリプトで問題回避できるなら7に上げなくてもいいんじゃね。
0880デフォルトの名無しさん2021/01/09(土) 16:15:40.54ID:WaDdsN2m
>>878
あげる?のではなくて別物なので併用できるけど。
5.1 → powershell.exe
7.x → pwsh.exe
0881デフォルトの名無しさん2021/01/10(日) 04:54:33.84ID:3v4yt86U
以下の表記の意味を教えてください。
void Queue[TResponse](Google.Apis.Requests.IClientServiceRequest request, Google.Apis.Requests.BatchRequest+OnResponse`1[TResponse] callback)
メソッドに角カッコ?や、型指定に+や`1[TResponse]の意味がわかりませんでした。

$batch = New-Object Google.Apis.Requests.BatchRequst($service)
$batch.Queue
で表示される内容です。
0882デフォルトの名無しさん2021/01/10(日) 08:11:25.80ID:a907yL+h
クラスのメンバーにクラスがある時は+になるんじゃなかったか
System.Environment+SpecialFolder みたいな

[TResponse]はジェネリックの型引数
`1は型引数を1つ取るって意味
08838812021/01/10(日) 21:15:33.29ID:3v4yt86U
>>882
ありがとうございます。ジェネリックというのは知らなかったので調べてみます。
あと、その、Queue[TResponse]、というメソッドに型が付いている?のもジェネリック関連でしょうか。
0884デフォルトの名無しさん2021/01/12(火) 16:53:39.85ID:0UGYDHaB
pythonに飲み込まれるってマジ?
0890デフォルトの名無しさん2021/01/18(月) 22:22:09.29ID:6Ncg8pZo
【D:\】の全てのフォルダやファイルに対して、作成日時や最終アクセス日時などを設定したいのですが、
PS D:\> Get-ChildItem -Path "D:\" | Where-Object { $_ -is [System.IO.FileInfo] } | ForEach-Object { Set-ItemProperty $_.FullName -Name CreationTime -Value "2021/01/01 00:00:00" }
ではエラーが出ます。

何がいけないのでしょうか?
0891デフォルトの名無しさん2021/01/18(月) 22:59:36.90ID:Pb59NPOt
例えば特定の一つのファイルやフォルダなら上手く行くとか
パイプを分解してどこでエラーになってるのかを突き止めるとか
丸投げするにしてもエラーメッセージ位は出してあげると答える人も喜ぶと思いますよ
0892デフォルトの名無しさん2021/01/19(火) 02:44:39.14ID:m3MeBQ6p
1.D:\が存在していない
2.D:\へのアクセス権がない
3.D:\にあるファイルに読み取り専用属性が設定されてるものが混ざってる
どれかな?

Where-Object { $_ -is [System.IO.FileInfo] }抜き、ファイルに限定しないで実行したときは
フォルダへのアクセス時にエクスプローラー開いてると
”別のプロセスで使用されているためアクセスできません”となった(たとえ操作対象のフォルダを開いていなくても)

変更された日時を確認するためにエクスプローラー開いたまま実行してたりする?
0893デフォルトの名無しさん2021/01/19(火) 21:02:07.64ID:qrtgnbPs
# set the target folder path
$targetFolder = 'I:\';

# get all files including files in sub folders
$itemList = Get-ChildItem $targetFolder -Recurse;

foreach($item in $itemList){
$item.CreationTime = '2020/12/21 00:00:00'
}
なスクリプトで実行したらエラーなく出来ました。
お騒がせしてすみませんでした。
0894デフォルトの名無しさん2021/01/19(火) 23:49:36.84ID:XQEllFmW
>>893
>>890
私の環境で実行したら何のエラーもなく、CreationTimeが2021/01/01 00:00:00
になったの。

逆質問だけど、どんなエラーだったのか教えてください。
0895デフォルトの名無しさん2021/01/20(水) 10:29:40.54ID:sOzWFlEJ
エクスプローラーとか、バックグラウンドで動いているシステムなどが、
フォルダをロックしていたら、失敗する

だから、タイミングによって、成功したり失敗したりする

読み取りロックは、読み取り同士では共有できるけど、
書き込みロックは、その他すべてと共有できないから、失敗する確率が高い
0898デフォルトの名無しさん2021/01/27(水) 21:16:07.96ID:lPCF/h8Q
テキストストリームの事なのかNTFSの代替データストリームの事なのか
どちらなんだ
0900デフォルトの名無しさん2021/01/27(水) 22:45:50.85ID:9akTDBYB
テキストに限った話ではないけど、質問者が正確に把握してるともまた限らない
0901デフォルトの名無しさん2021/01/29(金) 23:59:43.31ID:t1LR5As2
PoweShellのクラスで、C#と同様にインデクサーを定義することはできますか?

例えば、あるクラスのインスタンス$hogeに対して
$hoge[$i] という感じで添字でアクセスしたいです。
0905デフォルトの名無しさん2021/01/31(日) 17:24:57.96ID:x4IKZ5QX
そのファイルに付属させたい情報を一緒にいれておくということだろう
ソースだったら、開発秘話とか入れとけば?
0906デフォルトの名無しさん2021/01/31(日) 17:26:58.51ID:x4IKZ5QX
あと自分の写真とか連絡先とかプロフィールを入れとけばいいかもW
09089012021/01/31(日) 19:31:38.13ID:yFPHlREj
>>902
PowerShellでも.Netの
コレクションクラスを使えますので、
インデクサーを使うこと自体はできますよね?
同様のことをユーザー定義クラスで実現できないかと思ったのですが、
無意味でしょうか…
0909デフォルトの名無しさん2021/01/31(日) 20:11:33.10ID:IDCaHEld
>>904
それ代替データストリームに見えるけどどの辺がテキストストリームなんだろ
しかも、NTFSに依存する機能で.mdの代替とか悪手でしかない
0911デフォルトの名無しさん2021/02/05(金) 00:48:27.75ID:a81hUa+F
PowerShellのパイプやリダイレクトは仕様が良くないね。
エンコードせずにバイナリデータのままパイプする従来の方法も選べたほうが良かったね。
0917デフォルトの名無しさん2021/02/06(土) 23:58:30.54ID:5Ze23T9D
>>912
`| や`>が解説されているマイクロソフト公式ページはどこになりますか?
検索キーワードが記号ばかりなので探し方が分からず困っております。

>>913
私の環境では、以下のエラーが出て動きませんでした。
Get-Content: Cannot process argument transformation on parameter 'Encoding'.
'byte' is not a supported encoding name. For information on defining a custom encoding,
see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')
0919デフォルトの名無しさん2021/02/07(日) 01:34:59.08ID:IiZq+u+t
>>918
具体的なURLはどこになりますか?
0920デフォルトの名無しさん2021/02/07(日) 01:38:10.26ID:IiZq+u+t
>>918
検索にbashの知識が必要というのは具体的にどういう意味ですか?
0921デフォルトの名無しさん2021/02/07(日) 01:46:34.08ID:IiZq+u+t
ひょっとして>>912>>918は別人なのかな。
もし別人なら>>918への質問はなかったことにしてください。論点がずれてるようだから。
0922デフォルトの名無しさん2021/02/07(日) 07:11:26.49ID:jVPjdJHk
@パターン1
$data = @('red','green','blue')
if ( $data -ne 'green' )
{
'greenはありません'
}

greenはありません

Aパターン2
$data = @('red','green','blue')
if ( $data -ne 'pueple' )
{
'greenはありません'
}
greenはありません


両方とも同じ結果を返してしまいます。
配列と比較して、無かったらtrue、あったらfalseみたいな書き方ってありませんか?
イメージとしては

if ( $data.notContains('green'))

みたいな書き方です。

用としては、if ( $data.Contains('green'))で足りるのですが、
気持ちの問題として、無かったらtrue、あったらfalseという書き方をしたいです。

よろしくお願いいたします。
0923デフォルトの名無しさん2021/02/07(日) 09:44:27.16ID:jX/y7Db/
>>922
> 両方とも同じ結果を返してしまいます。
まず
$data = @('red','green','blue')
$data -ne 'green'
で何が戻ってくるか確認すればなぜそう言うふうに動くかわかると思う

> 気持ちの問題として、無かったらtrue、あったらfalseという書き方をしたいです。
どうしても-eqとか使いたい場合、俺なら($data -eq 'green').Count == 0って書くかな
どう見ても$data.Contains('green')の方がわかりやすいと思うけど
0924デフォルトの名無しさん2021/02/07(日) 09:58:10.78ID:fgGFki9a
$data = @('red','green','blue')
if (not ($data -eq 'green')) {}
if (not ($data.Contains('green'))) {}
if (not ($data -contains 'green')) {}
if ($data -notcontains 'green') {}
if ('green' -notin $data) {}

-eq演算子はフィルタとして働くのでここでの用法は微妙
-in系の演算子は配列が大きいとオーバーヘッドが大きいらしい
0925デフォルトの名無しさん2021/02/07(日) 09:59:45.82ID:fgGFki9a
否定をtrueにするってどういうことだろ
$colors = @('red','green','blue')
$found = $data -contains 'green'
if ($found) {
} else {
}
なら自然に読み下せる
ここで$notFoundという変数を使われると気になる
if (not $found) {
# 先に書いておきたい処理
} else {
# 長々とした本処理
}
としたいという趣旨ならわかる
0927デフォルトの名無しさん2021/02/07(日) 10:18:17.21ID:jVPjdJHk
>>923-925
レスありがとうございます。

> 否定をtrueにするってどういうことだろ
> どう見ても$data.Contains('green')の方がわかりやすいと思うけど

$exec_shinai_jikan=@('01','02','03')
$imananji=Get-Date -Format HH

if ($exec_shinai_jikan -notcontains $imananji){
"実行するよ"
} else {
"実行しないよ"
}

実際のコード(一部)はこれです。変数名のセンスが独特ですよね・・(By 開発の人、私は開発じゃないです)といわれているので
出すのが恥ずかしかったんです。混乱を生んだようでして申し訳ない。

>で何が戻ってくるか確認すればなぜそう言うふうに動くかわかると思う

 ・0か0を超える値か
 ・nullかnullを除く何らかの値か

でtrue or falseが決まる感じでしょうか?
 
-notって、-notだけじゃ赤傍線引かれるけどなにがだめなんだと思ったら、-not〜って表現があったんですね。
ありがとうございます。
0929デフォルトの名無しさん2021/02/07(日) 10:24:14.00ID:fgGFki9a
なるほどそういう感じか
-not演算子のハイフン書き忘れてた
ごめんね
0930デフォルトの名無しさん2021/02/07(日) 10:26:29.15ID:fgGFki9a
>>923
($data -eq 'green').Count -eq 0
これってgreenが含まれない場合は最初の-eq演算による絞り込み結果が$nullになって
ぬるぽになるかと思いきや$null.Countの呼び出しは特例的に0を返すんやね
またPowershellの妙な癖を覚えてしまった
0931デフォルトの名無しさん2021/02/07(日) 11:48:29.36ID:jX/y7Db/
>>930
> これってgreenが含まれない場合は最初の-eq演算による絞り込み結果が$nullになって
ならないよ、単に空の配列になるだけ
gm -inputobject ($data -eq 'yellow')
とかやればわかる
0934デフォルトの名無しさん2021/02/07(日) 20:57:33.01ID:rt2m338a
>>913,917
6.0で仕様変更された

https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/breaking-changes-ps6?view=powershell-7.1#unify-cmdlets-with-parameter--encoding-to-be-of-type-systemtextencoding-5080
-Encoding の値 Byteはファイルシステム プロバイダーのコマンドレットから削除されました。 新しいパラメーター -AsByteStream を使用して、入力としてバイト ストリームが必要なこと、あるいは出力がバイト ストリームであることを指定してください。
0935デフォルトの名無しさん2021/02/10(水) 10:00:24.88ID:hefdb5Yb
可変長配列数?的なものの実現方法を教えてください。
CSVを以下の通り加工したいのですが、

1554412,A,B,C,D
2176944,D,C,E,F,G,H,I,J
4887447,F,H,J,A,K

こんな感じのカンマ区切りcsvを

1554412,A
1554412,B
1554412,C
1554412,D
以下同じパターン

で成形したいのです。

csv区切り文字は必ずカンマで、
フィールド数は行により異なります。

行を読み込んで、配列に入れて〜、配列の最初のフィールドを入れて〜
とぼんやり想像しているのですが、「個数が定まっていない行を、配列に入れる方法」が想像つきません。
可変長配列数?的なものの実現方法を教えてください。
0936デフォルトの名無しさん2021/02/10(水) 18:12:00.38ID:hRqw8VTE
2つ目のカンマ or 改行まで読んでから要素数2の固定長配列に入れるのはどうですか。
エレガントな方法ではないと思うので、他の方の意見も参考にしてください
0937デフォルトの名無しさん2021/02/10(水) 18:19:41.40ID:hRqw8VTE
あ、A, D, FじゃなくてA, B, Cでしたか。
マルチバリューカラムになっているのを正規化したいんですね。
最初の一つ目だけ取るのと勘違いしてました。

1. 一行読んでstring
2. カンマでstring.splitしてstring[]
3. [1]からstring.lengthまでを、[0]とstring.joinして、string[]
4. 全行ループ
これでどうですか
0938デフォルトの名無しさん2021/02/10(水) 19:17:13.97ID:JrOSOdLx
PowerShell っぽくならこんな感じかな
'1554412,A,B,C,D', '2176944,D,C,E,F,G,H,I,J', '4887447,F,H,J,A,K' | %{
$a, $b = $_ -split ',', 2
$b -split ',' | %{ "$a,$_" }
}
0942デフォルトの名無しさん2021/02/10(水) 21:58:58.82ID:hefdb5Yb
>>937
とりあえず用は足せました。が、多分ご紹介の内容と全然違うことをやってると思います。
レスの内容が半分分かりませんでした。

>3. [1]からstring.lengthまでを
ここが猛烈にヒントになってこんな感じにしました。

foreach ($l in Get-Content C:\temp\test.txt) {
$l=$l.Split(",")
1..(($l.Length) - 1) | % {write-host ($l[0],$l[$_]) }
}

サンプルのコードをいただけると幸いです。

>>938
これも無事動きました。ありがとうございます。
%ってのを知りませんでした。

Powershell難しすぎです。
勉強してるんですが、正直心折れそうです。
bashはそこそこ使えるので行けるだろと思ってたんですが、ナメてました。
死にそうです。
0943デフォルトの名無しさん2021/02/10(水) 22:00:44.14ID:hefdb5Yb
>>942
自己レスすいません。

これも結局、

write-host ($l[0],$l[$_]) }
で間をカンマ区切りにしたかったんですけど、
1時間手を変え品を変えで結局ダメでした。

何が悪いんでしょうか。
0944デフォルトの名無しさん2021/02/10(水) 22:12:55.91ID:hefdb5Yb
何度もすいません。

write-hostで標準で区切り文字が半角スペースになってるという事実がやっとわかりました。
{write-host -Separator "," $l[0]$l[$_]}

で無事に希望の出力を得ることができました。

ありがとうございました。
0945デフォルトの名無しさん2021/02/11(木) 00:08:14.80ID:lj0aoxL+
すっきり書けなくてもどかしい
$csv -split "\r\n" | % { $a = $_ -split ','; $a[1..($a.Count - 1)] } | % { $a[0], $_ -join ',' }
0947デフォルトの名無しさん2021/02/12(金) 09:16:23.07ID:q/2+I+Zd
$?で直前のコマンドの実行結果を知ることができますが、
直前に実行したコマンドのPIDを知る方法ってありませんか?

Start-Process -FilePath c:\bin\command.exe -ArgumentList 1
$cmd1pid=get-chokuzenn-pid
$cmd1pid
78968

Start-Process -FilePath c:\bin\command.exe -ArgumentList 2
$cmd1pid=get-chokuzenn-pid
$cmd1pid
4292

実際に動かしたいのは、ttpmacro.exe(Teratermのマクロ)です。
Teratemマクロで外部の機器にsshで接続して、ssh接続のログの内容を見て
そのプロセスを終了させるか判断したいと思っております

書こうとしているスクリプトを動かす時点で、1個もTeratermが動いていないなら、
Get-Processでなんとかなると思うのですが、上記スクリプトを実行する時点で
ほかのTeratermが動いている可能性があり、それを間違って死なすわけにはいかず、
Powershellスクリプト内で、Start-Processなりで動かした、直前のプロセスのIDを知る方法があればと思い相談させていただきます

すいません、よろしくお願いいたします。
0948デフォルトの名無しさん2021/02/12(金) 09:17:40.74ID:q/2+I+Zd
test.ps1

Start-Process -FilePath c:\bin\command.exe -ArgumentList 1
$cmd1pid=get-chokuzenn-pid
$cmd1pid
78968

Start-Process -FilePath c:\bin\command.exe -ArgumentList 2
$cmd2pid=get-chokuzenn-pid
$cmd2pid
4292


すいません、スクリプトの例に誤りがありました
訂正します
0951デフォルトの名無しさん2021/02/12(金) 11:17:25.75ID:jxDcSv/l
>>947
プロセスIdなんて取る必要ない(むしろ危険)
>>950が言うように-PassThruオプションつけるとSystem.Diagnostics.Processオブジェクトが返ってくるからKill()メソッド呼ぶだけでいい
0954デフォルトの名無しさん2021/02/13(土) 18:04:24.59ID:elIMNXvv
音楽プレーヤーで MP3 ファイルをシャッフル再生させたいので、
dir /n /-b /s *.mp3 > playlist.txt
の結果をランダムに入れ替えるにはどうすればいいでしょうか?

(乱数で再生する行を求めると同じ曲がつづくかもしれないのでシャッフルにしたい。)
0958デフォルトの名無しさん2021/02/13(土) 21:14:23.98ID:D/l9Txdy
自分の音楽コレクションのプレイリスト作る要件なら速度は別にと思わなくもない
5分とか掛かるならちょとやだけど
0959デフォルトの名無しさん2021/02/13(土) 21:58:32.75ID:WEbw7iAW
プレイリストのランダム再生機能ぐらい大抵のプレイヤーに付いてるだろうに
0960デフォルトの名無しさん2021/02/13(土) 22:34:07.74ID:XvWS5Qrl
>>957 のリンク先のコードで質問です
勉強のためちょこちょこ編集してみたところ、
「なんでこれで変数の中がランダムにおきかわるの?」と疑問がわきました

$r = @(1,2,3,4,5,6,7,8,9,10)
$r=($r | sort -Property @{Exp={[Guid]::NewGuid()}})
$r

$foo = @(1,2,3,4,5,6,7,8,9,10)
$foo[0] = $foo | sort -prop @{Exp={[Guid]::NewGuid()}}
$foo[0]

前者のように、$rの中身を $r | sort -Prop〜で置き換えるというのなら納得がいくんですが、
なぜ、後者のように、書いてもランダムになるのかが納得いきません
変数定義はパイプの前の話で、どうしてそれがパイプ先の、ランダムにする操作で置き換わるのでしょうか。
0961デフォルトの名無しさん2021/02/13(土) 22:48:16.31ID:PYtZn7CJ
>>960
やってることは同じで結果が単に$foo[0]に入ってるだけ
$foo[1]~$foo[9] の内容は変わってないはず
ちなみに置き換えてるわけじゃなくて新しい配列を作ってそれを$rとか$foo[0]に入れてる
0962デフォルトの名無しさん2021/02/13(土) 22:59:06.67ID:XvWS5Qrl
>>961
ありがとうございます
書き方が違うけど処理が同じというとらえ方でいいですか?

"パターン1"
$foo = @(1,2,3,4,5,6,7,8,9,10)
$foo=($foo | sort -prop @{Exp={[Guid]::NewGuid()}})
$foo

"パターン2"
$foo = @(1,2,3,4,5,6,7,8,9,10)
$foo = $foo | sort -prop @{Exp={[Guid]::NewGuid()}}
$foo

パターン1の書き方違いが、パターン2のようなとらえ方でいいでしょうか?
0963デフォルトの名無しさん2021/02/13(土) 23:33:24.56ID:PYtZn7CJ
>>962
ああ、すまん ( ) は見落としてた
パターン1は単に式を ( ) で包んでるだけだからパターン2と同じと思っていい
09649542021/02/13(土) 23:36:43.19ID:elIMNXvv
Get-ChildItem -path d:\ -filter *.mp3 -recurse | foreach {$_.FullName} | sort {Get-Random}
や、
Get-ChildItem -path d:\ -filter *.mp3 -recurse | foreach {$_.FullName} | sort -prop @{Exp={[Guid]::NewGuid()}}

でうまくいきそうです。 ありがとうございました。
0965デフォルトの名無しさん2021/02/14(日) 00:07:20.96ID:rA0IJrKX
>>963
ありがとうございますよくわかりました

パイプで処理がわかれると思っておりましたが、
=で右辺と左辺に分ててる感じなんですね
0966デフォルトの名無しさん2021/02/14(日) 00:22:33.69ID:D24G58JB
>>964
上手く行って何より

蛇足だけど
> foreach {$_.FullName}
の所は PowerShell 的には
> Select-Object FullName
でもいいかな
0967デフォルトの名無しさん2021/02/14(日) 00:28:18.02ID:D24G58JB
>>965
他の言語に似せるためか代入文は最優先で解釈されるようになってるみたい
まあよくわからなかったら多少余分でも ( ) を付けといた方があとから見ても誤解されにくいと思う
0969デフォルトの名無しさん2021/02/23(火) 08:20:29.72ID:XBzTqCMZ
posh-git と GetChildItemColor
でダイブましになった

他にもおすすめあったらおせーて!
0970デフォルトの名無しさん2021/02/23(火) 20:50:03.67ID:8GGn/OTs
GetChildItemColorを入れるとシンボリックリンクのリンク先のパスが表示されなくなるのがクソ
0971デフォルトの名無しさん2021/03/02(火) 00:20:13.77ID:NQgDi+il
#test.ps1
param([array]$foo)

echo ('$ARGS[0]' +':'+ $ARGS[0])
echo ('$foo[0]' +':'+ $foo[0])
echo ('$foo[1]' +':'+ $foo[1])
echo ('$foo[2]' +':'+ $foo[2])

PS> .\test.ps1 aaa -foo bbb,ccc,ddd
$ARGS[0]:aaa
$foo[0]:bbb
$foo[1]:ccc
$foo[2]:ddd

PS> .\test.ps1 aaa -bar bbb,ccc,ddd
$ARGS[0]:-bar
$foo[0]:aaa
$foo[1]:
$foo[2]:

PS C:\script>
PS> \test.ps1 aaa
$ARGS[0]:
$foo[0]:aaa
$foo[1]:
$foo[2]:

@引数やパラメータの数、パラメーター名などのエラーをチェックする方法を教えてください。
Aパラメータの区切りをカンマで無くスペースにする方法があれば教えてください。

ググってみたのですが、ググり方が悪いのか、見つからず苦しんでおります
0972デフォルトの名無しさん2021/03/02(火) 00:22:05.89ID:NQgDi+il
>>971
行数制限に引っかかったので分割します。

@は引数〇個、パラメーター名foo、パラメーターfooの数、fooが1個以上(0はだめ)というのをチェックしたいです。

なにとぞよろしくお願いいたします。
0974デフォルトの名無しさん2021/03/02(火) 23:49:57.97ID:NQgDi+il
>>973
ありがとうございます。
読み解くのに時間がかかりそうですが、
希望のものが書いてありそうです。
0975デフォルトの名無しさん2021/03/03(水) 03:07:24.22ID:hWQCqBl5
そもそもPowerShellの関数(コマンドレット)は空白区切りで引数渡すんだけどね
>>971はカンマ区切りで引数を渡してるんじゃなくて、カンマで作った配列を渡してるだけ
自動変数の$args(配列)はjavascriptでいう残余引数みたいな物

PS> .\test.ps1 aaa -foo bbb,ccc,ddd
名前付き引数 $foo に配列 bbb,ccc,ddd が渡され、未定義の aaa が $args に渡されてる

PS> .\test.ps1 aaa -bar bbb,ccc,ddd
$foo に先頭の引数 aaa が渡され、未定義の -bar と配列 bbb,ccc,ddd が $args に渡される

特にオプションを指定しなければ、複数の引数を設定すれば空白区切りで渡せる
0976デフォルトの名無しさん2021/03/12(金) 15:14:39.63ID:VgGpSMHu
PowerShell起動すると毎回更新しろって出るのがウザくて7入れてみたけど起動時の立ち上がりが遅くなって切れそう
しかも結局help云々が毎回出るし
MS頭おかしいんでねーの
0979デフォルトの名無しさん2021/03/13(土) 14:33:26.87ID:LuYPD+lh
| where-objectで、条件に引っかかったら0(True)、引っかからなかったら1(False)を返す方法ってありませんでしょうか。

あるサービスの実行状態を知るために、こういうことをしてるんですが、

(Get-Service | Where-Object -Property Name -Match Adobe | Where-Object -Property Status -Match Running).length
1 ←AdobeがRunnningだった
0 ←AdobeがRunningじゃなかった

他に、もっとPowershellっぽい書き方があったら教えてください
0980デフォルトの名無しさん2021/03/13(土) 14:59:52.96ID:4/YYKqK7
>>979
ワンライナーにこだわっているのか?
0981デフォルトの名無しさん2021/03/13(土) 15:31:11.30ID:33EHGK5P
Ruby の3項演算子みたいなものは無いの?

真偽値となる条件式 ? 真の時の値 : 偽の時の値
0986デフォルトの名無しさん2021/03/14(日) 21:46:47.24ID:8YYOAayf
連想配列の参照渡しで
function f([ref]$h) { $h.value }
$h = @{ a = 0; b = 1}
f([ref]$h)
はうまくいくんだけど、引数もう一個増やして
function f([ref]$h, $s) { $h.value; $s }
$h = @{ a = 0; b = 1}
$s = 2
f([ref]$h, $s)
にすると、
f : パラメーター 'h' の引数変換を処理できません。引数には参照型を指定する必要があります。
何が悪いん?ググっても見つけられなくてさっきから悩んでる(汗
0990デフォルトの名無しさん2021/03/15(月) 15:30:15.42ID:2OtrSpOH
カッコとカンマで引数渡すのはオブジェクトのメソッドの時だけだね
関数はスペース区切りで渡す

これは文法だから理由はない
0991デフォルトの名無しさん2021/03/15(月) 16:45:16.26ID:bRJV5TtK
1, 2 で配列作っちゃうようにしちゃったからねぇ
記法がシェルスクリプトとプログラム言語のあいの子みたいになってるからちょっと直感に反する所がちらほら見え隠れするのはしょうがない
0992デフォルトの名無しさん2021/03/16(火) 23:02:58.87ID:Bd62bkLQ
>>985
処理の方法が多いことは、可読性が落ちる原因にもなる。
PythonをもちあげてPerlをくさす時に使われたのと同じ論法だよ。
0995デフォルトの名無しさん2021/03/17(水) 08:38:00.89ID:sqd1XF3h
Why did you do that? $VAR/ {} / Weak Intellisense
https://docs.microsoft.com/en-us/archive/blogs/monad/why-did-you-do-that-var-weak-intellisense

The $ in front of variables comes from our design center of being an interactive command oriented shell.
Interactive shells are NOT the same thing as Scripting languages with command interpretors.
Interactive shells are case studies in engineering tradeoffs (another way of saying that is that they tend to be a little quirky).
There is a tension between the needs of a great interactive experience and a great scripting/programming experience.
Time and time again during the course of the project, people would try to make us "choose" between one or the other.
We refused.

We believe that if you work hard enough at it, you can solve the puzzle and provide a great solution for both.
We were absolutely subborn on this point. Time and time again, we were able to succeed with this approach if we travailed long enough.
0996デフォルトの名無しさん2021/03/17(水) 11:52:58.50ID:eAjGywmP
interactive性は'標準で'エイリアスが定義されてることで十分満足してる
10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 441日 9時間 26分 17秒
10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況