2ch勢いランキング アーカイブ

Windows PowerShell Part4


名無し~3.EXE [sage] 2013/02/01(金) 20:56:18.41 :smf9IDtL
Windows PowerShell
ttp://technet.microsoft.com/ja-JP/scriptcenter/dd742419.aspx
オンラインヘルプ(英語のみ、日本語版は2013年春〜後半公開予定)
ttp://technet.microsoft.com/en-us/library/bb978526.aspx

■パッケージのダウンロード
PowerShell 3.0 (Windows 7以降)
ttp://www.microsoft.com/en-us/download/details.aspx?id=34595

PowerShell 2.0 (Vista以前は3.0非対応)
ttp://support.microsoft.com/?kbid=926140

■参考
ttp://www.atmarkit.co.jp/fdotnet/special/powershell01/powershell01_01.html
ttp://oka326.blogspot.com/search/label/PowerShell
ttp://d.hatena.ne.jp/newpops/
ttp://blogs.msdn.com/PowerShell

■過去スレ
Windows PowerShell (正式版リリース)1.0
ttp://pc11.2ch.net/test/read.cgi/win/1163764836/
Windows PowerShell 2.0
ttp://pc12.2ch.net/test/read.cgi/win/1221046998/
Windows PowerShell 2.0 Part2
ttp://toro.2ch.net/test/read.cgi/win/1261106064/
名無し~3.EXE [sage] 2013/02/01(金) 22:57:56.24 :P16cmkUb
ほえ
名無し~3.EXE [sage] 2013/02/02(土) 15:31:42.88 :5A0M16UM
PowerShellでXMLファイルのタグ間のスペースや改行を全て削除して1行にしてしまうことは出来るのでしょうか?
名無し~3.EXE [sage] 2013/02/05(火) 01:10:24.76 :PPHkdWV+
DOSの「echo off」みたいにコマンド自体を出力させないことは出来ますか?
名無し~3.EXE [sage] 2013/02/06(水) 02:07:58.27 :UAu+l7P7
結局いまだに、
UNIX系OS -> ssh/telnet -> windows
でログインして powershell をまともに使う方法ってないの?
名無し~3.EXE [sage] 2013/02/07(木) 00:33:44.04 :AJ2IePn6
かなり前からPowerShell Serverあるじゃん
名無し~3.EXE [sage] 2013/02/07(木) 07:44:59.62 :dZcBLVES
PowerShell Serverで接続して、日本語っつか、
マルチバイト文字列まともに表示できてる?
もしできてるなら、やり方教えてちょーだい
名無し~3.EXE [sage] 2013/02/07(木) 21:00:23.26 :7/PPpfYU
あー、日本語表示は駄目っぽいかな?
名無し~3.EXE [sage] 2013/02/07(木) 21:54:32.03 :dZcBLVES
むー、やっぱダメなんだよね。
自分的には、Windowsいじるのに日本語使えないってのは
きつすぎる制限なので…

UNIX系OSからの ssh/telnetでマルチバイト文字列表示不可ってのは、
Win8/2012 + PowerShell3.0 + PowerShell Server
か、
Win8/2012 + PowerShell3.0 + OS付属の telnetサーバ
で修正されてたりしないのかな?
誰か確認した人いる?
名無し~3.EXE [sage] 2013/02/07(木) 22:12:05.01 :7/PPpfYU
2012でいいならPowerShell Web Accessっていう任意のブラウザからリモートできる機能はあるよ
ttp://viewse.blogspot.jp/2013/01/windows-server-2012-powershell-web.html
名無し~3.EXE [sage] 2013/02/07(木) 23:07:40.30 :dZcBLVES

情報ありがと。
残念ながらWin8/2012どっちも持ってなかったりする。
質問の意図は、もしWin8/2012で直ってたら、そのうち 7/2008に
hotfixが来る希望が持てるかも、と思ってのことなのよ。

つか、2012の新機能に sshサーバ機能つけるんじゃなくて
「Powershell Webアクセス機能つけますた!」とか、
相変わらず MS ってずれてるよね。

なんかこの PowerShell Web Access にしても、
たとえば ubuntu上の firefox/chrome/opera辺りから
使ってちゃんと機能するのかな?
具体的にはタブ補完がストレスなく機能するかどうかが気になる。
名無し~3.EXE [sage] 2013/02/08(金) 21:39:15.24 :zuNTw9S7

タブ補完はできるけど使用制限はいくつかあるみたいだね
technet.microsoft.com/ja-jp/library/hh831417.aspx#BKMK_web
(リンク貼れないのでスキーム削除)
名無し~3.EXE [sage] 2013/02/11(月) 23:45:51.31 :VDCPnsYt
そんなこんなでpowershell.exe上でGUIライクなキーバインドとUIを再現してみた
Shift+矢印でテキスト選択してコピーとか切り取りとか貼り付けとかその辺
PowerShell ISEのコンソール使えばいいじゃん、とか思わない人向け

(V3限定)
ttp://gallery.technet.microsoft.com/scriptcenter/WindowsKeyBinding-for-60fb0d55

zipファイルをダウンロードして解凍したフォルダを
環境変数%PSModulePath%に入ってるパス直下に置いたら
Import-Module WindowsKeyBinding で使えるようになるはず

元に戻す(Ctrl+Z)は実装してないし、複数行編集機能とかはないです
奇特な人は使ってみてくださいな
名無し~3.EXE [sage] 2013/02/12(火) 20:55:13.05 :RSrnhbKH

ちょっと中の人にメールしてみたんだけど
WireEncodingっていうので文字コードの設定はできるよーって言われた
PowerShell Serverのウインドウの 「Other」タブにWireEncodingって
プルダウンメニューがあるからそれで変更してみてってことなんだけど
自分のはコマーシャルユースだからかそういうメニューはなかった


で、ヘルプ見たらレジストリで直接指定できるらしい
↓参考に編集した
ttp://www.powershellmagazine.com/2011/12/27/powershell-linux-to-windows-integration-encoding-problem/
HKEY_LOCAL_MACHINE\SOFTWARE\PowerShellInside\PowerShellServer に
WireEncodingを自分で追加していろいろエンコード指定できる
メールでもらったところによると日本語関係は

UTF-8 → UTF-8
Japanese (JIS) → iso-2022-jp,
Japanese (JIS-Allow 1 byte Kana) → csISO2022JP,
Japanese (JIS-Allow 1 byte Kana - SO/SI) → iso-2022-jp,
Japanese (EUC) → euc-jp

みたいな感じ
自分の場合は「iso-2022-jp」を値としてセットしたら無事日本語ファイル名もlsで表示できるようになったよ
11 [sage] 2013/02/13(水) 01:10:32.62 :sKV7QqvQ

ううううううぅぅうぅっひょーぅぅぅぅうううううう!!!
ありがとー、ありがとー、ありがとー、ありがとー!!!
まじでいけたよ。これでちょっと楽しい PowerShell ライフをすごせるぜ。

環境
 server: windows server 2003 R2 SP2 + PowerShell Server 5.0.0.4482 Personal Edition
 client: debian squeeze 6.0.6 + openssh-client 1:5.5p1-6+squeeze3

手順
 1. サーバ側に PowerShell Server インストール
 2. PowerShell Server レジストリの設定
   # powershell 起動 -> 下記実行(値として UTF-8を指定)
   New-ItemProperty hklm:\SOFTWARE\PowerShellInside\PowerShellServer WireEncoding -PropertyType String -Value UTF-8
 3. PowerShell Server Service Restart
 4. クライアントから接続、今回はmltermを使用 LANGはja_JP.UTF-8
   # "TERM=vt100" はけっこう重要。これで Clear-Hostや方向キーとかが効くようになる
   TERM=vt100 ssh -l username ip_address
 5. 日本語表示の確認 ↓とかしてみる
   Get-Help about_windows_powershell_2.0

ちなみに、v5のPersonal Editionでは、「Other」タブに
WireEncodingプルダウンメニューはありませんでした。

いやでもまじでうれしいわー、ほんとにありがと。
名無し~3.EXE [sage] 2013/02/13(水) 08:20:26.02 :OycAsz/I
,15 乙

さっき確認したら、PowerShell Server V5 HelpにちゃんとWireEncodingのことは
書いてあったけど、あれを見つけるのはやっぱちょっときびしいよなぁ…
まぁでもなんか、ちゃんと書いてあったから /n softwareに対する好感度は上がったわ。

んで、"PowerShell Server" WireEncoding でググってみたら、
ttp://https://www.google.com/search?q=%22PowerShell+Server%22+WireEncoding&">ttps://www.google.com/search?q=%22PowerShell+Server%22+WireEncoding&;complete=0&safe=off&num=100&hl=ja&lr=&tbo=1&sei=askaUez9D-TAmQWNj4CoBA&gbv=2
>>14が日本国内で ssh越しのpowershellで
日本語使用できた最初の人物てことだったりするのかな?
うーむ、なんかすげーな、快挙だ。
名無し~3.EXE [sage] 2013/02/13(水) 23:58:32.62 :zCDglrPc
いやまあメールしたのが快挙っていうなら快挙なんだろうけど、素直に中の人褒めてあげてw
夜中の8時にメール出して次の日の午前中には返信くれたんだしさ(日本時間換算で)
名無し~3.EXE [sage] 2013/02/15(金) 01:54:42.69 :kjpS2zqC
ぶった切って悪いが、メモ帳といいPowerShellの-Encodingオプションといい
なんでEUC-JPが指定できないんだろうね。
もしかしてSUNを敵対視するMSの戦略なのかな?
名無し~3.EXE [sage] 2013/02/15(金) 03:32:23.95 :9ndxPvVm
ほぼすべてのUNIX系OSは UTF-8へ移行済みなんだから、
その考え方は違うんじゃないの?
まだ単に MSKKが頑張らなかったって方が説得力あるわ。
まぁでも、古いOSが残ってて実運用上困るっていうか
めんどくさいのはわかるんだけどさ。
名無し~3.EXE [sage] 2013/02/15(金) 05:14:00.88 :9ndxPvVm
思い出したから、PowerShell 3.0のドキュメント類のURL貼っとく。
他にも見つけたらどんどん貼っていこうぜ。

Download Windows PowerShell Language Specification Version 3.0
ttp://www.microsoft.com/en-us/download/details.aspx?id=36389
Download Windows PowerShell and Server Manager Quick References
ttp://www.microsoft.com/en-us/download/details.aspx?id=30002
Download Windows PowerShell and Microsoft Management Console 3.0 Quick Start Labs
ttp://www.microsoft.com/en-us/download/details.aspx?id=12971

ついで。
The complete list of PowerShell ISE 3.0 keyboard shortcuts
ttp://www.powershellmagazine.com/2013/01/29/the-complete-list-of-powershell-ise-3-0-keyboard-shortcuts/
名無し~3.EXE [sage] 2013/02/15(金) 23:00:29.60 :T0Va3zKZ
-Encodingは単に、System.Text.Encodingクラスでよく使う?文字コードが静的メンバになってるから
じゃあうちらもそれに倣ってとりあえずそれだけ対応しとくかー、的なノリだと思う
以前Connectにもっと増やしてって要望は出したけど、ユーザーの需要は低かったよ
名無し~3.EXE [sage] 2013/02/23(土) 22:51:10.87 :lyOzc5Vv
さっきPowerShell Server V6が出てるのに気がついてPersonal Edition入れてみた。
PowerShell 3.0対応はやっぱありがたい。


んで、"Other"タブ -> Additional Settings -> Text Encoding で Encodingの
設定できるようになってるから、V6のことだったっぽいね。

PowerShell Server
ttp://www.powershellserver.com/order/
名無し~3.EXE [sage] 2013/02/24(日) 19:08:57.93 :IzryZIel
あるフォルダに文字コードがSJISとUTF8のテキストファイルが複数あり
そのファイル名と文字コードを一覧表示しようとしていますが

gci c:\tmp *.txt | select name

でファイル名は表示できたのですが、文字コードの表示の仕方がわかりません…
名無し~3.EXE [sage] 2013/02/24(日) 20:39:52.33 :CCwh23wu
少なくとも標準でそういう機能はない
nkfなりなんなり拾って来ないと
名無し~3.EXE [sage] 2013/02/24(日) 22:36:40.04 :IzryZIel

そうなのですか…
実はUTF8の方は1バイト目がFE、2バイト目がFFで始まるということが判明したので
これで何とか出来ないか調べていたのですが、私にはハードルが高すぎましたw
もう少しググってみます。
名無し~3.EXE [sage] 2013/02/27(水) 19:02:14.30 :FyrWNfjS
X日以上前のファイルを消したいのですが
$file_listが空の場合にCreationTimeで
MethodCountColudNotFindBestエラーが発生します。
空なのになぜforeachの中に入っていくのですか?

$file_list = Get-ChileItem DIR -Recurse
foreach( $file in $file_list ){
$diff = ((Get-Date) - $file.CreationTime).Days
}
名無し~3.EXE [sage] 2013/02/27(水) 21:02:58.59 :Q2Y9j4YZ

確認はしてないけど、powershell 3.0 ならこれが使えるんじゃない?

GetContent.Encoding Property (Microsoft.PowerShell.Management.Activities)
ttp://msdn.microsoft.com/en-us/library/microsoft.powershell.management.activities.getcontent.encoding%28v=vs.85%29.aspx
名無し~3.EXE [sage] 2013/03/06(水) 00:39:26.43 :J9FxhtYe
CSVファイルをconvertfrom-csvでオブジェクト化して
sort-objectで1列目と2列目をキーに並べ替えてるのだけど
「1列目で昇順かつ2列目で降順」みたいに列毎に
異なるソートオーダーを指定するにはどうすればよいのでしょうか?
名無し~3.EXE [sage] 2013/03/06(水) 11:24:22.99 :1pVvA2v8
昇順ソートして逆にしたい列だけ頭から入れ替えて配列に入れてもっかいCSVにすりゃいいんじゃないですかね
列ごとにソート入れ替えて構造ぶっ壊すことに何の意味があるんだか知らんけど
名無し~3.EXE [sage] 2013/03/06(水) 19:55:16.75 :mk6DN1pj

Sort-Object @{E="1列目キー名";Ascending=$true},@{E="2列目キー名";Descending=$true}
みたいな?
名無し~3.EXE [sage] 2013/03/06(水) 19:57:47.30 :mk6DN1pj

それPowerShell2.0までの仕様
3.0では直ってる
名無し~3.EXE [sage] 2013/03/06(水) 23:21:58.01 :J9FxhtYe

言ってる意味がよくわからんとです…


出来ました!ありがとうございます!
ググっても全然わからなかったので助かりました。

gci -r | Sort-Object @{E="directoryname";Ascending=$true},@{E="lastwritetime";Descending=$true}
名無し~3.EXE [sage] 2013/03/09(土) 12:57:54.52 :EtopiWLs
あるサイトで見かけたんだけど、Get-Contentでファイル内容取得する時に

(gc a.txt) -ne ""

って書くと空行を除外出来るんだね。
他にも面白い書き方ってあるのかな?
名無し~3.EXE [sage] 2013/03/10(日) 13:22:17.17 :anqyefhn
気がついたら、過去の異物のようなスクリプトになったよな。
色つきでファイル一覧出すようにいろいろやったら、ファイルにリダイレクトできないとか、なんだよこれ的な。
名無し~3.EXE [sage] 2013/03/11(月) 23:50:06.37 :EbbX4PbJ
のは
gci -r | Sort @{E="directoryname"},@{E="lastwritetime";D=$true}
でもいけるな。
最近どれだけ短縮できるか試すのが趣味になってきたw
get-helpもhelpでいけるし、些細だがオプションの-fullも-fulでいける。
名無し~3.EXE [sage] 2013/03/18(月) 22:01:16.89 :EH72HxRl
スクリプトファイル(拡張子ps1)を実行した時に開くPowerShellのウインドウを最前面固定表示させる方法はあるのしょうか?
もしくはスクリプトファイル内のコードでメッセージボックスを表示してそのメッセージボックスが最前面固定表示されるということでもよいのですが?
名無し~3.EXE [sage] 2013/03/22(金) 21:49:17.05 :jrvx7jh0
SetForegroundWindow
36 [sage] 2013/03/24(日) 09:30:43.67 :qAYOPSLY

ありがとうございます。その関数名でググって以下のコードを実行しましたが
スタートボタン右側のPowershellのアプリアイコンが点滅するだけで
最前面に出てこないようです、ぐぬぬ…
(ちなみに実行したらすぐ他のアプリを最前面に出し、3秒後にPowershellのアプリが最前面に出てくるかを試しました)
もう少し調べてみます。

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
"@
$h = (Get-Process -id $pid).MainWindowHandle
sleep -sec 3;
[Tricks]::SetForegroundWindow($h)
名無し~3.EXE [sage] 2013/03/24(日) 15:40:55.33 :1DAbsddX
//Form1.cs
Form2 f = new Form2();
f.Owner = this;
f.TopMost = true;
f.Text = "Alarm Clock";
f.GetOtherFormTextBox();
f.Show();
名無し~3.EXE [sage] 2013/03/25(月) 14:06:38.63 :P63WGLv/
C#でプログラム作ったほうが手っ取り早くないか?
名無し~3.EXE [sage] 2013/04/01(月) 01:40:07.08 :yHOeJADt
これ興味あるんだけど、まだぜんぜん勉強してない。
見た感じ、JavaScriptにちょっと似てる気がするんだけど、JavaScript使いなら取っ付きやすいかな?
それにしても、Unixのシェルとはまったく似ても似つかないシェルですね。
名無し~3.EXE [sage] 2013/04/01(月) 10:35:59.35 :QWDBrUta
Shell+Perl みたいなもんかな。
とりあえずPerl知ってりゃ、解説書読みながらすぐ書ける
でも、結局ちょっと突っ込んだことやろうとすると.netの知識が必要になるし、
プログラム言語としては、コーディングしながらエラーも表示してくれるVS+C#で、
ttp://dobon.net/vb/dotnet/index.html
見ながらの方が手っ取り早いことがわかった。
名無し~3.EXE [sage] 2013/04/01(月) 10:39:02.88 :QWDBrUta
UnixでC/C++使ってたときは補助的にシェルスクリプトが必須だったが、
WindowsだとC#だけでほぼ事足りるかな?
いつまでたってもVSで開発環境できないし。
名無し~3.EXE [sage] 2013/04/01(月) 23:04:51.68 :WKr3+D0n
良さが伝わらなかったか。残念。
名無し~3.EXE [sage] 2013/04/05(金) 23:10:55.52 :92UulP1I
PowerShellServerって何が出来んの
名無し~3.EXE [sage] 2013/04/06(土) 01:02:00.08 :EOLiam6e

名無し~3.EXE [sage] 2013/04/06(土) 02:36:55.33 :3dHuatwa
Visual StudioにPSも取り込まれるって話なかった?
名無し~3.EXE [sage] 2013/04/13(土) 18:50:10.18 :HoxSXCBU
そもそもなんでVSやC#が出てくるのか意味不明なんだが
なにをやろうとしてんの?
名無し~3.EXE [sage] 2013/04/14(日) 01:44:12.22 :j4V6CaxB
【速報】ついに俺氏が重い腰を上げてPowerShellはじめる
名無し~3.EXE [sage] 2013/04/14(日) 06:40:12.54 :Rk2nk+F5

開発環境としていろんな支援があるVSの話が出てきても悪くないだろ
C#は.netの主力開発言語、PSにしたって結局.net上で動いて、ちょっと凝ったことをやりたきゃ
.netのライブラリ使う羽目になるだろ。それだったらコンパイルの手間は要るけどはじめからC#使っても同じってこと。
実際PSで作りだめたスクリプトをC#に移植したわ。PSのファイルに"[]"を含む場合のバグ問題もなく実にスンなり移植できた。
これだけ.netのライブラリが豊富だとシェルスクリプト持ち出してくる必然性があんまないんだな。
Perl使ってるときスクリプト言語特有の連想配列とか便利だなと思ったけど
C#でもハッシュテーブル使えるしな。
コマンドプロンプトと同じく、プログラム未満のコマンドラインとしての存在意義はあると思うけどさ。
名無し~3.EXE [sage] 2013/04/15(月) 00:45:35.21 :LgG6I3Da
客先常駐とかで仕事してるとps1ファイルを実行できるように権限変えることが出来なかったりするからな。
結局ISEにコード貼り付けて実行したりbatファイルと組み合わせたりしてる。
名無し~3.EXE [sage] 2013/04/15(月) 22:15:14.80 :HfyxT8zE
Import-Csv -Path hoge.csv | Sort-Object { [int]$_.pk1,$_.pk2 }

みたいな事を、{ [int]$_.pk1,$_.pk2 } の部分を動的に指定するにはどうすればよいでしょう?

型変換不要ならば、

$sortKeys = @( 'pk1','pk2' )
Import-Csv -Path hoge.csv | Sort-Object -Property $sortKeys

の様な感じにすればできるんですが。
名無し~3.EXE [sage] 2013/04/16(火) 01:18:52.76 :oRbHsI59

数値列をゼロ埋めで桁数固定にして文字として扱えば型変換不要だがどうよ?
ってダメだろうなあ…w
名無し~3.EXE [sage] 2013/04/16(火) 21:12:52.16 :J3OAKPis

ありがとうございます。
結局、ForEach-Objectで個別に型変換して対応しました。

ちょー省略すると、

$sortKeys = @( 'pk1','pk2' )
Import-Csv -Path hoge.csv |
ForEach-Object -Process {
$_.pk1 = [int]$_.pk1 # <- 本当は整数型にすべきカラムを判定して変換している
$_
} |
Sort-Object -Property $sortKeys

みたいな感じです(^^;
名無し~3.EXE [sage] 2013/04/21(日) 20:13:06.72 :2H/ka75W
Get-Counterってプロセスの増減を取得できないんですかね?

$s = {$($(Get-Counter "\Process(*)\% Processor Time").CounterSamples).Count}
$o = Start-Process notepad -PassThru
&$s
$o | Stop-Process
&$s #←減った分がとれない
名無し~3.EXE [] 2013/05/02(木) 17:08:05.20 :zjmPKOf6
XP機を根絶できたので、今後のスクリプトはPowerShellに移行するぜ、
と意気込んでいたのに、拡張子が実行に関連付けられていないだの、
セキュリティポリシーの変更が必要だの、使わせる気ないのか

それならばと標準入力から喰わせてみたんだが、なぜかスクリプトの
一部が実行されたりされなかったり挙動がよくわからん


下のスクリプトを"-Command -"オプションでリダイレクト入力した場合
f2()を途中改行せずに1行にするか、#以降の末尾に改行を2つ以上
書くかしなければ、出力結果が"1 2"で止まってしまって"3"が出ない
これはバグなのかそれとも仕様?
Win8Pro64bitで確認、確かWin7のPowerShell3.0でも同じだったと思う

Write-Host 1
function f1() { }
Write-Host 2
function f2() {
}
Write-Host 3
#
56 [sage] 2013/05/02(木) 18:18:11.23 :zjmPKOf6
半日かけてようやく実行可能なバッチファイルが書けたわw
これで心置きなくPowerShellの学習を始められるというもの

PSの文法とかまだヌルい所があるはずなので添削求む
それか他にも同じようなことしてるblogとかないですかね?


@(":", "`""<#") 2>NUL
@POWERSHELL -Command - <%0
@EXIT /B
#>)|%{}

Write-Host "Hello world!"
名無し~3.EXE [sage] 2013/05/02(木) 18:30:12.57 :zjmPKOf6
あ、終了コード戻すの忘れてた
3行目 @EXIT /B %ERRORLEVEL%
名無し~3.EXE [sage] 2013/05/06(月) 12:43:59.56 :PtnoW0PE
あるソフトウェアのインストール前後でレジストリのどこに変更があったかをPowerShellで表示することはできますか?
名無し~3.EXE [sage] 2013/05/07(火) 10:55:07.14 :wzO23jzh

ギャグ?
名無し~3.EXE [sage] 2013/05/08(水) 14:32:55.69 :EFA3dg2I
放置よろ
名無し~3.EXE [] 2013/05/15(水) 00:15:29.62 :/++F9Bvl
LinuxやMacなどに対応したWindows PowerShell、ついに登場!もうWindows買わなくていいぞ
ttp://engawa.2ch.net/test/read.cgi/poverty/1368543510/
名無し~3.EXE [sage] 2013/05/15(水) 11:05:52.19 :QP8evULf
はっきりいってPowerShellは非Win環境でこそ本領発揮できるかもしれん
コマンド環境で結局.metの上にのってりゃ未来永劫DOSの代わりにならんし
非Win環境でもバーチャル環境で動くなら同じだけどな.

言語としてとってもいいとおもうけど
.net のライブラリがあまりに豊富すぎて補助言語として頼ることもあんまりない
名無し~3.EXE [sage] 2013/05/16(木) 10:09:43.03 :itkrrJnw
PowerShellはCOOL
名無し~3.EXE [sage] 2013/05/20(月) 21:59:44.78 :8t/QsC8y
すみません質問があるのですが、前スレの

>ps1の実行には必要でもps1を読んで実行する分には必要ない

という記述があり、ExecutionPolicyがRestrictedのままでも
ps1ファイルを実行する手段があるかのように受け止められるのですが
そのような方法があるのでしょうか?
名無し~3.EXE [sage] 2013/05/21(火) 10:56:15.98 :0tAMOPu9
っ PowerShellコマンド
名無し~3.EXE [sage] 2013/05/21(火) 11:31:52.91 :xV50CXXD
powershell -ExecutionPolicy RemoteSigned .\test.ps1

ttp://blogs.msdn.com/b/jaybaz_ms/archive/2007/04/26/powershell-polyglot.aspx
65 [sage] 2013/05/23(木) 00:28:50.12 :wUd2eF9W

ありがとうございます。こんなことが出来るのですね。
今日試しましたがschtasksの/trにこのまま書いたら
スケジュールした時刻にバッチリ動きました。
でもこれじゃExecutionPolicyの意味ないんじゃ…w
名無し~3.EXE [sage] 2013/05/24(金) 00:02:10.22 :cRNJAwAN
ぷっ
名無し~3.EXE [sage] 2013/05/25(土) 09:52:33.45 :n7h7yVSA
攻撃者がすでに対象のPCにログインしている状況なら、わざわざ実行ポリシー変更してどうこうしないよ
名無し~3.EXE [sage] 2013/05/26(日) 13:36:11.82 :bcqqEQci
名無し~3.EXE [sage] 2013/05/26(日) 16:46:52.25 :fl9FtV/o
まー分かんなかったら暇な時にでも読んでみて

PowerShell’s Security Guiding Principles
ttp://blogs.msdn.com/b/powershell/archive/2008/09/30/powershell-s-security-guiding-principles.aspx

Now, why is

PowerShell.exe ?ExecutionPolicy Bypass ?File c:\temp\bad-script.ps1

not a security bug? Ultimately, if bad code has the ability to run this code, it already has control of the machine.
名無し~3.EXE [sage] 2013/06/12(水) 11:47:55.94 :KnqvhY8H
PowerShellをエクスプローラからダブルクリックで起動すると、コマンドプロンプトの画面になってしまうのですが、
ランチャツールからの起動でもブルーの画面を出すにはどうすればいいでしょうか?
名無し~3.EXE [sage] 2013/06/14(金) 14:10:39.02 :Ogktd9xI
ショートカットを起動すりゃいいよ
名無し~3.EXE [] 2013/06/14(金) 19:54:49.02 :O/HHNdcE

表示された画面左上のプロパティで好きな色変えたら?
次に起動するときには変わってるよ。
コマンドプロンプト画面じゃなくてコンソールプログラム画面ね。
名無し~3.EXE [sage] 2013/07/01(月) NY:AN:NY.AN :6Gorspep
Windows PowerShell 4.0 Preview
ttp://www.microsoft.com/en-us/download/details.aspx?id=39347
名無し~3.EXE [sage] 2013/07/18(木) NY:AN:NY.AN :vNfij1oE
Windows 8.1 Preview インスコしたら PowerShell が Version 4.0 になっててびっくりした。
とりあえず Update-Help した。
名無し~3.EXE [sage] 2013/07/28(日) NY:AN:NY.AN :b0JCajYQ
一般ユーザでpowershellのコンソール開いて、
そこからコマンドで権限昇格することってできないんでしょうか?
(linuxのsuコマンドのように)

調べてはみたんですが方法がみつからなくて。。
コマンドで『管理者として実行』の状態にしたいんです。
名無し~3.EXE [sage] 2013/07/30(火) NY:AN:NY.AN :c5tbI6TT
そんなことができるとでも?
名無し~3.EXE [sage] 2013/07/30(火) NY:AN:NY.AN :SjHHym1J
-Credentialつけるんじゃだめなんか
名無し~3.EXE [sage] 2013/07/30(火) NY:AN:NY.AN :oOaSq9iE
なんでそうしたいのか書いた方が別の解決策を教えてもらえるかも
78 [sage] 2013/08/05(月) NY:AN:NY.AN :We+ZS8Ar
レスありがとうございます。


調べてみます。
 
ただ単純に「マウスを使わずにできないのかな?」って思っただけでした。。
名無し~3.EXE [sage] 2013/08/08(木) NY:AN:NY.AN :vlDQ9n5Z
別ウィンドウで良ければ$pshome\powershell.exe -verb runas
名無し~3.EXE [sage] 2013/08/08(木) NY:AN:NY.AN :vlDQ9n5Z

失敗した。
start-processつけないと。

> function su {start-process $pshome\powershell.exe -verb runas}
> su

こんな感じかな。
78 [sage] 2013/08/08(木) NY:AN:NY.AN :iLDShGTk

ありがとうございます!
やってみました。
こんな方法もあったんですね。
名無し~3.EXE [sage] 2013/08/08(木) NY:AN:NY.AN :VDs3Noo9
正規表現についてお聞きしたいのですが以下はなぜTrueになるのでしょうか?
「数字、文字、数字」という並びがないとTrueにならないと思うのですが?

PS C:\> $("123abc") -match "\d\w\d"
True
名無し~3.EXE [sage] 2013/08/08(木) NY:AN:NY.AN :2c1tYyj+
「\w」は文字ではなく単語なので数値も含んでます故
名無し~3.EXE [sage] 2013/08/09(金) NY:AN:NY.AN :s4EjgHz+

単語なのに数値も含むとは知りませんでした!
確かに「$("1") -match "\w"」でもTrueになりますね。
ご教授ありがとうございます。
名無し~3.EXE [sage] 2013/08/10(土) NY:AN:NY.AN :vBMk/Cjn
Poweshellは正規表現が強力みたいだけど
コマンドプロンプトで「"AAA"で始まるか又は"CCC"で終わり、かつ"BBB"を含む」行を
"C:\Temp"フォルダ内(サブフォルダ含む)の全テキストファイルから検索して表示する場合

findstr /s /r /c:"^AAA" /c:"CCC$" "C:\Temp\*.txt" | findstr /r /c:".*BBB"

みたいな正規表現によるOR検索とAND検索の組み合わせ検索をよくやるんだけど
これって簡単にPowershellに書き換えられるの?
名無し~3.EXE [sage] 2013/08/10(土) NY:AN:NY.AN :klVY5+KV

findstrに相当するのはselect-stringですね。
gci C:\temp -filter "*.txt" -recurse | % {select-string "^AAA.*BBB|BBB.*CCC$" $_.fullname -encoding default}
という感じでどうでしょうか。
名無し~3.EXE [sage] 2013/08/10(土) NY:AN:NY.AN :vBMk/Cjn

なるほどこんなに簡単に書けるんだね。
-encodingオプションあるのか!これならUTF8とかも検索できるし便利だなあ。
勉強になりました。どうもサンクスです。
名無し~3.EXE [sage] 2013/08/17(土) NY:AN:NY.AN :RjFEQbYE
ttp://tech.aainc.co.jp/archives/643

↑に住所にマッチする正規表現があったので↓のスクリプトを書いてみたのですが、実行するとエラーになります。
何か使えない文字があるのでしょうか?
「ccc 東京都千代田区永田町1−7−1 ddd」という結果を得たいのですが?

$a="aaa 東京都千代田区永田町1−7−1 bbb"
$a -replace "(([^"'=])((北海道|東京都|(大阪|京都)府|(神奈川|和歌山|鹿児島)県|[^\s\w\d ]{2}県)[^\s\w\d ]{1,6}[市郡区町村][^\s\w\d ]{1,20}[\d0-9〇一-九十上下東西]+[^\s '"<)」】]*))",'ccc $1 ddd'
名無し~3.EXE [sage] 2013/08/17(土) NY:AN:NY.AN :4N1MHd0p

ダブルクォート中にダブルクォートが入ってるから「`」でエスケープ
あとPowerShellは「\w」が半角英数字以外にもマッチするから「A-Za-z」とかに変える必要がある
名無し~3.EXE [sage] 2013/08/18(日) NY:AN:NY.AN :AGzu2vK6
面白そうなのでやってみた

> $a="aaa 東京都千代田区永田町1−7−1 bbb"
> $regex = [regex]"(([^`"'=])((北海道|東京都|(大阪|京都)府|(神奈川|和歌山|鹿児島)県|[^\s\w\d ]{2}県)[^\s\w\d ]{1,6}[市郡区町村][^\s\w\d ]{1,20}[\d0-9〇一-九十上下東西]+[^\s '`"<)」】]*))"
> $regex.Match($a).Success
False
> $regex = [regex]"(([^`"'=])((北海道|東京都|(大阪|京都)府|(神奈川|和歌山|鹿児島)県|[^a-zA-Z\s\d ]{2}県)[^a-zA-Z\s\d ]{1,6}[市郡区町村][^a-zA-Z\s\d ]{1,20}[\d0-9〇一-九十上下東西]+[^\s '`"<)」】]*))"
> $regex.Match($a).Success
True
> $regex.Match($a).Result("ccc `$1 ddd")
ccc 東京都千代田区永田町1−7−1 ddd

Wordはマルチバイトでもおkと。なるほど。
92 [sage] 2013/08/18(日) NY:AN:NY.AN :xIR2OqWI

ありがとうございます。正規表現は言語によって微妙に「\w」とかの意味が変わるんですね。
エスケープの仕方も知りませんでした…


試して頂いてありがとうございます。こんな書き方も出来るんですね。
申し訳ありませんが、まるっとコピーさせて頂きました(笑)
名無し~3.EXE [sage] 2013/09/01(日) 11:46:53.16 :fFVs7j+O
visual studio2012のコマンドラインツールのpowershell用セットアップスクリプトはMicrosoftから出ているのでしょうか?
powershellからmabuildやguidgenなどのコマンドラインツールを使いたいのですが設定方法がわかりません
コマンドプロンプト用の設定スクリプトをpowershellで実行しましたがうまく行きませんでした
名無し~3.EXE [sage] 2013/09/01(日) 16:40:10.41 :eE7viCPv

$env:path+=";C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools;C:\WINDOWS\Microsoft.NET\Framework\v3.5"
set-alias guiden "C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\guidgen.exe"
set-alias msbuild "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
としておけば
guiden
msbuild
と入力するだけで使えると思います。

msbuildはテスト出来なかったので環境変数の使い方

testという環境変数を作り、値を"aaaa"とします。
PS C:\> New-Item -Path env:test -Value "aaaa"

環境変数testに"bbbb"を代入します。
PS C:\> $env:test="bbbb"
PS C:\> $env:test
bbbb

環境変数testに"cccc"を追加します。 ($env:test+="cccc"と書いても同じです)
PS C:\> $env:test=$env:test + "cccc"
PS C:\> $env:test
bbbbcccc

環境変数testを削除します。
PS C:\> Remove-Item env:test
PS C:\> $env:test
PS C:\>

なお、環境変数やエイリアスはセッション終了(PowerShell終了)とともに消えます。
マイドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 に書いておけばPowerShell起動の度読み込んでくれます。
名無し~3.EXE [sage] 2013/09/01(日) 22:15:29.62 :mMSZhAI9

ありがとうございます

cmd用に書かれた設定スクリプトをそのまま再利用出来ないのは不便ですね
名無し~3.EXE [sage] 2013/09/15(日) 16:34:39.20 :nSfRh2yc
powershellで1からやるならいいんだろうけど
環境変数設定batすら動かないとやる気なくすよなあ
名無し~3.EXE [sage] 2013/09/15(日) 20:37:24.70 :NkOIlLsv
機械的に書き直せると思うけど、それも面倒なら
設定スクリプトの一番最後でPowerShellスクリプト呼び出せばいいんじゃない?
名無し~3.EXE [sage] 2013/09/15(日) 21:09:10.46 :QMDr6jpe

vcvarsall.batはbatにしちゃ長いし書き直しもそれなりに面倒
まったく同じことやるだけなのにわざわざ直す時間が惜しいという感覚はあるだろ
なに?そのPowerShellスクリプトをどうやって新たにつくるわけ?
名無し~3.EXE [sage] 2013/09/15(日) 22:06:13.82 :QA3l3UUR

いやvcvarsall.batがどうなってるのか持ってないから知らんけどね
基本set ほげほげ=ふがふが を機械的に $env:ほげほげ=ふがふがに置き換えればいいと思うけど

で、それも面倒ならvcvarsall.batの一番最後でスクリプト呼び出すなり
cmdでvcvarsall.bat呼び出した後にpowershell起動するなり
やりようはあると思うよ
名無し~3.EXE [sage] 2013/09/15(日) 23:35:24.23 :56qbimk1
もちろん必要なのはパス部分の数行だけど
まんまそのまま完全に使えるスクリプトがあるのに
小細工や機械的に書きなおす手間が面倒だって言ってんだけど噛み合ってないよね
無理に移行する価値があるのかも疑問だし

ってかちょっと強引な押し売りとか宗教の勧誘の手法みたいなところあるよね?
たいしてやる気がない人に押し付けてこなくていいから
99 [sage] 2013/09/15(日) 23:38:47.55 :56qbimk1
ってか
この2週間の間にに提案して欲しかったなあ
俺は茶々で特に積極的にやってるわけじゃないからレスされても困惑
名無し~3.EXE [sage] 2013/09/16(月) 00:02:02.99 :Sz0fR4Og
よく分からんがPowerShellスレで聞かれたことに答えるのは押し売りなのか・・・
名無し~3.EXE [sage] 2013/09/16(月) 05:28:24.03 :uHkT2fBv
bat再利用したいならPSから喚び出しゃいいだろ
コードそのまま置換したってパイプラインもPSObjectも.netも使わないならヤる意味が無い
名無し~3.EXE [sage] 2013/09/16(月) 17:30:19.33 :CdMzda7A
リモートでLAN内のPCをスリープさせたいと思って

[sleep.ps1]
$signature = @"
[DllImport("powrprof.dll")]
public static extern bool SetSuspendState(bool Hibernate,bool ForceCritical,bool DisableWakeEvent);
"@
$Sleep = Add-Type -memberDefinition $signature -namespace "Win32Functions" -name

"SetSuspendStateFunction" -passThru
'スリープします。'
$Sleep::SetSuspendState($false,$false,$false)


上記のスクリプトをInvoke-Commandで呼び出すことにしました。

$SO = New-PSSessionOption -OperationTimeOut 1000 -OpenTimeout 100 -CancelTimeout 100 -IdleTimeout 100
Invoke-Command 対象PC名 .\sleep.ps1 -SessionOption $SO


結果、対象PCは無事にスリープしてくれるのですが、

リモート サーバーからのデータの処理が失敗し、次のエラー メッセージが返されました。 (中略)
+ CategoryInfo : OperationStopped: (System.Manageme...pressionSyncJob:PSInvokeExpressionSyncJob) []、
PSRemotingTransportException
+ FullyQualifiedErrorId : JobFailure

というエラーが出ます。

なんとかしてスクリプトを正常終了させたいのですが、
Try-Catch文を使う以外に、なにか方法はないでしょうか?
名無し~3.EXE [sage] 2013/09/16(月) 20:49:23.66 :lnD2w2io

リモートジョブにして結果を受け取るのではだめでしょうか。

# 管理者モードで
> Enable-PSRemoting

# 非ドメイン環境だと必要らしいのだが、よくわかっていない。*でも良いのだがIPアドレスを入れてみた
> set-item wsman:\localhost\Client\TrustedHosts -Value 127.0.0.1
> set-item wsman:\localhost\Client\TrustedHosts -Value 192.168.11.2

# PC1台のため、ループバック
> $Session = New-PSSession -ComputerName .

# 何となく.netのライブラリを使ってみる
> $test = { [void][Reflection.Assembly]::LoadFrom("C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Windows.Forms.dll")
>> $State=[Windows.Forms.PowerState]"Suspend"
>> [Windows.Forms.Application]::SetSuspendState($State,$False,$False) }

# -AsJobでリモートジョブにしてみる
> Invoke-Command -Session $session -ScriptBlock $test -AsJob

# 画面が真っ暗で電源ボタンが点滅だが・・・スリープなのかな?
# 電源オン

> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Job2 RemoteJob Running True localhost ...

# 結果受け取り
> Receive-Job -Id 2
True
名無し~3.EXE [sage] 2013/09/16(月) 22:18:20.46 :CdMzda7A

確かにAsJobスイッチ付ければエラーは出ませんでした。
Invoke-Commandした後にRemove-Jobできれいに終了したことになるんですかねぇ。

なんにせよ、とても丁寧なレスありがとうございました。
名無し~3.EXE [sage] 2013/09/17(火) 00:04:57.19 :hxIpcmJZ

(訂正)
[void][Reflection.Assembly]::LoadFrom("C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Windows.Forms.dll")

$dllpath = @(gci (join-path ${env:\windir} "Microsoft.NET\Framework") System.Windows.Forms.dll -recurse | sort -descending fullname)[0].fullname
[void][Reflection.Assembly]::LoadFrom($dllpath)
とかした方がいいですね。

それはともかく、ちゃんとJob内の処理が終わったかどうか判断しないとRemove-Jobするのはまずいので、

クライアントがスリープ後JobのStateがRunningじゃなくなるのなら、
Get-Job | % {Receive-Job -Id $_.Id -Wait -AutoRemoveJob}

Runningのままだったら、エラーメッセージの受け取りを完了とみなして、
Get-Job | % {if ((Receive-Job -Id $_.Id -Keep) -ne $Null) {Remove-Job -Id $_.Id}}
を何回か時間をあけて繰り返すかでしょうか。

上の方はループしそうな感じですが。。。

では。
名無し~3.EXE [sage] 2013/09/17(火) 06:35:49.25 :79qHk4ME
vbaから自身のexcel.applicationインスタンスを引数にしてps呼び出ししたいのだけどなにかいいやり方はないかな?
名無し~3.EXE [sage] 2013/09/17(火) 12:54:09.98 :Yc1wWTqs
VBAからCOMオブジェクトとしてExcel操作するPSスクリプト呼び出すんじゃだめなの?
名無し~3.EXE [sage] 2013/09/22(日) 07:11:45.92 :FE/Txn3R
V3がインストールできません(T_T)
x86win7で.NET4もインストールしたのに…
名無し~3.EXE [sage] 2013/09/22(日) 22:35:11.50 :MXZEqMQy
SP1入れてないとか?
名無し~3.EXE [sage] 2013/09/23(月) 06:54:08.94 :tUguWng6
4.5入れたらインストール出来ました
名無し~3.EXE [sage] 2013/10/07(月) 17:36:10.02 :do+XqACU
Powershell2.0でのCSVファイルの読み込みで質問です。
例えば、↓のような構成のCSVを読もうとしたとき

#あ行
あいうえお
#か行
かきくけこ
#さ行
さしすせそ

以下のように読み込んだところ、なぜか1行目を取得できませんでした。

$header = "ひらがな"
$Hiragana_List = Get-Content "C:\test.csv" | ConvertFrom-CSV -header $header

確認したところ、先頭行も「#」を削除すると読み込まれるようになりました。
ConvertFrom-CSVのヘルプなど参照しましたが、この現象について説明している部分は見受けられませんでした。
当現象について説明されているドキュメントまたはサイトをご存知の方がいましたら
ご教示願います。
名無し~3.EXE [sage] 2013/10/07(月) 17:39:47.55 :do+XqACU
すみません。CSV コメント行 で検索したらいっぱい出ました。スレ汚し失礼しました
名無し~3.EXE [] 2013/10/08(火) 11:34:29.70 :UAolPLty
wshでのbatとしての起動で先頭に下みたいなん書いといたら出来るのあるでしょ。
@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end

これみたいなんをpowershellでも出来る?
ようは1ファイルで収めたいのです。起動用バッチとps1ファイルと2個にしたくない。
名無し~3.EXE [sage] 2013/10/08(火) 13:01:17.06 :PLvoVCxo
まずなんでbatからps1開くなんて頭悪いことしたいのかわかんないけどできるよ
名無し~3.EXE [] 2013/10/09(水) 06:10:45.47 :55JWwc0D

ダブルクリックで実行したいのよ。
作ったのを配布するでしょ。配布された人がダブルクリックで実行出来れば簡単かなって。
やり方を教えてください。
名無し~3.EXE [sage] 2013/10/09(水) 06:55:48.55 :svFRd2XV
何もしなくてもダブルクリックから動くだろ
名無し~3.EXE [] 2013/10/09(水) 07:30:23.62 :55JWwc0D

デフォだとpolicy変更しないと動かないんじゃ?
名無し~3.EXE [sage] 2013/10/09(水) 07:35:31.33 :rLepDMdE
動くよ
名無し~3.EXE [] 2013/10/09(水) 08:33:44.01 :55JWwc0D
メモ帳で開いたけど…
名無し~3.EXE [sage] 2013/10/09(水) 12:39:02.64 :ceeInWHW

そんなことならbatに記述するよりPowerGUIでexeコンパイルしたほうが楽
ポリシー設定気にしないで済むしモジュールも入れちまえばあれこれ気にしないで済む
名無し~3.EXE [] 2013/10/09(水) 17:06:37.29 :55JWwc0D

こんなのもあるのかありがとう!!
一応こんなんでやりたいことは出来たから書いとくね。
hoge.cmd とかで保存してダブルクリックで実行。


@if(0)==(0) ECHO OFF
pushd "%~dp0" > nul
for /f "usebackq skip=10 delims=" %%i in ("%~f0") do @echo %%i >> "%~n0.ps1"
powershell -NoProfile -ExecutionPolicy unrestricted -File "%~n0.ps1" %*
del "%~n0.ps1"
popd > nul
pause
GOTO :EOF
@end

# この下にpowershell書く
gci
名無し~3.EXE [] 2013/10/16(水) 22:45:15.78 :Ulm1Ns5o
powershell.exe -File test.ps1
と実行した時に、スクリプト内で発生したエラーは
標準エラー出力に吐かれます?
名無し~3.EXE [sage] 2013/10/17(木) 12:44:58.16 :V6ZyvyAn
別のプロセスが実行してるのでもちろん入らない
名無し~3.EXE [sage] 2013/10/17(木) 14:19:03.36 :cFqpFriz
僕は入ってますかね
名無し~3.EXE [sage] 2013/10/25(金) 12:28:48.08 :QQz6e4Nf
Windows Management Framework 4.0
ttp://www.microsoft.com/ja-jp/download/details.aspx?id=40855

Windows PowerShell 4.0きたぞ
名無し~3.EXE [sage] 2013/10/25(金) 21:55:44.34 :9Gmmube+
来たか
名無し~3.EXE [sage] 2013/10/26(土) 09:01:44.41 :L9VVuVDO
違いは?
名無し~3.EXE [sage] 2013/10/26(土) 23:13:26.38 :s6q5k+nY
配下に何階層ものフォルダ構造を持つ巨大フォルダ(例えば「C:\hoge」)があるとします。
この「C:\hoge」を指定してその配下の全フォルダのそれぞれのサイズを表示するコマンドって
PowerShellなら簡単に実現できるものなのでしょうか?
名無し~3.EXE [sage] 2013/10/27(日) 01:32:52.86 :vVqnEPha
2秒で書けるよ
名無しさん@お腹いっぱい。 [sage] 2013/10/27(日) 07:40:01.27 :s+NRWeYZ
質問!
PowerShell2.0使っています。
文字列hogeの前後にSとEを付け加える処理を正規表現で行うと結果がおかしくなります。
バグなのでしょうか?なぜこのような結果になるか教えてください

>[regex]::replace("hoge", "(.*)", "S`$1E")
ShogeESE
名無し~3.EXE [sage] 2013/10/27(日) 09:32:57.04 :ug06eM/8
"^(.*)$" ですな
名無し~3.EXE [sage] 2013/10/27(日) 10:18:28.79 :MLMJJsd3
何故そうなるのかはわかりません
マイクロソフトにお問い合わせ下さい
名無しさん@お腹いっぱい。 [sage] 2013/10/27(日) 15:31:50.50 :s+NRWeYZ
回答ありがとうございます
Pythonでも試してみましたが、期待通りの結果になります
>>> import re
>>> re.sub(r"(.*)", r"S\1E", "hoge")
'ShogeE'

バグだろうという回答も無いので、みなさんがお使いであろうPowerShell3.0でも
同様の結果なのだと推察します。さんの書き方でやっていこうと思います。
ありがとうございました。
名無し~3.EXE [sage] 2013/10/28(月) 22:46:43.77 :Gf04lQjy
のうちのV2でもなる
置換した戻り値でもう一回正規表現判定してるってことかね変なの

てか.Netよく分からないんだけど$1の前に`付いてるのってこういう文法なの?
ヘルプとか見つからないんだけどどこ行けば見られますか?
名無しさん@お腹いっぱい。 [sage] 2013/10/29(火) 00:44:28.68 :8GplZqvq

`はPowerShellのエスケープ文字
ダブルクォーテーションで囲まれた文字列は変換されてから渡されるので
"$1"だと未定義の変数$1の中身の空文字に置き換えられてしまうので、変換されないようにエスケープする
もしくはシングルクォーテーションで囲めば変換されない

ヘルプはPowerShellで>get-help about_regular_expression を実行するか、以下のページ参照
ttp://msdn.microsoft.com/library/az24scfc.aspx
名無し~3.EXE [sage] 2013/10/29(火) 01:23:51.92 :Kykjayh7
Windows PowerShell の About ヘルプ トピック
ttp://technet.microsoft.com/ja-jp/library/dd347616.aspx
Windows PowerShell Cmdlet のヘルプ トピック
ttp://technet.microsoft.com/ja-jp/library/dd347701.aspx
名無し~3.EXE [sage] 2013/10/29(火) 02:35:58.90 :BycwwpMO
,141
うわあありがとう
の.netの方は辿り付けたんだけどこれ自力じゃ絶対気付けなかったわ
正規表現とPSでエスケープが違うってことなのか…
の詳しい説明見てようやく理解できました。詳しくありがとう
名無し~3.EXE [sage] 2013/10/29(火) 13:04:35.07 :7QRwt9tz
わたしてんのはあくまで「正規表現の文字列」だからな
その文字列を生成するPSと正規表現でエスケープは違って当然

インラインでC#書いたりVBS書いてWSHに渡すとか.batにオプションつけて呼び出すとか
するときも当然渡す相手の文法で渡してやらないといけない
名無し~3.EXE [sage] 2013/10/29(火) 13:23:58.90 :J1xX4qsZ
$DataGridView1.add_SelectionChanged({})
$DataGridView1.add_RowsRemoved({})

ってふうに持ってるイベントに.add_つければなんでもいいみたいだな
Register-ObjectEvent
でドツボにはまったから助かった
名無し~3.EXE [sage] 2013/10/29(火) 18:54:03.16 :Di5Z66dq
アンダーバーはダサいからAdd-***Eventってラッパーを自動生成するように仕込んでる
名無し~3.EXE [sage] 2013/10/30(水) 12:40:29.40 :BtK4CwYT
しかしなんで「発見」せなあかんのや?
DataGridViewの仕様なんてわざとややこしくしてると思われてもしゃーない
名無し~3.EXE [sage] 2013/11/02(土) 11:55:09.42 :u5h4Fp7t
ややこしく、というより手抜きだな
クリップボードなんかみてるとそう思う
名無し~3.EXE [sage] 2013/11/14(木) 17:18:59.77 :WT65Vhn3
秀丸で書いて秀丸からps1を実行したいんだけど、PowerShellウインドウ出ない(hiddenでプロセスが残らない)方法あるかなぁ
名無し~3.EXE [sage] 2013/11/15(金) 22:54:21.96 :le3SjAxp
もっとスマートにしたいところ

function Open-Explorer($dir)
{
$p1 = New-Object Diagnostics.Process
$p1.StartInfo.FileName = "explorer.exe"
$p1.StartInfo.Arguments = "/e,"+$dir
$p1.StartInfo.WindowStyle = [Diagnostics.ProcessWindowStyle]::Normal
if($p1.Start())
{
$p1.PriorityClass = [Diagnostics.ProcessPriorityClass]::Normal
}
}
名無し~3.EXE [sage] 2013/11/18(月) 21:32:08.51 :bs4Z+7cB
業務で英語版Windows 8.1(PowerShell 4.0)を使用していますが、
PowerShellでUTF-8の日本語が文字化けしてしまうので相談させていただきます
文字コードに関しては $OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8"); で変更できましたが、
フォントを英語専用フォントから日本語対応フォントに変更することが出来ずに日本語の文字が表示できていません

【既に試した方法その1】
> $psise.Options.FontName = 'ms gothic'

↓実行結果
> The property 'FontName' cannot be found on this object. Verify that the property exists and can be set.
> At line:1 char:1
> + $psise.Options.FontName = 'ms gothic'
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + CategoryInfo : InvalidOperation: (:) [], RuntimeException
> + FullyQualifiedErrorId : PropertyNotFound

【既に試した方法その2】
HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont の値を変更する
参考:ttp://dusan.kuzmanovic.net/2012/05/02/powershell-adding-more-fonts/
ttp://www.fine-view.com/jp/zatsugi/editor_console.html
→いずれも失敗

【備考】
システムロケールを日本語(Shift-JIS)に変更すると、
ttp://opcdiary.net/wp-content/uploads/2012/10/SnapCrab__2012-10-26_22-2-13_No-00_thumb.png
PowerShellやcmd.exeの起動時のフォントがMS ゴシックに変更され、
Shift-JISの日本語を表示することはできるようにました。しかしUTF-8は文字化けして表示できません

この状態で
$OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8");
を実行して文字コードが変更されたことを確認してUTF-8の文字列を表示させましたが、
「UTF-8の文字をShift-JISとして解釈した場合に起きる文字化け」が起きてUTF-8の文字は表示できませんでした
名無し~3.EXE [sage] 2013/11/19(火) 00:17:01.77 :4EOY2z1D
ファイル名処理で[]があると誤動作する問題は解決したのかな?
C#だと何の問題もなかった
名無し~3.EXE [sage] 2013/11/19(火) 00:42:09.10 :uL0bXrl4

結果だけ確認できればいいならリダイレクト使え
リダイレクトなら文字コードの設定さえ合ってればフォントがおかしくてもきちんと出力できる
名無し~3.EXE [sage] 2013/11/19(火) 09:13:03.75 :5fj54QjN
起動時のフォントをMeiryo系に変えたらどうかなぁ
名無し~3.EXE [sage] 2013/11/19(火) 22:37:20.47 :DA6WSiQr
基本chcp 65001でそれなりに動いた気がするけど
Ver4はしらね
名無し~3.EXE [sage] 2013/11/24(日) 20:48:37.03 :sPTX9xyk
PowerShell >dir | clip.exe

は文字化けするね
名無し~3.EXE [sage] 2013/11/24(日) 21:54:38.02 :sPTX9xyk
これで直った。
1日半かかった。

PS C:\> $OutputEncoding = [console]::OutputEncoding;
PS C:\> $OutputEncoding.EncodingName
日本語(シフト JIS)
名無し~3.EXE [sage] 2013/11/26(火) 14:11:49.45 :7IVhCosx
エスケープ文字に ` 使ったり \ 使ったり、PowerShellって破綻してんじゃねーの
名無し~3.EXE [sage] 2013/11/27(水) 12:46:09.79 :IY73nG9s
一連のレス読んでそう思うなら破たんしてるのはお前の脳だ
名無し~3.EXE [sage] 2013/11/27(水) 14:06:30.94 :DvX5p09K
レスやら他のブログ見てても「発見」の多いこと多いこと
がSystem.Management.AutomationあたりとPowerShellの仕様の兼ね合いを理解出来るんなら、破綻してるのは俺の脳だけどな
新しく増えたcmdletもいちいち調べなきゃならんし
名無し~3.EXE [sage] 2013/11/27(水) 23:45:54.88 :u2kSCqlk
まー他の言語のクセからくる先入観みたいなのがあるとはまることは多いかもねぇ
シェルの領域で使う分にはヘルプで十分事足りるよ
名無し~3.EXE [sage] 2013/11/28(木) 18:13:53.27 :+/TyrDFu
シェルスクリプトの代用はC#だけで十分事足りる
それほどC#の統合環境下でのデバッグはやりやすいし、書きやすい。
シェルスクリプトとしても考えられるほぼすべてがそろってる。
処理速度もシェルスクリプトあたりと比較にならないほど速い。
PSにあるのは一行コマンドとしての存在価値だけだな。
.netの下でしか動かないし、どーしたもんかな?
名無し~3.EXE [sage] 2013/11/28(木) 18:16:31.89 :+/TyrDFu
PSが.netから解放されて、メンテとか、システム修復とかに使えて
DOSコマンドを置き換えるものなら意味あるんだけどな
名無し~3.EXE [sage] 2013/12/02(月) 14:30:06.77 :Cb1xSis3
く、苦じぃーw

#全角数字を半角に置換
function ZenNumToNarrow($text)
{
$MatchEvaluator =
{
param($m)
$x =[Microsoft.VisualBasic.Strings]::StrConv($m.Value, $to_narrow);
return $x;
}
$rx = new System.Text.RegularExpressions.Regex("[0-9]+");
return $rx.Replace($text, $MatchEvaluator) ;
}
名無し~3.EXE [sage] 2013/12/02(月) 23:21:46.81 :zOwIGjBa
自分で書くならこうかなー
$m = { [Microsoft.VisualBasic.Strings]::StrConv($args[0].Value, "Narrow") }
[regex]::Replace("0123456789", "[0-9]+", $m)
名無し~3.EXE [sage] 2013/12/03(火) 18:13:31.20 :XsL/V9z4
置換の$MatchEvaluatorみたいなのはjavascript(?)だったら、関数内関数みたいなので簡単にできなかったかなぁ
名無し~3.EXE [sage] 2013/12/26(木) 12:37:21.59 :pHuthdxL
PSを使ってドコモメールの送信しようとするとしてますが、成功された方いらっしゃいますか?
名無し~3.EXE [sage] 2013/12/26(木) 18:23:37.90 :sQsdGx2X
function global:Zen2HanForFile($source){
$diff = ([int[]]'!'.tochararray())[0] -([int[]]'!'.tochararray())[0]

$tgtarray = [int[]]$source.ToCharArray();
$match = [regex] "[a-zA-Z0-9!@#$%^&()−_+=`{};,.]"
for($i = 0; $i -lt $tgtarray.length; $i++){
$tmp = $match.Match($source, $i, 1);
if($tmp.success ){
$tgtarray[$i] -= $diff;
}
}
}
名無し~3.EXE [sage] 2013/12/26(木) 18:33:38.41 :sQsdGx2X
C#で書いてもあんま変わらん

static readonly Regex MatchZen = new Regex(@"[a-zA-Z0-9!@#$%^&()−_+=`{};,.]");
const char DiffZen2Han = (char)('!'-'!');

public string
Zen2Han(string source) {
char[] tgtarray = source.ToCharArray();
for (int i = 0; i < tgtarray.Length; i++) {
Match tmp = MatchZen.Match(source, i, 1);
if (tmp.Success) {
tgtarray[i] -= DiffZen2Han;
}
}
}
名無し~3.EXE [sage] 2013/12/27(金) 17:44:19.41 :ExYlIqRc
scriptcs - Write C# scripts in your favorite text editor
scriptcs.net/
名無し~3.EXE [sage] 2013/12/27(金) 18:02:04.54 :MVxNgGF7
.netの豊富なライブラリをコールするだけなんだからC#もPowerShellも変わらんよな
C#のプログラムなんてほとんどライブラリコールで終わる
名無し~3.EXE [] 2013/12/30(月) 22:24:09.50 :a/2VaF2t

一連のレス読んだらどう見ても終わってるだろ
名無し~3.EXE [sage] 2013/12/31(火) 00:09:30.26 :UWAP894n
一ヶ月も前の話題を振り返す池沼
名無し~3.EXE [] 2013/12/31(火) 02:46:25.85 :3i7Jf7wN

必要があるから振り返したんだよ池沼
お前はなんも考えもなしで食いつく池沼
こんなのがいついてるから普及しないんだよ気づけ
名無し~3.EXE [] 2013/12/31(火) 02:46:58.18 :3i7Jf7wN

おいクズ
内容で否定してみろ
一連のレス読んだらどう見ても終わってるだろ
名無し~3.EXE [] 2013/12/31(火) 02:48:34.44 :3i7Jf7wN

振り返すも何も他の仲間いねえじゃねえかおら
上げてやって感謝しろよ池沼
話題もふれないクズのくせに
からんでくんなバカ
名無し~3.EXE [] 2013/12/31(火) 02:50:45.58 :3i7Jf7wN

こっちは喧嘩売りに来てるんだよバカタレが
相手みてレスしろ
迷惑だからお前
名無し~3.EXE [] 2013/12/31(火) 03:00:26.71 :3i7Jf7wN
一連のレス読んだらどう見ても終わってるわ
バカが一人で自分はいいこと書いてるとでも思ってんだろ
くっさくっさ
名無し~3.EXE [sage] 2014/01/07(火) 12:28:13.96 :Zygy79X1
1レスで済むところを連投お疲れ様です
名無し~3.EXE [sage] 2014/01/10(金) 19:41:32.09 :SeEuVyyV
履歴の保存の方法見たけど
ttp://qiita.com/cd01/items/1f4a380234ef9ea86d73
みたいにプロンプトに仕込むのはかっこ悪くて気がのらない
終了イベントをトリガーできるとスマートにできるんだけどな
名無し~3.EXE [sage] 2014/01/10(金) 20:04:40.26 :kZH1Yfpx
Register-EngineEventでPowerShell.Exitingをサブスクライブすれば
名無し~3.EXE [sage] 2014/01/14(火) 11:32:53.68 :Hc25CGps
Windows 7だけど、OS起動時にGUIの代わりにPowerShellを立ち上げる方法はありますか?
名無し~3.EXE [sage] 2014/01/15(水) 10:48:42.06 :+33L3f5i
「GUIの代わりに」の意味がよく分かりませんが。。。

普通にスタートアップに下記のようなショートカットを入れておけばいいのでは
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit -command C:\hogehoge\init.ps1
名無し~3.EXE [sage] 2014/01/15(水) 10:58:18.45 :OLqa5BN9
unix で X いれてないときみたいにいきなりログインシェルが powershell になってるようなのを期待してるんじゃない?
名無し~3.EXE [] 2014/01/15(水) 12:52:10.88 :djBEmZFb
サーバーならGUIなしにできるがクライアントでは無理なのでは…
名無し~3.EXE [sage] 2014/01/15(水) 14:03:46.05 :5RnizdEM

そうそうそんな感じ。
PowerShellからwin<enter>とするとGUIが立ち上がったりとか。
名無し~3.EXE [sage] 2014/01/15(水) 14:27:35.28 :OLqa5BN9
正攻法では無理じゃない?
の言うとおりサーバだと公式な手順で powershell で起動するように設定できるようだけど。

適当にぐぐると実行ファイル書き換えるバックドドアみたいなのばっかりでてくる。
名無し~3.EXE [sage] 2014/01/15(水) 15:08:48.20 :fZcvpa0v
powershellってドットネットで動くと思うけどGUIなしとかできるのか。
名無し~3.EXE [sage] 2014/01/15(水) 15:39:05.22 :OLqa5BN9
コンソール版も内包してるんでしょう。
cmd 上で powershell 起動すると自前のターミナルではなく cmd のを使ってるし。
名無し~3.EXE [sage] 2014/01/18(土) 14:38:17.21 :KleAGlFQ
SQLite3を入れてPowerShellのウィンドウ内で操作しているんですが、
日本語が文字化けしてしまうんです。

Linuxのほうのシェル(Bash)では文字化けしないのですが・・・
189 [sage] 2014/01/18(土) 19:53:34.05 :KleAGlFQ
とりあえず自己レスです。

PowerShell上で
>Get-Content -Encoding UTF8 ファイル名.txt

とすると文字化けせずに読み込んでくれることが分かりましたが、
sqlite3のプロンプト内ではどうやったらいいのかわかりません。

>sqlite3
sqlite>.open データベースファイル名.db
sqlite>.tables
Japanese words
sqlite>select * from 'Japanese words';
だとやはり日本語データが文字化けして表示されてしまいます。

powershellの問題ではなくsqlite3の問題なのかな。
名無し~3.EXE [sage] 2014/01/18(土) 21:25:43.89 :FtnKyzhJ
powershell は UTF8 での出力を表示出来ないからじゃないかね。
sqlite のシェルは出力を UTF8 で出す作りになってるからどうにもならんような。

$OutputEncoding とか [Console]::OutputEncoding/InputEncoding、
$Host::CurrentCulture あたりを弄るとか
chcp 65001 とか色々やってたら powershell 側でうまくいくかもしれんね。
名無し~3.EXE [sage] 2014/01/18(土) 22:02:34.66 :8YPIu0zq
[Console]::OutputEncoding=[Text.Encoding]::UTF8 にすればうまくいきそうな気もするが、
終わった後は

[Console]::OutputEncoding=[Text.Encoding]::Default

に戻さないといけないので注意。
名無し~3.EXE [sage] 2014/01/19(日) 08:48:16.80 :fBuIPN40
PSConsoleHostReadLineがあればUTF-8のまともな入出力に対応できる
そう思っていた時期が俺にもありました。
また挑戦してみようかなぁ・・・

いや今回の話には関係ないんだけど
名無し~3.EXE [sage] 2014/01/19(日) 08:53:29.78 :IsgtQuLO
究極的にはホストプログラム書いちゃうのがいいのかもしれん


うちはそれやってから utf8 なテキストファイルを type すると powershell 自体が死んだ
名無し~3.EXE [sage] 2014/01/19(日) 15:20:31.89 :PwvsMfCU

Set-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" Shell -Value powershell.exe
名無し~3.EXE [] 2014/01/27(月) 23:38:50.74 :WWOYfxWI
PS C:\> Get-ChildItem env:Path

Name Value
---- -----
Path %SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Ruby200\bin;C:\Windows\system32;C:\W...


...じゃ分かんねーよ
名無し~3.EXE [sage] 2014/01/27(月) 23:45:58.10 :WWOYfxWI
echo $env.Path

$env:Path.split(";")
名無し~3.EXE [sage] 2014/01/27(月) 23:55:14.41 :bNQOo3Rb
そりゃー、Get-ChildItemは中身を見るために使うコマンドじゃないからな
ls *.txt
でテキストファイルの中身全表示されたら敵わんだろ
Get-Content env:pathで同じ結果なら文句も出ようがね
名無し~3.EXE [sage] 2014/01/28(火) 05:53:22.49 :EcEK/wM9
スマソ
覚え始めたばっかだった。

しかし、ls *.txtでファイル名が途中で切れたら困るんじゃ

とおもったらファイル名一覧の場合は折り返すんだね。謎
PS C:\xxx> ls

ディレクトリ: C:\xxx


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2014/01/28 5:44 0 abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaa

PS C:\xxx> ls |grep aba
-a--- 2014/01/28 5:44 0 abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

だめだこりゃ
名無し~3.EXE [sage] 2014/01/28(火) 08:21:24.40 :xsAlgx6F
多分君は cygwin いれたほうが捗るとおもうよ。
名無し~3.EXE [sage] 2014/01/28(火) 12:33:07.93 :VK7hF+k1
|ftつけるだけのことができないやつが一番駄目だこりゃ
名無し~3.EXE [sage] 2014/01/29(水) 04:27:50.08 :GsjexVYh
ls | ? name.indexOf("aba") -gt -1
ls | ? name -like "*aba*"
ls | ? name -match "aba"

grepってことは一番下あたりかなあ
名無し~3.EXE [] 2014/01/29(水) 12:48:16.99 :T1G+p7cc
PowerShellコントローラってのがあるな
ttp://gaming.logicool.co.jp/ja-jp/product/powershell-controller-and-battery
名無し~3.EXE [sage] 2014/01/29(水) 22:15:13.83 :UPS9G+/2
@(a-z) -> @("a", "b", "c", .... "z")
こんな感じの構文で一気に配列に落とし込めないのかな?
199 [sage] 2014/01/29(水) 23:54:47.74 :z7pC3zVp
これだと長いファイル名が切れなくなった。

PS> ls | % { echo $_.BaseName } | ? { $_ -match "aba" }
abaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
名無し~3.EXE [sage] 2014/02/02(日) 01:12:44.60 :9TDhIV8j
とりあえずマウス位置のウィンドウをキャプチャするのを作ってみたんですが
大きく表示している Chrome とか デスクトップ とかしか拾ってくれません。
なんか 矩形の2番目にくる Top がいつも0になるんでポインタや構造体サイズ当たりが間違ってるのかなと思うんですけど
どこが間違っているんでしょうか。
32ビットウィンドウだけが見えると言うわけでもなさそうで。

$Win32APIs = Add-Type -Language CSharp -Namespace Win32APIs -Name Window -MemberDefinition @"

    public struct Rect{ public int left, top, right, bottom; }

    [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr WindowFromPoint(int x, int y);

    [ DllImport( "user32.dll" ) ]
    public static extern int GetWindowRect( IntPtr hwnd, out Rect lpRect );
"@

function GetWindowRectFromPoint ($Point) {
  $handle = [Win32APIs.Window]::WindowFromPoint([int]$Point.X, [int]$Point.Y)
  $rect = New-Object Win32APIs.Window+Rect
  $ret = [Win32APIs.Window]::GetWindowRect($handle, [ref]$rect)
  if ($ret) {
    return $rect
  }
}

$Point  = [System.Windows.Forms.Cursor]::Position
$Rect   = GetWindowRectFromPoint($Point)
$Bitmap  = New-Object System.Drawing.Bitmap -ArgumentList $( $Rect.right - $Rect.left ), $( $Rect.bottom - $Rect.top )
$graphics = [Drawing.Graphics]::FromImage($bitmap)
$graphics.CopyFromScreen( $Rect.left, $Rect.top, 0, 0, $bitmap.Size)
[System.Windows.Forms.Clipboard]::SetDataObject($bitmap)
名無し~3.EXE [sage] 2014/02/02(日) 08:29:29.15 :9TDhIV8j
ぐぐってたら COM呼び出しするソフト見つけたけど過去ログではテンプレだったんだな。
ActiveXPosh ってやつ。

これを使わずに呼び出すには .net かコマンド実行しかないのか。

PowerShell - PowerShell ならバック グラウンド ジョブがあるのか。
Start-Job, Get-Job, Receive-Job
206 [sage] 2014/02/03(月) 08:53:22.96 :+cUyijOr
どうも WindowFromPoint が 64bit ではまともに動かないらしい。
ネットにいっぱいありました。

32ビット版の Powershell ISE を起動して
32ビット版の Powershell ISE のポリシーを設定したら動くようになった。

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell_ise.exe
「管理者:Windows PowerShell ISE(x86)」
Set-ExecutionPolicy RemoteSigned

だけど取得できる対象ウィンドウがコントロールレベルだから予定と違うけど。


ttp://harikofu.blog.fc2.com/blog-entry-36.html
ttp://blog.ccm-lulu.com/2013/02/windows-7-64bit-jenkins-powershell.html
ttp://pieceofnostalgy.blogspot.jp/2011/11/net-framework.html
ttp://codename2010.blog11.fc2.com/blog-entry-125.html


SysWOW64のDLLを指定する方法があるけど動くかどうかは
ttp://cflat-inc.hatenablog.com/entry/20130723/1374535605
名無し~3.EXE [sage] 2014/02/03(月) 17:11:04.71 :kN3IO5kY
プログラム板にもpowershellスレあるから
人がいないんじゃなくて桃白白にからんでたお前が臭いだけ
名無し~3.EXE [sage] 2014/02/03(月) 19:48:09.97 :TjI62Mr5

あのさ、
そーゆーの無理してシェルスクリプトでつくるよりC#使えばいーんでねーの?
Windows自体の機能はC#で書くに限るように思うんだが。
名無し~3.EXE [sage] 2014/02/03(月) 20:22:14.85 :gnOoaorg
コマンドレット化するとかならともかくベタに書くだけなら素直に VS で書いたほうが早いわな。
名無し~3.EXE [sage] 2014/02/03(月) 23:18:08.60 :+cUyijOr

スクリプトでやりたいんですよ。
開発環境入れたくないんですだよ。

UWSC や AutoIt や AutoHotKey を使わずにやれるならやりたい。

この手のソフトは操縦系を簡単に組めるようになってるけど
一旦テンプレが出来れば .net でも簡単に出来るわけで。

出来なくても連携部分がどこまで連携できるかなとか。

本当は機能ごとに連携パターンをそれぞれ作る予定だったのに
まさか一つもできないなんて。


.net プログラミングが出来るなら System.Management.Automation を .net から呼び出すのがよさげだけど
System.Management.Automation を .net 以外から呼び出せないかなあとか。
名無し~3.EXE [sage] 2014/02/03(月) 23:32:41.86 :+cUyijOr
ところで、C#のソース部分でいきなり using System; とかやるとエラーになるんですが
どうしたらいいんでしょう。

> 無効なトークン 'using' が クラス、構造体またはインターフェイスのメンバー宣言で使用されています。

のを試したらエラー出なかった。



構造体またはインターフェイスのメンバーだからダメなのか。
それで型が変なことになってたのか。
よく分からん。
名無し~3.EXE [sage] 2014/02/03(月) 23:45:35.15 :gnOoaorg
ちゃんと Add-Type の説明よんだらいいよ。
-MemberDefinition はあくまでメンバの定義で外側を class なんちゃら {} でくくられてるって考えたらいい。
ネームスペース追加したいなら -UsingNamespace

using からクラス名からなにから全部コード中に書きたいなら -TypeDefinition か無指定。
ほぼ C# のコードそのままになる。

Add-Type の注意は、例えクラス定義しても他の Add-Type の中からはそのままじゃ見えないって所。
一度アセンブリを書き出して -ReferenceAssemblies しないと using しても見つからない。
オンメモリで Add-Type をまたぐのは無理らしい。

ちなみに、-OutputType と -OutputAssembly を指定すれば実行ファイルも作れたりするぞ。
名無し~3.EXE [sage] 2014/02/03(月) 23:59:50.63 :+cUyijOr

早速ありがとうございます。
そこらへんいろいろパターンがあったけど意味が分からず適当にやってました。
もうちょっと勉強します。
名無し~3.EXE [] 2014/02/08(土) 15:36:49.30 :qPrUVIRX
surface pro2(Windows8.1)のコマンドプロンプト(管理者で実行)で
netshコマンドでIPアドレスを変更しようとしたところ、要素が見つかりませんと
エラーが出たのですが、powershellにこのコマンド移行されたと考えたよろしいでしょうか?
ネット検索していたらそのような事が書かれていたので・・・
ただnetshコマンドでIPアドレスを変更するバッチを作りたかったのですが、
同じようなことをpowershellでできればやりたいのですが、ご教授ください。
名無し~3.EXE [sage] 2014/02/09(日) 12:08:09.51 :yVAgs4Le
ご教授なんかいたしません
名無し~3.EXE [sage] 2014/02/10(月) 15:44:38.07 :P/wuRJiG
このへんかなあ
ttp://technet.microsoft.com/ja-jp/library/hh826123.aspx
名無し~3.EXE [] 2014/02/11(火) 00:34:50.24 :6G4rTE/1
えtst
名無し~3.EXE [] 2014/02/11(火) 00:39:18.39 :CpUAARdy
てst
名無し~3.EXE [sage] 2014/02/11(火) 12:19:00.86 :BahIcKTf
Linuxのシェルではsuやsudoというコマンドで一般ユーザから管理者になれるんですけど、
Powershellでも同様なことができるんでしょうか?
名無し~3.EXE [sage] 2014/02/11(火) 14:59:21.02 :O5l3+A2G
大雑把な聞き方で申し訳ないんだけど
環境変数にある「lib」ってPowershellで使ってるの?
この変数って何の場所を示してるの?
名無し~3.EXE [sage] 2014/02/11(火) 17:30:16.92 :Npu17lB/
VisualC++のライブラリパスじゃないか?
名無し~3.EXE [sage] 2014/02/12(水) 12:32:39.80 :3JsPOFW+

引数に-Credential 管理者
名無し~3.EXE [sage] 2014/02/22(土) 09:45:36.98 :GPm6WR7L

それだと実現したいことができませんでした。
Windowsにはsuやsudoに当たるコマンドプログラムはないんでしょうかね。

ところでPowerShellの起動時のウィンドウ枠の大きさは設定できません。
設定をずっと有効にするためには、Linuxみたいにどこかの設定ファイルを
書き換える必要があるのでしょうか。
名無し~3.EXE [sage] 2014/02/22(土) 21:18:21.90 :is2t6Se8

・外に窓を開いていいのなら
Start-Process "$psHome\powershell.exe" -ArgumentList "-noexit" -Verb Runas

・タイトルバーを右クリックしてプロパティ | レイアウト | ウィンドウのサイズ
名無し~3.EXE [sage] 2014/02/22(土) 21:50:27.91 :is2t6Se8

下の方
キーバインドのことを考えるとckw-modの子プロセスとしてPowerShellを起動した方がいいかもしれない。
ttp://ckw-mod.github.io/
ttps://github.com/ckw-mod/ckw-mod/wiki
名無し~3.EXE [sage] 2014/02/27(木) 01:22:46.28 :QnagUHOL
ISEで日本語を含んだオブジェクトをテーブル表示したらずれるんだけど何か対処法ない?
コンソール版だと問題ないんだけど

#例
$hash = @{}
$hash["long long ascii string"] = 123
$hash["テーブルで日本語を使うと"] = 123
$hash | ft -AutoSize
名無し~3.EXE [sage] 2014/02/27(木) 10:36:50.04 :0zoH8YGE
なんか文字幅無視した処理になってるみたいだね。
ConsoleHost はそこら辺考慮してくれるけど ISE Host はまる無視なのか
名無し~3.EXE [] 2014/02/28(金) 21:24:54.82 :BKmsPwhf
Win2008ServerのPowershell使ってます。
サーバにすでに適用済みのセキュリティパッチ一覧を取得する方法は
ネットにもサンプルがたくさんあるのでわかります。
そでなく、サーバにダウンロードされ(パッチ自体はまだインストール
していない)Windows Updateに表示されたセキュリティパッチの一覧
のみを、テキストファイルで出力したいニーズがあるのですが、
ご存知の方教えてください。ヒントになるサンプルがあるリンク先が
あればご紹介ください。
よろしくお願いします
名無し~3.EXE [] 2014/02/28(金) 21:59:19.69 :VRggz1UA
何やりたいのか分からないが、Linuxのsudoに相当するのは、Windowsではrunas
ただし、Linuxみたくセキュリティが理由で実行ユーザーを分けたいのなら、Windowsはロール単位で分けた方かいいと思う
名無し~3.EXE [sage] 2014/03/08(土) 17:31:02.25 :4SI95pD9
powershellでwget的なこと(httpプロトコルを使用して、htmlファイルを取得したい)をしたくトライしてるのですが、管理者権限がなくps1ファイルが実行ポリシー上制限されていて悩んでます。権限がなくても上記要望を満たせる方法ってないんでしょうか。
名無し~3.EXE [] 2014/03/08(土) 21:57:58.55 :f+vb4h3U
ps1ファイルからの実行じゃなく、メモ帳で開いて
ISEにコピペしてそのまま実行だと行けない?
名無し~3.EXE [sage] 2014/03/08(土) 23:08:45.42 :/+JEqmW+
Invoke-WebRequest url -Outfile ファイル名 (Invoke-WebRequestはiwrと略せる)

$wc=New-Object Net.WebClient
$wc.DownloadFile("url","ファイル名")

ファイルを落とすのはこんな感じで

でもSet-ExecutionPolicy RemoteSigned (管理者権限で) をしておかないと不便だと思う。
名無し~3.EXE [sage] 2014/03/09(日) 00:06:13.19 :2SJ9bOP4
いっそのこと、wgetないしcurlを自分のディレクトリに入れてしまう。
実行が制限されていなければ、だが。
名無し~3.EXE [sage] 2014/03/09(日) 00:12:07.25 :tDlmk9R3
あー、もうやっぱり実行権限エラーで-ExecutionPolicyオプションやや$env:PSExecutionPolicyPreferenceの存在を示さないのは犯罪レベルだな・・・
名無し~3.EXE [sage] 2014/03/09(日) 10:20:34.59 :3TFYZ/uV
powershellの日本語ヘルプって作られてるの?
4.0では無いようだけど、3.0でもないの?
名無し~3.EXE [sage] 2014/03/09(日) 10:46:17.01 :7HO/K4Fu
Windows 7 にもともと入ってる 2.0 は日本語ヘルプ使えるね
名無し~3.EXE [sage] 2014/03/09(日) 11:43:32.12 :3TFYZ/uV
4.0にアップデートしちゃうと、2.0にあるコマンドの日本語ヘルプも見れなくなっちゃうのか。
名無し~3.EXE [sage] 2014/03/09(日) 11:49:12.66 :78PqI9wk
共存できないの?
名無し~3.EXE [sage] 2014/03/09(日) 19:09:05.59 :3TFYZ/uV
わからん
名無し~3.EXE [sage] 2014/03/11(火) 11:24:43.76 :ZIEtzk92
PSスクリプトを複数の非ドメイン環境の端末に配布して実行させたいけど、
端末のexecution policyを変更しないとPowerShellスクリプトがそもそも実行できない。
こういう場所ってどうやって実行ポリシーを変更させるのが効率的ですかね?
名無し~3.EXE [sage] 2014/03/12(水) 04:19:36.47 :tcO62GJs
効率的な方法はわからないですけど
どうせだったら必要な端末でEnable-PSRemoting (管理者)を実行して
リモートで処理したらいいんじゃないでしょうか

ttp://www.atmarkit.co.jp/ait/articles/1004/15/news106_3.html
ttp://blog.powershell-from.jp/?p=129
名無し~3.EXE [sage] 2014/03/12(水) 08:56:19.61 :VBxeOQsH

ありがとうございます
参考にさせていただきます!
名無し~3.EXE [] 2014/03/13(木) 13:12:36.91 :vxojom+K
誰か教えてください
[]を含む複数のファイルが同一フォルダーにあってそのリストを得たり名前を変更する方法
例 
test[01].txt, test[02].txt, test[03].txt, test[04].txt があり
Get-ChildItem '.\test`[01].txt' と入力したのですが該当なしになってしまい
Get-ChildItem '.\test`[01`].txt' はエラーとなってしまいました

正規表現のメタキャラである[を`でキャンセルしたつもりでしたがうまくいきません

よろしくお願いします
名無し~3.EXE [sage] 2014/03/13(木) 13:33:30.62 :dJNjTHM+

'.\test``[01``].txt' でいけた。
エスケープ二段構えってことは2回パースされてるってことなんだろうな。
補完だと一回しかエスケープされないのな・・・
名無し~3.EXE [sage] 2014/03/13(木) 14:04:59.14 :y3H8mSgE
gci -LiteralPath "test`[01`].txt"
名無し~3.EXE [sage] 2014/03/13(木) 14:12:57.24 :y3H8mSgE
gci test`[*`].txt | % { ... }
的なことをやる場合、$_.name $_.fullname は [] をクォートする必要あり
名無し~3.EXE [] 2014/03/13(木) 14:20:00.30 :vxojom+K
 ありがとうございました、が
Get-ChildItem '.\test``[01``].txt' はうまくいきましたが

Rename-Item '.\test``[01``].txt' -NewName 'test01.txt' では
Rename-Item : 指定されたパス C:\TMP\test``[01``].txt のオブジェクトは存在しません。
とエラーになってしまいました

もうちょっと助けてください
名無し~3.EXE [sage] 2014/03/13(木) 14:52:06.13 :dJNjTHM+
`でも``でもだめだねえ・・・
Get-ChildItem `.\test\\[01\\].txt' | Rename-Item -NewName 'test01.txt' でもだめだった。
名無し~3.EXE [] 2014/03/13(木) 14:52:35.05 :vxojom+K
自己解決しました

Rename-Item -LiteralPath .\test[01].txt -NewName test01
で できました
Thanks
名無し~3.EXE [] 2014/03/13(木) 14:54:42.46 :vxojom+K
251です
ところで-LiteralPathの意味教えてください
名無し~3.EXE [sage] 2014/03/13(木) 14:55:59.17 :y3H8mSgE
大体こんな感じで処理してる

function escapebrackets([string]$string) {
return (([regex]"(?<!``)\]").Replace(([regex]"(?<!``)\[").Replace($string,"`["),"`]"))
}

gci | ? name -match "test`[(.*)`]\.txt" | % {rename-item -LiteralPath (escapebrackets $_.fullname) ("test{0}.txt" -f $matches.1)}
名無し~3.EXE [sage] 2014/03/13(木) 15:02:39.70 :y3H8mSgE

パス内のワイルドカード(* ? [])を展開しないという意味です
名無し~3.EXE [] 2014/03/17(月) 17:44:28.82 :8X4UzM90
245です
皆さんにいろいろ教えていただいたことを基にいろいろ試したのですがうまくできなかったので
教えてください

やりたいこと
フォルダー内に test[01].txt, test[02].txt, test[03].txt, test[04].txt があります
これらのファイル名を test[91].txt, test[92].txt, test[93].txt, test[94].txt にリネームする
パイプ処理を使って1行のコマンドで行う

よろしくお願いします
名無し~3.EXE [] 2014/03/17(月) 21:52:29.03 :Kf3bF1Nc
Get-ChildItem -Filter "test[0*" -Recurse |Rename-Item -NewName{$_.name -replace "0","9"}
名無し~3.EXE [sage] 2014/03/17(月) 22:33:27.65 :f/w+/KoJ
みなさんはパス打つとき(PowerShellに限らず、2chやTwitterなどでも)、

○○バックスラッシュ○○
○○\○
○○/○○
どれ派?
バックスラッシュを2chで打つと\になるのでカタカナです
名無し~3.EXE [sage] 2014/03/17(月) 22:42:11.03 :qIu77JEL
/ が使えるようになってからは / 使う
やっぱり¥は見にくい。

あと、¥使ってるとLinux使ったときにバックスラッシュに違和感持ってしまう。

そう言えばLinuxでも / じゃなかったっけ。
名無し~3.EXE [sage] 2014/03/18(火) 23:22:25.21 :dG3I/+Vr
実現の可否が分からなかったので、質問をさせて下さい。
2.0を使用しています。使用経験は浅いです。

以下のようなコードを使用し、csvファイルをpowershellで比較して、行番号の表示付きで差分を出そうとしています。
================
$content1 = Get-Content "〜.csv"
$content2 = Get-Content "〜.csv"

$comparedLines = Compare-Object $content1 $content2 | Group-Object { $_.InputObject.ReadCount } | Sort-Object Name
================

上記でもうまくいくのですが、csvファイルのサイズが大きい場合は処理が重くなるため、Get-Contentに-readcount xxxを指定して処理を速くしたいと考えています。

ただ、-readcount xxxを指定した場合、Get-Contentの結果が配列になるようで、後続のCompare-Objectの処理が意図した動きにならず、正しい結果が得られなくなりました。

アイデアが浮かばないのですが、-readcount xxxを指定し、かつ行番号の表示を付けて差分を出すことは可能なのでしょうか。
名無し~3.EXE [sage] 2014/03/20(木) 00:46:04.83 :Z5Q1+4Li

よくわからんけど、これ参考になる?

$a=select-string ^ c:\a.csv | % { $_.Path=""; $_ }
$b=select-string ^ c:\b.csv | % { $_.Path=""; $_ }
diff $a $b
259 [sage] 2014/03/21(金) 22:55:24.54 :nolM2WlZ

レスありがとうございます。

明記していなかったのですが、今回は比較する際に同じ行番号の行だけで比較するだけでなく、違う行番号の行でも内容が一致していればOK、という処理もしたいと考えています。

記載いただいた方法だとdiff処理の前に番号を振っていることから、diffの際に「-syncwindow 0」にするのと同じことになり、同じ行番号の行だけで比較する場合にしか使えないと考えます。
名無し~3.EXE [sage] 2014/03/23(日) 10:46:25.15 :YYHz+abV

-readcount付けなくてもGet-Contentは1行ごとの配列として読みだしてるよ
forなりdoなりでreadcountを指定して回せばいいんでね
そもそもcsvならimport-csvして主キーで検索して比較すりゃいいんでないの?
名無し~3.EXE [sage] 2014/04/07(月) 16:51:17.09 :1jbvlQ1e
Windows Management Framework 5.0 Preview
ttp://www.microsoft.com/en-ph/download/details.aspx?id=42316
名無し~3.EXE [sage] 2014/04/07(月) 17:16:30.41 :7xoKEkCJ
乙です
8.1以降なんですな
update 1のあとに入れて見ようかな
名無し~3.EXE [sage] 2014/04/07(月) 20:10:24.00 :xgjcpi9O
なぜにフィリピン
名無し~3.EXE [sage] 2014/04/08(火) 22:33:30.31 :ziSbYawI
XPが今日でご臨終だから、いよいよPowerShellがデフォで入ってるOSだけになったね。
名無し~3.EXE [sage] 2014/04/08(火) 23:05:44.96 :/G3cR45b
XPはこれからだ
名無し~3.EXE [sage] 2014/04/11(金) 23:06:49.23 :/l5Sv7rX
ttp://toro.2ch.net/test/read.cgi/win/1397118718/143-146 をPowerShellでやってみた
管理者でPowerShellを起動して実行、パスは自分の環境に合わせて修正要

# イメージファイルのマウント先
$mountpoint="F:\mount"

# イメージファイル
# $image="C:\ESD\Windows\sources\install.wim" # RTM ver.
$image="C:\ESD\Windows\sources\boot.wim" # download ver.

# Windows 8.1 Update 1(KB2919355) の保存先
# 32bit ttp://www.microsoft.com/ja-jp/download/details.aspx?id=42327 から事前に保存しておく
# 64bit ttp://www.microsoft.com/ja-jp/download/details.aspx?id=42335 から事前に保存しておく
# ttp://www.microsoft.com/ja-jp/search/DownloadResults.aspx?q=KB2919442 も必要
$package="F:\Download\system\OS\Windows 8.1 Update 1\ja"

# cpuが32bitか64bitか
$cpu="x86"
# $cpu="x64"

if (test-path $mountpoint) {Remove-Item $mountpoint -recurse -force}
New-Item $mountpoint -type directory
Mount-WindowsImage -ImagePath $image -Index 1 -Path $mountpoint
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2919442-$($cpu).msu"
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2919355-$($cpu).msu"
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2932046-$($cpu).msu"
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2937592-$($cpu).msu"
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2938439-$($cpu).msu"
Add-WindowsPackage -Path $mountpoint -PackagePath "$package\Windows8.1-KB2934018-$($cpu).msu"
"イメージファイルを更新してアンマウントします`n終了後WindowsSetupBox.exeを起動してISOを作成してください"
Dismount-WindowsImage -Path $mountpoint -Save
exit
名無し~3.EXE [sage] 2014/04/12(土) 09:46:32.78 :tDTGw7ZH
せめて、
Add-WindowsPackage〜
・・・
はリストにしようぜ。
名無し~3.EXE [sage] 2014/04/13(日) 15:28:57.25 :1eBlbwV+
リスト?
名無し~3.EXE [sage] 2014/04/15(火) 16:34:52.27 :wQ4uabrw
ttp://toro.2ch.net/test/read.cgi/win/1382263043/572-584">ttp://toro.2ch.net/test/read.cgi/win/1382263043/572-584 の内容で ttp://www.microsoft.com/ja-jp/download/details.aspx?id=42327 から事前に保存しておく
# 64bit ttp://www.microsoft.com/ja-jp/download/details.aspx?id=42335 から事前に保存しておく
# ttp://www.microsoft.com/ja-jp/search/DownloadResults.aspx?q=KB2919442 も必要
$package="F:\Download\system\OS\Windows 8.1\update 1"
# cpuが32bitか64bitか
$cpu="x86"
# $cpu="x64"

$imgwin="C:\ESD\Windows\sources\install.wim"
$imgesd="C:\ESD\Windows\sources\install.esd"
if (!(test-path $imgwin)) {
if (test-path $restore) {Remove-Item $restore -recurse -force}
New-Item $restore -type directory
Expand-WindowsImage -ImagePath $imgesd -Index 1 -ApplyPath $restore
New-WindowsImage -ImagePath $imgwin -CapturePath $restore -CompressionType "maximum" -Name "install"
}
if (test-path $mountpoint) {Remove-Item $mountpoint -recurse -force}
New-Item $mountpoint -type directory
Mount-WindowsImage -ImagePath $imgwin -Index 1 -Path $mountpoint
"2919442","2919355","2932046","2937592","2938439","2934018" | % {
Add-WindowsPackage -Path $mountpoint -PackagePath ("{0}\Windows8.1-KB{1}-{2}.msu" -f $package,$_,$cpu) }
Dismount-WindowsImage -Path $mountpoint -Save
"終了後、install.wimを削除あるいは移動してから`nWindowsSetupBox.exeを起動してISOを作成してください"
Export-WindowsImage -SourceImagePath $imgwin -SourceIndex 1 -DestinationImagePath $imgesd -CompressionType "recovery"
exit
名無し~3.EXE [sage] 2014/04/15(火) 18:15:52.01 :ek2jNu14
なんかおかしな動作してるなと思って調べた結果ファイル名に[]を含んでる時だった
で原因はこれ

>about_wildcard
> [ ] ある範囲の文字と [a-l]ook book、cook、look took
> 一致する
> [ ] 指定された文字と一致する [bc]ook book、cook hook

ワイルドカードにファイル名として使用可能な文字が入ってる実装とか初めて見たわ
スクリプトのTest-Path,Copy-Item,Move-Item,Remove-Itemあたりを-LiteralPath指定に直しておくことにしよう
名無し~3.EXE [sage] 2014/04/16(水) 01:21:08.47 :MmbQ+i/C
>("{0}\Windows8.1-KB{1}-{2}.msu" -f $package,$_,$cpu)
この書き方スゲーけど、自分には.NET臭がいやーん。

"${package}\Windows8.1-KB${_}-${cpu}.msu"
でいいよね、多分(´・ω・`)。
この例だと、${...}で括る必要すらないけど、付ける方がなにかと嵌りにくいので。
名無し~3.EXE [sage] 2014/04/16(水) 09:54:09.40 :LCYMFVOM
Export-WindowsImage の圧縮形式で recovery は含まれてないようです (KeyNotFoundException発生)
ttp://toro.2ch.net/test/read.cgi/win/1382263043/601 を取り入れて書き直し

# ユーザー設定
$restore="F:\Restore" # 回復イメージ保存先
$mountpoint="F:\mount" # イメージファイルのマウント先
$package="F:\Download\system\OS\Windows 8.1\update 1" # 適用する Update 1(KB2919355) のパス
$cpu="x86" # cpuが32bit(x86)か64bit(x64)か

$imgwin="C:\ESD\Windows\sources\install.wim"
$imgesd="C:\ESD\Windows\sources\install.esd"
if (test-path $imgwin) {
if (test-path $mountpoint) {Remove-Item $mountpoint -recurse -force}
New-Item $mountpoint -type directory
Mount-WindowsImage -ImagePath $imgwin -Index 1 -Path $mountpoint
"2919442","2919355","2932046","2937592","2938439","2934018" | % {
Add-WindowsPackage -Path $mountpoint -PackagePath ("{0}\Windows8.1-KB{1}-{2}.msu" -f $package,$_,$cpu) }
Dismount-WindowsImage -Path $mountpoint -Save
dism /Export-Image /SourceImageFile:"$imgwin" /SourceIndex:1 /DestinationImageFile:"$imgesd" /Compress:recovery
} else {
if (test-path $restore) {Remove-Item $restore -recurse -force}
New-Item $restore -type directory
Expand-WindowsImage -ImagePath $imgesd -Index 1 -ApplyPath $restore
"2919442","2919355","2932046","2937592","2938439","2934018" | % {
Add-WindowsPackage -Path $restore -PackagePath ("{0}\Windows8.1-KB{1}-{2}.msu" -f $package,$_,$cpu) }
New-WindowsImage -ImagePath $imgwin -CapturePath $restore -CompressionType "maximum" -Name "install"
dism /Export-Image /SourceImageFile:"$imgwin" /SourceIndex:1 /DestinationImageFile:"$imgesd" /Compress:recovery
Remove-Item $restore -recurse -force
}
exit
名無し~3.EXE [sage] 2014/04/18(金) 21:26:56.94 :j+HvgRYW
import-module "C:\Program Files\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\x86\DISM"
$env:path ="C:\Program Files\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\x86\DISM"

↑Windows7で最新ADK8.1update使用の人は、上記2行が必要かな?
ADKURL ttp://www.microsoft.com/ja-jp/download/details.aspx?id=39982
名無し~3.EXE [sage] 2014/04/28(月) 06:00:11.88 :zaSH7LR3
スクリプトの中に適用する番号いちいち全部書くのはどうかな
$hoge = @("2919442","2919355","2932046","2937592","2938439","2934018")
$hoge|%{処理}
でなきゃ
Get-ChildItem -path $package -File|where name -match "$('Windows8.1-KB\d+-'+"$cpu"+'.msu')"|sort|%{処理}
でいいんじゃないの
名無し~3.EXE [sage] 2014/04/28(月) 17:46:37.62 :sVz8uQcN

ふむ。
下の方がそのまま使い回せるから、いいね。
ただし、パッチ間に依存関係がなく適用順を考慮する必要がないこと。
であれば、
Get-ChildItem -path $package -File | %{処理}
として、$packageディレクトリに突っ込むだけ。

Update2 チンチン☆⌒ 凵\(\・∀・) マダァ?
名無し~3.EXE [sage] 2014/04/29(火) 23:02:42.23 :GEBawTM/
awkみたいにテキストの前と後ろに一括で文字を加えたいのですが
似たような機能ないですか?
名無し~3.EXE [] 2014/04/29(火) 23:52:04.40 :9jKWpPGF
get-content test.txt | %{ "aaa" + $_ + "bbb" } > test_add.txt
簡単だけどこんなの?
名無し~3.EXE [sage] 2014/04/30(水) 00:30:50.69 :zrCM1K2W
おおおすごい!できました!ありがとうございました
名無し~3.EXE [sage] 2014/04/30(水) 15:31:35.81 :ht1AbG0U
select-stringっていつの間にかbomなしのutf8にも対応してたんだな
前はダメだったよな
名無し~3.EXE [sage] 2014/04/30(水) 20:27:37.13 :jJ6JRT5O
BOMなしだとエンコーディングの指定が必要ってだけだったと思う
名無し~3.EXE [sage] 2014/04/30(水) 23:05:57.88 :gNq4Zyki
BOMってやっぱり「ボム」って読むの?
名無し~3.EXE [sage] 2014/05/01(木) 09:06:14.92 :u/99qHNz
ボムなしはシューティングだと非常にまずい状況w
名無し~3.EXE [sage] 2014/05/01(木) 19:35:00.51 :6Z2wIGGA
-enocoding defaultを指定するとbomありutf8とsjisがマッチして、未指定だとsjisがダメでbomなしutf8がマッチする
名無し~3.EXE [sage] 2014/05/01(木) 23:53:23.23 :zyPWaFWV
bomありutf8じゃなくて、UTF-16LE(≒Unicode?)では?
名無し~3.EXE [sage] 2014/05/03(土) 21:28:18.74 :pGeOmB8J
ttp://d.hatena.ne.jp/newpops/20061104/p1

クリップボードの操作は↑のようにIEオブジェクトを利用すればstaモードじゃなくても可能とのことですが
↑の例ではIEオブジェクトを使ってクリップボードに文字列を入れていますが
逆にクリップボードから文字列を取り出すことって出来ないのでしょうか?
名無し~3.EXE [sage] 2014/05/03(土) 21:57:32.07 :CWiB/vtX
TextBox最強伝説(System.Windows.Forms.TextBox)というのがあってだね
ttp://scripting.cocolog-nifty.com/blog/2007/08/powershell_1b86.html
まあ最近はSTAがデフォルトだから System.Windows.Forms.Clipboard でもいいと思うけど
287 [sage] 2014/05/03(土) 22:20:10.83 :pGeOmB8J

ありがとうございます!今出来ないので後日試してみます。

PowerShell2.0環境なのでいちいちショートカット作って「-sta」ってするのも面倒だし

ttp://www.upken.jp/kb/PkyFMjOCpNxXMnXRJFaypEzAfDaSjM.html

↑みたいにVBCodeProvider?を使う方法も見つけたのですが
もう少しシンプルに出来ないかなと思ったのでw
こんな方法もあるんですね。勉強になりました。
名無し~3.EXE [sage] 2014/05/03(土) 22:21:34.92 :pGeOmB8J
貼り間違えました…
ttps://www.upken.jp/kb/PkyFMjOCpNxXMnXRJFaypEzAfDaSjM.html
名無し~3.EXE [sage] 2014/05/03(土) 22:44:33.36 :GXNFV3iR
パワーシェル芸人になりたいです
サンプルが豊富なサイト知りませんか?
名無し~3.EXE [sage] 2014/05/03(土) 23:51:58.92 :IaQ3gTFc

芸人ならオリジナルで勝負しろよ
名無し~3.EXE [sage] 2014/05/03(土) 23:54:53.90 :GXNFV3iR
芸人じゃないです、芸人になりたいんです><
忍法帖【Lv=40,xxxPT】(1+0:8) [sage] 2014/05/04(日) 01:18:24.71 :zRrsJapt
詳説正規表現とPowerShellクックブックだろ
本買え本
名無し~3.EXE [] 2014/05/05(月) 17:23:56.15 :LhojqoV4
クックブッククックブック青い鳥〜
名無し~3.EXE [sage] 2014/05/05(月) 19:26:54.87 :gv3ElBeX

ttp://tech.guitarrapc.com/entry/2014/04/09/065516 を見ながらインスコしてみました
OneGetのヘルプだけ更新できませんでした
ttps://github.com/OneGet/oneget/wiki/cmdlets を見たら何とかなるかな?

> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 0 9701 0

> get-command -Module oneget
CommandType Name Source
----------- ---- ------
Cmdlet Add-PackageSource oneget
Cmdlet Find-Package oneget
Cmdlet Get-Package oneget
Cmdlet Get-PackageSource oneget
Cmdlet Install-Package oneget
Cmdlet Remove-PackageSource oneget
Cmdlet Uninstall-Package oneget

> update-help -uiculture en-us
update-help : UI カルチャ {en-US} を使用してモジュール 'OneGet' のヘルプを更新できませんでした: セキュリティ上の理
由から、DTD はこの XML ドキュメントでは使用できません。DTD 処理を有効にするには、XmlReaderSettings の DtdProcessin
g プロパティを Parse に設定し、XmlReader.Create メソッドにその設定を渡してください。
発生場所 行:1 文字:1
+ update-help -uiculture en-us
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Update-Help]、Exception
+ FullyQualifiedErrorId : HelpInfoXmlValidationFailure,Microsoft.PowerShell.Commands.UpdateHelpCommand
名無し~3.EXE [sage] 2014/05/08(木) 03:47:58.20 :5xhBrk25
whileとか使って1万行くらい回すと極端に遅くなるんだけどそんなもんですか?
他に方法ないでしょうか?
名無し~3.EXE [sage] 2014/05/09(金) 10:11:58.37 :DXVb1gWw
メモリが足らなくなっている、んじゃね?
バッファを用意して少しずつ追い出しながらやる。

処理内容が全く分からんからあてずっぽうだけど。
名無し~3.EXE [sage] 2014/05/10(土) 10:19:12.92 :9HXrdiIj

インタープリターはそういうもんだね。
処理する対象(データやオブジェクトとか)をどうやっても持っているか
によって、対処できる場合もあるけど。
名無し~3.EXE [sage] 2014/05/11(日) 15:01:00.29 :EY5aIXza

まず、速度の違いを知らないと
ttp://toro.2ch.net/test/read.cgi/tech/1378978504/53

VBScript でループするとか
C#から PS スクリプトを呼び出すとか
自前ソフトなら機能をDLL化してロードして関数呼び出しするとか
名無し~3.EXE [sage] 2014/05/16(金) 08:42:27.77 :LFr16yQR
Windows Management Framework 5.0 Preview May 2014
ttp://www.microsoft.com/en-us/download/details.aspx?id=42936
名無し~3.EXE [sage] 2014/05/21(水) 20:32:31.54 :tXFxx2SA
try{
    gps hogehoge
}
catch [Microsoft.PowerShell.Commands.ProcessCommandException]{
    echo "ぬるぽ"
}

プロセス hogehoge が存在しないときに捕まえたいのですが
catchできません。

catch [System.SystemException]{
    echo "ガッ"
}
これなら良いのですが、プロセスが見つからないときだけcatchするにはどうすればいいでしょう?
302 [sage] 2014/05/21(水) 20:51:30.82 :APJK/217
訂正
gps -ErrorAction Stop hogehoge
名無し~3.EXE [sage] 2014/05/21(水) 21:47:03.10 :Irul7gBx
try {gps -name hoge -ea stop} catch [Microsoft.PowerShell.Commands.ProcessCommandException]{"ga"}
で ga と表示されましたよ
名無し~3.EXE [sage] 2014/05/21(水) 22:46:23.33 :AETeQi6t
>304
ありがとうございます。
うちの環境だと

Get-Process : 名前 "hoge" のプロセスが見つかりません。プロセス名を確認し、コマンドレットを再度呼び出してください。
発生場所 行:1 文字:9
+ try {gps <<<< -name hoge -ea stop} catch [Microsoft.PowerShell.Commands.ProcessCommandException]{"ga"}
+ CategoryInfo : ObjectNotFound: (hoge:String) [Get-Process]、ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

となってしまいます。
環境はWindows7 Professionalです。なにか追加でインストールなりロードなり必要でしたらご教授ください。
名無し~3.EXE [sage] 2014/05/21(水) 23:35:14.25 :Irul7gBx

あれ、私の環境がおかしいのかな?

ttp://social.msdn.microsoft.com/Forums/ja-JP/6fa69292-7725-4108-abc0-8c87b3b95bd0/powershell?forum=powershellja
の回答1が正解のようです
名無し~3.EXE [sage] 2014/05/22(木) 06:44:07.49 :pi1dHVEh
>306

なるほど。
大変助かりました。
ありがとうございました。
名無し~3.EXE [sage] 2014/07/07(月) 01:22:38.64 :RaDW9diS
ユーザの名前を一覧で出力させるには?
名無し~3.EXE [sage] 2014/07/09(水) 10:03:36.45 :RHF9cFIC
(Get-WmiObject Win32_UserAccount).Name
名無し~3.EXE [sage] 2014/08/17(日) 07:17:30.78 :nTidPXoi
#「Windows Font Cache Service」を無効にする(管理者)
Set-Service "Windows Font Cache Service" -StartupType Disabled

#「Windows Font Cache Service」を停止する(管理者)
Stop-Service "Windows Font Cache Service"

#フォントキャッシュを削除する(Windows 8.1)(管理者)
Remove-Item $env:SystemRoot\System32\FNTCACHE.DAT
名無し~3.EXE [sage] 2014/08/17(日) 08:42:40.04 :nTidPXoi
#レジストリのFontsキーのエントリで値に".otf","\"が含まれるものを表示する(管理者)
$reg = Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
$reg.Property | % {
if (($reg.GetValue($_).ToString().Contains(".otf")) `
-or ($reg.GetValue($_).ToString().Contains(".OTF")) `
-or ($reg.GetValue($_).ToString().Contains("\"))) {"$($_): $($reg.GetValueKind($_)): $($reg.GetValue($_))"}
}
名無し~3.EXE [] 2014/08/17(日) 18:11:24.36 :7VwdOWUQ

アクティブディレクトリの特定のOU内のグループに所属しているユーザーを出力したいのです
名無し~3.EXE [sage] 2014/08/17(日) 23:04:33.31 :MS+vSuwa
Get-ADGroupMember
ttp://technet.microsoft.com/en-us/library/ee617193.aspx

-IdentityでOUやらなんやらを指定すればいいのかしら
名無し~3.EXE [sage] 2014/09/05(金) 09:51:25.27 :R/uxyXQG
Windows Management Framework 5.0 Preview September 2014 (v5.0)が利用可能になりました
ttp://tech.guitarrapc.com/entry/2014/09/05/065912
名無し~3.EXE [sage] 2014/09/09(火) 09:14:47.33 :RVcv+y/1
pythonの_ とかMatlabのansのように
最後に実行したコマンドの結果が自動で入る変数はありますか?
あるいは同等の機能を何らかの手段で追加できますか?
名無し~3.EXE [] 2014/09/18(木) 14:31:45.32 :NuvG1PhL
Windows7proの3.0環境での質問です。

csvファイルを読み込んで別のcsvファイルとして出力したいのですが、以下の条件を満たす方法が見つからず悩んでいます。

1.foreachやselect-objectで指定した項目のみを出力
2.指定項目はテキストファイルから取得する

上記を満たす場合、ps1のソース内は取得項目名やその数を可変に対応できるようにしなくてはなりません。

foreachやselect-objectで項目を指定するところでループを挟むことはできないのでしょうか。
また、別の解決方法があればご教授願います。
名無し~3.EXE [] 2014/09/18(木) 16:35:50.16 :vdaRty5H
関数にすればいいんじゃないから
対象項目をstartで指定して
処理実態をprocessに記述
endで出力に
とわければいいと思うよ。

関数自体の作り方は、簡易なので例を見ると
わかると思いますよ
名無し~3.EXE [] 2014/09/18(木) 18:45:05.81 :NfblEp/b
316です


ありがとうございます。
軽く試してみましたが行けそうな感じです。
functionにするのは盲点でした。
助かりました。
名無し~3.EXE [sage] 2014/09/23(火) 09:41:00.75 :mqsEgJNv
PowerShell 2.0 の日本語ヘルプ
ttp://technet.microsoft.com/ja-jp/windows/bb978525
名無し~3.EXE [sage] 2014/09/23(火) 17:18:37.98 :kZ5o0mve

行ごとに指定項目があるとすると、

&amp;{ipcsv __csv__ | select $args[0]} $(gc __text__) | epcsv ...

でいいと思う
名無し~3.EXE [sage] 2014/09/30(火) 11:23:47.45 :DE/c4KTR
Linuxのシェルよりも難解
名無し~3.EXE [sage] 2014/09/30(火) 22:46:33.07 :4stdPi7Y
配下のディレクトリから任意の拡張子のファイルの総数を計算する

Linuxのシェルの場合
find . -type f -print0 | xargs -0 ls -db | grep -E '\.(avi|wmv|mp4)$' | wc -l

PowerShellの場合
(Get-ChildItem . -file | Where-Object Extension -match "^\.(avi|wmv|mp4)$").Length

個人的にはPowerShellのほうが分かりやすい
名無し~3.EXE [sage] 2014/10/01(水) 20:58:14.19 :p3VsqX7w
オブジェクトで扱える範囲ならラクだな。
外れると、無理やり.NET使うより、他の言語を使う方がいいかな。
名無し~3.EXE [sage] 2014/10/02(木) 09:57:20.24 :A2XBTmrg
Windows 10 Tech Preview における PowerShell をみてみよう
ttp://tech.guitarrapc.com/entry/2014/10/02/022922
名無し~3.EXE [sage] 2014/10/02(木) 14:48:08.44 :cszK+ja5
はい。みます。
名無し~3.EXE [] 2014/10/06(月) 18:04:23.53 :Y3dCvQWf
powershellにLinuxで言うところのmultipath( -ll)コマンドに相当するコマンドはありますでしょうか?
名無し~3.EXE [sage] 2014/10/07(火) 00:24:52.56 :uH/MjMS6
ttp://technet.microsoft.com/en-us/library/hh826113.aspx
名無し~3.EXE [] 2014/10/07(火) 09:33:20.20 :SijVM56j

ありがとうございます!
名無し~3.EXE [] 2014/10/18(土) 13:58:56.69 :ziiiKepv
Outlookのフォルダ構成を出力するのってどんなコマンドレットですか?
名無し~3.EXE [] 2014/10/18(土) 18:49:53.81 :B1sMeRrX
Outlook のメールフォルダーならこれ

ttp://msdn.microsoft.com/en-us/magazine/dn189202.aspx
名無し~3.EXE [sage] 2014/10/20(月) 22:47:45.32 :ZPRMtTcD
Windows PowerShell ISE Add-On Tools
ttp://social.technet.microsoft.com/wiki/contents/articles/2969.windows-powershell-ise-add-on-tools.aspx
名無し~3.EXE [sage] 2014/10/31(金) 03:25:17.07 :OdaxDxww
ヘルプをエディタに登録して引きたいんだけど
.chmとかで配付してるPSヘルプはないのかな?
名無し~3.EXE [sage] 2014/10/31(金) 05:09:32.92 :sKOJyCiq

こういうの?
ttp://www.microsoft.com/en-us/download/details.aspx?id=10552
ttp://blogs.msdn.com/b/powershell/archive/2011/05/17/download-the-updated-core-help-chm.aspx
333 [sage] 2014/10/31(金) 05:12:33.09 :sKOJyCiq

貼り忘れ
ttp://www.techrepublic.com/blog/windows-and-office/quick-tip-create-an-easily-accessible-powershell-30-help-system/
名無し~3.EXE [sage] 2014/10/31(金) 06:40:13.60 :OdaxDxww

そういうの
日本語のないのかと探したら、windows\helpの中に入ってたのね

これで十分です、お騒がせしました
名無し~3.EXE [sage] 2014/11/06(木) 15:00:22.53 :6wgMlkw5
自身のdos窓のウインドウハンドルってどこで参照できる?
タイトル変えて探せば特定はできそうだけど、どこかに変数で保持してないかな
名無し~3.EXE [sage] 2014/11/06(木) 15:17:40.51 :/ts29DOD
>自身のdos窓
って、起動したcmd.exeの意味じゃなくて?
名無し~3.EXE [sage] 2014/11/06(木) 15:32:36.10 :6wgMlkw5

そうそれ
状況によって窓をアクティブにしたいんだけど、ハンドルがどこで参照できるのか分からない
名無し~3.EXE [] 2014/11/06(木) 22:34:15.17 :dpNVCTt/

いろいろ探して、こんな風だとできることが分かった
参考になるかな?

$t = '[DllImport("user32.dll")] public static extern bool SetForegroundWindow(int handle);'
add-type -name win -member $t -namespace native
$p=([diagnostics.process]::GetProcesses() | ?{ $_.ProcessName -eq "cmd" -and $_.MainWindowHandle -ne 0 }).MainWindowHandle
[native.win]::SetForegroundWindow($p)
339 [] 2014/11/06(木) 22:58:02.41 :dpNVCTt/
ネタ元は
ttp://droj-tech.blogspot.jp/2012/07/powershell-how-to-manipulate.html
339 [] 2014/11/06(木) 23:00:47.28 :dpNVCTt/
ということで
ハンドルの取得は
(Get-Process -Name cmd).MainWindowHandle
名無し~3.EXE [sage] 2014/11/06(木) 23:16:37.61 :6wgMlkw5

ありがと

うーん、"user32.dll"の仕様はよく分からないけど、名前が"cmd"でハンドルの有るものを選んでるようだね
だから複数あったり直接powreshell.exeで起動したら見付からないし、自身のものである保証もない

てっきりget-hostから参照できるどっかにハンドルも格納されてると思ったんだけど、違うみたい
やっぱりウインドウタイトル変えてそれをget-processから見つける力業しかないのかな
名無し~3.EXE [] 2014/11/06(木) 23:58:50.60 :dpNVCTt/
タイトル帰るとか、何かの違いが用意されてないと、識別できないよね
起動順序とかでいいなら、スタート時間が取れるので
それで識別することもできるけど。
名無し~3.EXE [sage] 2014/11/07(金) 02:50:33.49 :INtvKPBd
せっかくなので力業のウィンドウアクティブ乗せとく
user32だと失敗することがあるみたいなんでVBので

$bu = $host.ui.RawUI.WindowTitle
$ran = '{0}{1}' -f (get-random),(get-random)
$host.ui.RawUI.WindowTitle = $ran
$myID = Get-Process|?{$_.MainWindowTitle -eq $ran}|%{return $_.ID}
$host.ui.RawUI.WindowTitle = $bu
[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
[Microsoft.VisualBasic.Interaction]::AppActivate($myID)
名無し~3.EXE [sage] 2014/11/07(金) 21:47:39.30 :B/gb3VZ7
Windows PowerShellを使って複雑なパターンのファイル名変更を行う
ttp://www.atmarkit.co.jp/ait/articles/1411/07/news133.html

コマンドプロンプトはゴミ
やっぱりPowerShellじゃねえとな
名無し~3.EXE [sage] 2014/11/10(月) 23:05:33.07 :NA4/fSaw
識別名の記述が面倒いので、ログオン名とかをつかってADのグループにメンバーに追加する方法ありますでしょうか?
名無し~3.EXE [sage] 2014/11/11(火) 22:53:33.09 :YRWrpokF
ttp://blog.powershell-from.jp/?p=1320
これでどう?
346 [] 2014/11/12(水) 04:03:25.82 :5rG2BVPO

それで良いよ!中々やるじゃね〜か!
正直、見直したZe!!
名無し~3.EXE [sage] 2014/11/13(木) 16:08:28.18 :9Wk9HP6n
PowerShellの使える範囲が増えてきてるみたいだからと少し調べたらすごく好みで学習し始めたけど
外部コマンドの実行でハマってましたわ
単純なStringではなく@()配列にしないとダメなんだね

↓の 「Tip #2 : Do not put all arguments in one string」 て見て叫んでしまった
> Powershell-Everyday-FAQ: Top 5 tips for running external commands in Powershell
ttp://powershelleverydayfaq.blogspot.jp/2012/04/top-5-tips-for-running-external.html
コマンド実行時には単純に書いても動くのになあって頭かかえてたわ
名無し~3.EXE [sage] 2014/11/13(木) 16:43:03.59 :QVA4sCv/

ダメっていうか、そうした方が見やすい、メンテしやすいってことじゃないの?
その上に単純なStringの羅列で動かすケースも書かれてるじゃん。
名無し~3.EXE [sage] 2014/11/13(木) 17:18:55.92 :9Wk9HP6n
正直赤い文字しか見てなかったけど上のも1つ1つが区切られてるね
1つのStringではダメってのがわかってなくて詰まってたんだ
コマンドライン上では↓で動くけどスクリプトファイルでは動かなくて
& FastCopy.exe /cmd=update /bufsize=512 /utf8 Z:\test.txt /to=Z:\test\

sample.ps1が↓の内容だと動いた
$cmd = "FastCopy.exe"
$arguments = @("/cmd=update", "/bufsize=512", "/utf8", "Z:\test.txt", "/to=Z:\test\")
& $cmd $arguments

↓だと引数がうまくわたらなくて動かなかったけど、$argumentsが1つの引数として扱われちゃってたってことだよね
$cmd = "FastCopy.exe"
$arguments = "/cmd=update /bufsize=512 /utf8 Z:\test.txt /to=Z:\test\"
& $cmd $arguments

FastCopyはこれ ttp://ipmsg.org/tools/fastcopy.html
名無し~3.EXE [sage] 2014/11/13(木) 21:12:45.95 :DZmkCj+c
コマンドを単純に文字列にしてから実行してるんじゃなく、オプションはアプリの引数に直接入れてるみたいだからな
その方が便利だけど
これだけでカレント上のファイル全部渡せるよ、文字数制限もない

&$cmd (dir -name)
名無し~3.EXE [sage] 2014/11/13(木) 23:59:38.16 :9Wk9HP6n
情報thx
わかればすっきりするし使いやすい感じだね
試しに作ってるのはバックアップ用スクリプトだけど渡したいファイルとフォルダは一部だけなので
そこらへんはFastcopy側の/includeオプションを使う予定
ファイルごとにプロセス起動より親フォルダを渡してファイル指定したほうが速いだろうし

何度か試行した後に増殖したFastCopyプロセスも直感的に
Get-Process -name FastCopy | kill
でkillできたしISEの補完も便利だしほんといい子ですわ
もう少し慣れてきたら周りにも布教していきたいなあ
名無し~3.EXE [sage] 2014/11/14(金) 01:09:25.01 :pL1OEaK7
ファイルの選別こそPSの得意分野だから利用したいところだけどね
コピーだとフォルダ構造の問題があるから難しいかな
名無し~3.EXE [sage] 2014/11/14(金) 07:27:12.31 :nNp3sHTb
Fastcopy系って昔のwindowsのファイルコピーが糞だったから使われてただけで今は必要ないだろ
名無し~3.EXE [sage] 2014/11/14(金) 10:23:55.82 :rRN7kLS9
fastcopyとかのフリーソフト入れて使うのは好みだと思うけど、robocopyの需要はあると思う

robocopy的な高速コピーってpowershellでできないのかな
名無し~3.EXE [sage] 2014/11/14(金) 10:34:55.94 :mEmGibcS
robocopyって別に速さは売りにしてないんじゃ…
名無し~3.EXE [sage] 2014/11/14(金) 20:00:57.10 :seqfcfYH
ファイルコピー系のソフトウェア否定論者ってどこにでもわくんだな…

それはまぁどうでもいいとして
robocopyはオプション豊富だしコピーだけじゃなくて同期もできるし、PSとの相性はよさそうだ
TechNetのギャラリーとか見るとけっこうあるね
名無し~3.EXE [sage] 2014/11/16(日) 09:14:06.88 :PhmGGzhh
ttp://blogs.msdn.com/b/b8_ja/archive/2011/08/26/10201016.aspx

大量コピーに対応したサード パーティのコピー管理ツールをお持ちの方も多いはずです。
遠隔測定データによれば、こういったアドオンのうち最も人気のあるもの
(TeraCopy、FastCopy、Copy Handler など) であっても、
使用されているのは全 Windows 7 PC の 0.45% 未満に過ぎません。
Windows 7 の顧客ベースの大きさを考えれば絶対数としてはかなりのものですが、
多くのユーザーが大量コピーを得意とするツールを持っていないことは確かです。

私たちは、先述したようなアドオンに並ぶほどの機能をエクスプローラーに盛り込むつもりはありません。
サード パーティによるアドオンの市場は、今後も活発に継続していくものと考えています。
私たちが目指すのは、現在大量コピーをエクスプローラーで行っているユーザーに対して、
より高い制御性やコピー進行中の詳しい情報、そしてよりクリーンで効率的なエクスペリエンスを提供することです。
名無し~3.EXE [sage] 2014/11/21(金) 01:37:14.76 :pxlKmCls
Windows Management Framework 5.0 Preview November 2014
ttp://www.microsoft.com/en-us/download/details.aspx?id=44987
名無し~3.EXE [sage] 2014/11/25(火) 02:57:13.94 :hI5igBGK
ファイルシステム上のGet-ChildItemで取得した値のtoString()値は
指定引数によって.FullNameか.Nameか変わるのでしょうか?

-Include指定時のtoString()値は.FullNameで、-Directory -Recurseのみだと.Nameになる
-IncludeがあるとFullNameになるみたいだけどこれはそういう仕様と思えばいいの?
GetType()はDirectoryInfoで同じに見えるけど何か別のオブジェクトが渡されてるのかな
名前だけ欲しい場合は.Nameで取ったほうが安定か

フォルダ構成: C:\temp\test\; C:\temp\直下に複数のファイル
カレント: C:\temp

$testdir = Get-ChildItem -Directory
echo $testdir -> フォルダ構成が出力される
echo "$testdir" -> test と出力される

$includedir = Get-ChildItem -Directory -Recurse -Include "test"
echo $includedir -> フォルダ構成が出力される
echo "$includedir" -> C:\temp\test と出力される
名無し~3.EXE [sage] 2014/11/25(火) 10:14:22.47 :oOD3GWLL
オブジェクトをtoString()するよりもプロパティを使った方がいいんじゃないかな
あと戻り値はオブジェクトの配列かオブジェクトになるから

Get-ChildItem -Directory | % {write $_.Name}
Get-ChildItem -Directory -Recurse -Include "test" | % {write $_.Name}

みたいにしてみては?

write (Get-ChildItem -Directory).Name
write (Get-ChildItem -Directory -Recurse -Include "test").Name

と等価です

#gciに-Directory ってスイッチあったのかあ
#gci | ? {$_.PSIsContainer} みたいなスクリプトはいつか書き直そう
名無し~3.EXE [sage] 2014/11/25(火) 23:44:02.76 :n8rErSid
どうもです
.Nameでとったほうがよさそうですね

ライブラリわかれてるんですが
ファイルシステム用のGet-ChildItemページが別にあって、こっちに-Directoryがあります
ttp://technet.microsoft.com/ja-jp/library/hh847897.aspx
でも-Includeオプションの説明はこっち
ttp://technet.microsoft.com/ja-jp/library/hh849800%28v=wps.620%29.aspx

前者が子で後者が親みたいな関係ならしっくりくるけど
toString()が変わるってことは後者で上書きされてる感じもしてちょっとよくわかんない感じですね
名無し~3.EXE [sage] 2014/12/01(月) 01:14:00.52 :7i9nN5jF
5.0からの機能だから正式にはまだ先になるけどGet-ItemPropertyValue便利だね
レジストリ値の取得が楽になるだけじゃなくファイル操作でも便利そう
名無し~3.EXE [sage] 2014/12/02(火) 09:31:24.86 :istu/B0p
[v5] Auto-Generated Example-Driven Parsing について
ttp://winscript.jp/powershell/285

>さてさて、PowerShell Advent Calendar 2014、今年は参加者が少なく、完走はかなり危ぶまれます
名無し~3.EXE [sage] 2014/12/02(火) 15:32:57.50 :hRx+R6Cs
リンク先見たがだいぶ厳しいな・・・
名無し~3.EXE [sage] 2014/12/02(火) 18:52:33.49 :w2uuQM6F
MSVPの彼が、残り全部埋めればよい。
名無し~3.EXE [sage] 2014/12/03(水) 22:26:38.76 :7egoi+OK
WindowsのタスクスケジューラーでPowerShellのスクリプトを実行する際には「パス」に注意
ttp://www.atmarkit.co.jp/ait/articles/1412/03/news125.html
名無し~3.EXE [] 2014/12/07(日) 15:35:05.33 :mOOkbryn
パワーシェルの自動化の便利さをまだ体感できてない。
名無し~3.EXE [sage] 2014/12/10(水) 14:25:18.05 :GHw9koD0
PowerShell以外の方法による自動化の便利さは体感したことあるん?
名無し~3.EXE [sage] 2014/12/11(木) 23:37:34.12 :iYiLSWBv
gci -r C:\hoge\ | select fullname, lastwritetime

↑のようなコマンド打つと、C:\hogeフォルダ内のファイルのフルパスと更新日時が表示されるけど
更新日時ではなく前回保存日時を出力するには何を指定すればよいのでしょうか?
名無し~3.EXE [sage] 2014/12/12(金) 23:54:29.69 :yBQAKAdl
勝手に更新日時が書き換えられちゃってるってことかな
前回保存日時なるものと更新日時の違いがシステム的にわからないと思うよ
名無しさん@そうだ選挙に行こう [sage] 2014/12/13(土) 12:53:47.85 :kG8OH1wq
他に表示できるのはcreationtimeかlastaccesstimeですね
OSが持ってないものは無理かと
名無しさん@そうだ選挙に行こう [sage] 2014/12/13(土) 13:27:11.44 :vJoLL72q
多分 Excel なんかのプロパティで表示される前回保存日のことかしらん。
一応とってくることは可能かと
対応してないファイルは無視するしかないが。

ttp://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.workbook.builtindocumentproperties.aspx
名無しさん@そうだ選挙に行こう [sage] 2014/12/13(土) 13:56:42.97 :HpskaZuL
エスパーたちの集い
名無しさん@そうだ選挙に行こう [sage] 2014/12/14(日) 18:14:10.17 :fB/9E7NR
Powershell を使って windows のインデックスを使ったファイル検索は可能なんでしょうか?
スタートメニューの「プログラムとファイルの検索」の部分です。
名無しさん@そうだ選挙に行こう [sage] 2014/12/14(日) 18:46:59.68 :fB/9E7NR
自己解決しました。
SQL 発行して検索出来るんですねえ。
ttp://stackoverflow.com/questions/13918329/how-to-search-windows-search-indexed-files-with-powershell
ttp://msdn.microsoft.com/en-us/library/windows/desktop/bb231256(v=vs.85).aspx
名無し~3.EXE [sage] 2014/12/18(木) 00:05:39.96 :wqr0s9SP
@C:\hogeの内容が以下の通りだったとします。

PS C:\hoge> gci

Mode        LastWriteTime   Length Name
----        -------------   ------ ----
-a---    2014/12/17   23:48    9230 AAA.txt
-a---    2014/12/17   23:48    9230 BBB.txt
-a---    2014/12/17   23:51   30030 CCC.xlsx
-a---    2014/12/17   23:50   50694 DDD.jpeg
-a---    2014/12/17   23:50   50694 EEE.jpeg
-a---    2014/12/17   23:50   50694 FFF.jpeg


A拡張子ごとのファイル数を表示します。

PS C:\hoge> gci | group extension

Count Name           Group
----- ----           -----
  2 .txt           {AAA.txt, BBB.txt}
  1 .xlsx           {CCC.xlsx}
  3 .jpeg           {DDD.jpeg, EEE.jpeg, FFF.jpeg}
378 [sage] 2014/12/18(木) 00:07:18.25 :wqr0s9SP
のAで拡張子ごとのファイル数だけでなく、以下のように拡張子ごとの合計サイズも出すには
どのようなコマンドを書けばよいのでしょうか?

Count Name  Length
----- ----  -----
  2 .txt  18460
  1 .xls  30030
  3 .jpeg  152028
378 [sage] 2014/12/18(木) 00:10:23.18 :wqr0s9SP
↑の「1 .xls」は「1 .xlsx」の誤りです。申し訳ありません。
名無し~3.EXE [sage] 2014/12/18(木) 01:00:59.99 :ug1yf7Dn

gci -File|group extension|select count,name,@{L="Length";E={$_.group|measure -sum length|select -expand sum}}
378 [sage] 2014/12/18(木) 22:23:18.57 :wqr0s9SP

バッチリできました!どうもありがとうございます!

でも意味が全くわからないのでこれから勉強します…orz
名無し~3.EXE [sage] 2014/12/18(木) 23:25:32.05 :8pnYfmMr
手癖で cd ~/ と打ったら、ちゃんと $HOME に移動して
なんか笑えた
名無し~3.EXE [sage] 2014/12/19(金) 01:09:16.15 :fsO5uHW5

こんなのはどうでしょうか
function prompt {
"`n{0:MM/dd(ddd)HH:mm} {1} {2}@{3} {4}`n`$ " -f (Get-Date),$pid,$env:USERNAME,$env:USERDOMAIN,$pwd.path.replace($env:HOME,"~").replace("\","/")
}

元に戻すときは
function prompt {
"PS $($executioncontext.sessionstate.path.currentlocation)$('>' * ($nestedpromptlevel + 1)) "
}
名無し~3.EXE [sage] 2014/12/20(土) 09:41:50.04 :vyNY5oGf

ttps://twitter.com/mutaguchi/status/545993269214081025

PowerShellアドベントカレンダー、12/22が埋まらなかったので自分で埋めることにしました。
名無し~3.EXE [sage] 2014/12/21(日) 18:14:55.65 :9U0H3/aj
ようやくPowerShell インストールできた
zshやawkとかUnixの知識はあるけど、
そんなやつに適したクイックスタートの情報ある?
名無し~3.EXE [sage] 2014/12/21(日) 18:28:10.98 :F1mzobz+
それらの知識はなかったものとして習得するのが一番の近道

いやまじで。
名無し~3.EXE [sage] 2014/12/21(日) 18:34:08.04 :9U0H3/aj
了解 MSらしいな >それらの知識はなかったものとして習得するのが一番の近道
とりあえずお薦めのURL頼む
履歴参照やスクロール1つすらホームポジションで行えない
名無し~3.EXE [sage] 2014/12/21(日) 18:51:29.79 :7z5/tsoz
Unix のシェルに慣れ親しんでる人ほど
使ってるうちに微妙だけどクリティカルな違いにイラつきだして
最終的に強烈なアンチになるイメージ
名無し~3.EXE [sage] 2014/12/21(日) 21:58:46.37 :tLf8y93h
Windows PowerShell 4.0 and Other Quick Reference Guides
ttp://www.powershellmagazine.com/2014/04/24/windows-powershell-4-0-and-other-quick-reference-guides/
powershell チートシート
ttp://qiita.com/jca02266/items/a0c71ae90d055ab3893c
名無し~3.EXE [sage] 2014/12/21(日) 22:58:37.70 :9U0H3/aj

ありがとう
これで助かった
名無し~3.EXE [sage] 2014/12/21(日) 23:14:40.81 :qlRtENVg
最初、パイプにバイナリデータ流して嵌まった
名無し~3.EXE [sage] 2014/12/22(月) 00:17:47.73 :/SF4aoYi

一瞬排水溝の話かと思ったw
名無し~3.EXE [sage] 2015/01/14(水) 10:12:16.87 :mzQFAxF2
ttps://twitter.com/gregzakharov/status/555057287904362496

PowerShellが遅すぎなのかLINQが速すぎなのか
名無し~3.EXE [] 2015/01/17(土) 10:24:52.59 :KYtNM984
IEを操作するシェルを書いているのですが、
ファイル保存ダイアログのOKボタンを押す方法が解らず
困っております。

どのように書けば良いのでしょうか?

よろしくお願いします。
名無し~3.EXE [] 2015/01/17(土) 21:37:57.28 :KYtNM984
あと、IT系は、政府が優先的に派遣法改悪の最初の犠牲者にするから、
選ばない方が良い。
名無し~3.EXE [] 2015/01/18(日) 09:48:48.16 :4W85U26x

比べるほうがおかしいだろ
名無し~3.EXE [] 2015/01/18(日) 17:07:30.94 :i1TnYdID

あれ、おれがやったら、それほどの差はでない。
Millisecondsで
137
28 
という値になったよ。
名無し~3.EXE [sage] 2015/01/24(土) 22:29:55.72 :uv0cNTa6
Powershell vs Applescript
ttp://www.techwars.io/fight/powershell/applescript/

圧倒的じゃないか、我が軍は
名無し~3.EXE [sage] 2015/01/25(日) 02:20:00.69 :a6TGa4RQ
ようし、つぎはシェルスクリプトと比べてみよう
名無し~3.EXE [sage] 2015/01/25(日) 20:36:31.98 :1bBvdYii
cygwin 相手に速度負けするから止めて
名無し~3.EXE [sage] 2015/01/26(月) 20:39:07.28 :exIsBPN9
今回のWindows10previewのバージョン情報
OSのビルド番号とPowerShellのマイナー番号が同じになってるっぽい
細かい違いはわからん

Name               Value
----               -----
PSVersion             5.0.9926.2
WSManStackVersion      3.0
SerializationVersion        1.1.0.1
CLRVersion            4.0.30319.0
BuildVersion           10.0.9926.2
PSCompatibleVersions     {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion  2.2
名無し~3.EXE [sage] 2015/01/28(水) 21:32:43.23 :cM3+Q5uH
ノーマルのWindows8.1で
PowershellでQoSの設定をしたけど
機能しないのですが、いい方法とか見落としていることとかありませんかね・・・?
(8.1 Proだと動作するのを確認しました。ローカルグループポリシーとPowershellの両方で)

New-netqospolicy -Name "Mail" -IPDstPort 465 -IPProtocol TCP -ThrottleRateActionBitsPerSecond 500KB
名無し~3.EXE [sage] 2015/01/29(木) 09:48:32.80 :iGSye7VZ
違うかもしれないけど、WoW64かな?
名無し~3.EXE [sage] 2015/01/29(木) 17:37:54.39 :quBhVR6D
どちらも手動設定で64bit版だから、おそらく大丈夫なはず。
Proとノーマルだと使うレジストリが違うようで
ノーマルだとどうやっても無理ですかね・・・
名無し~3.EXE [sage] 2015/01/30(金) 01:17:06.33 :+yrsPmcC
ノーマルだと初期状態ではQoSパケットスケジューラ入ってない、ってことはないかさすがに
名無し~3.EXE [sage] 2015/01/30(金) 02:23:57.46 :umW5aLIt
入れるとこからかな
ttps://technet.microsoft.com/ja-jp/library/jj573093.aspx
名無し~3.EXE [sage] 2015/01/30(金) 20:18:28.83 :voHe85QL

さすがにそこは大丈夫です。


対象が鯖っぽいから
クライアントだと違うかな・・・?
名無し~3.EXE [sage] 2015/01/30(金) 20:21:23.94 :voHe85QL
所詮、家庭内LANなので・・・
名無し~3.EXE [sage] 2015/01/30(金) 21:49:47.18 :bYtcW2zm
コマンド自体は存在するの?
名無し~3.EXE [sage] 2015/01/31(土) 15:51:34.73 :n4CehBsX
コマンド自体は成立していて、
設定もGet-NetQoSPolicyで見ると反映されています。

ただ、Proとは違う場所に設定を書き込んでいる模様・・・
"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\QoS"
Proだとここに書き込まれるのですが、無印8.1だとここではないようです。
名無し~3.EXE [sage] 2015/02/01(日) 13:33:16.68 :A2uiqx+f
Powershellでサーバ構築とかできるもん?
サイトあれば教えて
名無し~3.EXE [sage] 2015/02/01(日) 15:08:42.98 :Ja35gSiY
サーバー構築というのをどういう意味で言っているのかわからないしサーバーの種類もわからない
ソフトのサイレントインストールとか設定ならものによってはある程度可能だけど
0からPowershellでサーバーを作るのは骨が折れると思う

どういうサーバーをどうやって構築したいのかを決めてからググってみてください
名無し~3.EXE [sage] 2015/02/03(火) 21:24:46.54 :PZfcBf+r
構築というより設定です。
FTPサイトの追加とかDNSの設定とか
名無し~3.EXE [sage] 2015/02/03(火) 22:14:33.94 :fDeLHIlw
そのへんのキーワードにpowershellって追加して検索してみるといい
英語のほうが出てきやすいかもしれんが日本語でもたぶんあるよ
名無し~3.EXE [] 2015/02/23(月) 21:04:15.56 :Ok+2rOTR
try catch がクソすぎないか?
Reason : ItemNotFoundException
だというので
catch [System.Management.Automation.ItemNotFoundException]
と書いてみたがキャッチできない
catch [System.Management.Automation.RuntimeException]
ならキャッチできた。はぁ?なにこれ。
名無し~3.EXE [sage] 2015/02/24(火) 23:03:42.26 :/tjktPOU
Microsoft、「Windows PowerShell ISE」のアドオン「Module Browser」を無償公開
ttp://www.forest.impress.co.jp/docs/news/20150224_689793.html
名無し~3.EXE [sage] 2015/02/25(水) 10:14:06.05 :6wL9ooQ6

どーゆー場面での話?
うちの環境だと例えばGet-Itemが投げるItemNotFoundExceptionは
catch [System.Management.Automation.ItemNotFoundException] でキャッチできたけど
名無し~3.EXE [] 2015/02/25(水) 13:06:04.95 :izOR9dvm

マジか
例えばこんなコード。本当はItemNotFoundExceptionをキャッチしたい

$ErrorActionPreference = "Stop"

$targetfiles = @()
try {
  foreach ($target in $Args) {
    $targetfiles = $targetfiles + @(ls $target | ?{ $_.Name -cmatch ".*\.csv$" })
  }
} catch [System.Management.Automation.RuntimeException] {
  "引数に指定したファイルが存在しません`n$target"
  exit 1
}
名無し~3.EXE [sage] 2015/02/25(水) 21:52:03.36 :o0l3e0bG

.csvが無い時にエラーにしてほしいの?
そのコードだと.csvファイルが無い時はエラーも何も起きない気がするんだけど
名無し~3.EXE [] 2015/02/25(水) 23:05:04.97 :izOR9dvm

引数にcsvファイル名を指定する前提だからその場合は ls $target の時点でエラーになるんだよ
$targetfilesが空かのチェックは後続コードでやってる

ていうかそういうことはいいんだよ。
を実行するとItemNotFoundExceptionではキャッチできないのが問題なんだよ。結局PSのバグなのか?
$ErrorはErrorRecordオブジェクトだったり面倒くさい実装しやがって
名無し~3.EXE [sage] 2015/02/25(水) 23:06:24.37 :o0l3e0bG
ls $target の所か
$targetに存在しないファイルが来るとItemNotFoundExceptionが投げられる

ttp://i.imgur.com/T9c0F8U.png
名無し~3.EXE [sage] 2015/02/26(木) 08:33:12.39 :9w8clM8u

もしかしてPowerShellのバージョンは2.0?
バージョンによって挙動が違うらしいけど
それが関係してる?

ttps://twitter.com/mutaguchi/status/570562195479597057
ttps://twitter.com/mutaguchi/status/570564740134514688
ttps://twitter.com/mutaguchi/status/570564935328997377
ttps://twitter.com/mutaguchi/status/570569659281317889
ttps://twitter.com/mutaguchi/status/570572243035512833

ActionPreferenceStopExceptionの基底クラスがRuntimeExceptionだから
RuntimeExceptionでもcatchできると

ttps://msdn.microsoft.com/en-us/library/system.management.automation.actionpreferencestopexception.aspx
421 [] 2015/02/26(木) 17:51:58.02 :AgWRqx80

おお
わざわざ調べてくれてありがとう
まさにそれっぽいわ

PS C:\Windows\system32> $PSVersionTable

Name                 Value
----                 -----
CLRVersion             2.0.50727.5485
BuildVersion             6.1.7601.17514
PSVersion              2.0
WSManStackVersion       2.0
PSCompatibleVersions      {1.0, 2.0}
SerializationVersion         1.1.0.1
PSRemotingProtocolVersion  2.1

バージョン上げてみる
名無し~3.EXE [] 2015/02/26(木) 21:05:12.07 :AgWRqx80
バージョン上げたらキャッチできた。
で、ttps://twitter.com/mutaguchi/status/570572243035512833
も検証してみたがその通りだった。

try {
  ls $Args[0]
} catch [System.Management.Automation.ItemNotFoundException] {
  "ItemNotFoundException"
} catch [System.Management.Automation.ActionPreferenceStopException] {
  "ActionPreferenceStopException"
}

結果:ActionPreferenceStopException

まあこれは百歩譲るとして

} catch [System.Management.Automation.ItemNotFoundException] {
  "ItemNotFoundException"
} catch [System.Management.Automation.RuntimeException] {
  "RuntimeException"
}

結果:RuntimeException
名無し~3.EXE [] 2015/02/26(木) 21:09:56.69 :AgWRqx80
} catch [System.Management.Automation.ItemNotFoundException] {
  "ItemNotFoundException"
} catch [System.Exception] {
  "Exception"
}

結果:Exception
おいふざけんなコラ

try {
  try {
    ls $Args[0]
  } catch [System.Management.Automation.ItemNotFoundException] {
    "ItemNotFoundException"
  }
} catch [System.Exception] {
  "Exception"
}

これならItemNotFoundExceptionになる 👀
名無し~3.EXE [] 2015/02/26(木) 21:19:49.34 :AgWRqx80
結論
ver3.0以降ではthrowされた例外をまずActionPreferenceStopExceptionとして
catchブロックをスキャンし、catchできるブロックがない場合に
本来の例外型でcatchブロックをスキャンしなおす

そのためActionPreferenceStopExceptionのスーパークラスである
RuntimeException、SystemException、Exceptionのcatchを
RuntimeExceptionのサブクラスのcatchと並べて書いてはいけない。

マイクロソフトは死ね
名無し~3.EXE [sage] 2015/02/27(金) 01:35:28.89 :0XcQcnoR

なんで426に目玉がつくの?
名無し~3.EXE [sage] 2015/02/27(金) 08:53:44.23 :bSthd26A
&amp#128064;
👀
名無し~3.EXE [sage] 2015/02/27(金) 08:54:19.35 :bSthd26A
&amp;#128064;
こうか
名無し~3.EXE [] 2015/02/27(金) 18:29:37.90 :9x7T7vro
練習

&amp;amp#128064;
名無し~3.EXE [] 2015/02/27(金) 18:33:06.04 :9x7T7vro
あれ?

&$128064
名無し~3.EXE [] 2015/02/27(金) 18:35:40.04 :9x7T7vro
こうかな?

👀
名無し~3.EXE [] 2015/02/27(金) 18:37:45.80 :9x7T7vro
ぱちぱち
ユニコードの指定か〜
👏
名無し~3.EXE [] 2015/02/27(金) 18:40:26.39 :8jWPI845
/*--------------*/
/*---main.asm---*/
/*--------------*/
名無し~3.EXE [sage] 2015/02/28(土) 20:55:47.33 :hGktvx7/
俺も目玉練習&amp;#128064;…じゃなくて質問があります

ユーザーが入力した文字列をオプションとしてコマンドに渡したいのですが
どのようにすればいいですか?

$options = ReadHost
> -i input.mp3 -ac 1 -ab 64k output.mp3
ffmpeg $options
例えば↑のようにすると$options文字列全体が単一のオプション
として解釈されてしまうのですが、これを複数のオプションとして渡したいです。

ご存知の方、ご回答お願いします
名無し~3.EXE [sage] 2015/02/28(土) 23:00:28.59 :moTz53+a
$options = (Read-Host) -split " "
ffmpeg @options
名無し~3.EXE [sage] 2015/02/28(土) 23:19:54.76 :moTz53+a
about_Splatting
ttps://technet.microsoft.com/en-us/library/jj672955.aspx
436 [sage] 2015/03/01(日) 00:30:09.87 :4pMWpHBt
>437-438
レスありがとうございます!
なるほど、配列にすればいいんですね
目から鱗です

出先から携帯でレスしてるので帰ってから試してみます
めちゃくちゃ助かりました
名無し~3.EXE [] 2015/03/01(日) 07:19:23.87 :OSMqI2rj

そっか -split というオプションあるのね。
.NETの機能そのまま使って
(Read-Host).Split(" ")
でもいいですね。
cmdletの中身自体がこれだろうな。
名無し~3.EXE [sage] 2015/03/01(日) 09:08:26.40 :8xk8MoFK

-splitはRead-Hostのパラメータじゃなくて演算子だよ

about_split
ttps://technet.microsoft.com/ja-jp/windows/dd347708.aspx
名無し~3.EXE [] 2015/03/01(日) 18:09:34.71 :/aHo9vmY
あ、ほんとだね。
ありがと
名無し~3.EXE [] 2015/03/05(木) 03:22:42.31 :pIr+FJWY
組織変更に伴い、ファイルサーバとADの置換を行いたいとおもいます。
NTFSのアクセス権をSIDで検索してSIDできれば権限を置換したいのですが可能でしょうか?置換する元データはExcelで旧SIDと新SIDと権限を用意して、上から検索してEOFまで実行していきたいです。
名無し~3.EXE [sage] 2015/03/05(木) 14:58:15.21 :v2jdIrjM

夜中にレスがつかないからってマルチやめれ
ttp://peace.2ch.net/test/read.cgi/tech/1378978504/373
名無し~3.EXE [sage] 2015/03/07(土) 14:08:52.75 :u96i1hrp
マルチってぜんぜん違う板なんだからいいと思うよ
名無し~3.EXE [sage] 2015/04/05(日) 22:36:24.51 :guHkqQOY
配列の配列について誰か助けて欲しい・・・。

$csvfile = import-csv csvfile.csv
$table = @{}

foreach ( $line in $csvfile ){
$key = $line.Year
$table.Add("$key","$line")
}

こんなコード書いた。
CSVファイルの中身はこんな感じ

Year,Make,Model
1996,Ford,E350
2001,Mercury,Cougar


俺としては、

$table["2001"]["Make"]と書くことで、"Mercury"という値を求めたいんだが、
うまくいかない。これじゃダメ?
単に $table["2001"] とやると、値として @{Year=2001; Make=Mercury; Model=Cougar}  というものが入っている模様。
ただし、こいつはオブジェクトじゃなくてStringになってしまっている。
名無し~3.EXE [sage] 2015/04/05(日) 23:21:09.71 :dixHxGO0
$table.Add("$key","$line") → $table.Add($key,$line)
"$line"の所で$lineが文字列に変換されちゃってる

$table["2001"]["Make"] → $table["2001"].Make
$lineの型はhashtableじゃなくてPSCustomObjectだから
メンバーのアクセスは.を使う必要がある
名無し~3.EXE [sage] 2015/04/05(日) 23:48:37.12 :guHkqQOY

うお!!解決した、ありがとうございます。
"$line" のダブルクォートがそんな大きな違いを生んでたのか・・・。

PowerShell触るようになってオブジェクトという概念に初めて出合ったんだけど、
なかなか要領を得ない。
名無し~3.EXE [sage] 2015/04/06(月) 19:28:49.37 :y/lF7C+P
linuxのshellとかしか知らない人間からしたらPowerShellはすごくわかりやすいんだけど、
それでもオブジェクトで躓く。
かといってVBは最初から意味不明で
どうすりゃいいんだ
名無し~3.EXE [sage] 2015/04/06(月) 21:22:24.94 :beAzasQj
C#あたりで遊んでみようか
名無し~3.EXE [sage] 2015/04/06(月) 21:38:16.50 :y/lF7C+P
C#か。わかった。
名無し~3.EXE [sage] 2015/04/06(月) 21:39:29.68 :y/lF7C+P
PowerShellはとっつけたけど、VBやVBA、本当に意味不明でくじけたんだけど、
これって何故なのかわかる人居る? オブジェクト指向というやつだからなのかな。
名無し~3.EXE [sage] 2015/04/06(月) 21:46:41.90 :1GGoAtct
VBはOOPじゃなくても組めるんじゃね?
名無し~3.EXE [sage] 2015/04/07(火) 00:10:52.32 :UbMSf4yu
プログラム言語のまとまった学習を一度もしたことがなくて
簡単なスクリプトの感覚で適当にやろうとしてくじけたってことなら
体系的に説明してる本かサイトで順番に見ていったほうがいいと思うよ
読みながら実際に打って動かしてみるってことね
名無し~3.EXE [sage] 2015/04/07(火) 10:56:23.39 :0avtSYxr

ふむ。昔C習ったからC#にするわ。
名無し~3.EXE [sage] 2015/04/07(火) 23:14:12.23 :P8YmI926
acl に複数のユーザーを追加するコマンドレットおしえて
名無し~3.EXE [sage] 2015/04/08(水) 17:48:07.43 :9csQJWpD

そのものズバリの Get-Acl Set-Acl というコマンドレットがあります

System.Security.AccessControl 名前空間 ()
ttps://msdn.microsoft.com/ja-jp/library/System.Security.AccessControl(v=vs.110).aspx
FileSecurity クラス (System.Security.AccessControl)
ttps://msdn.microsoft.com/ja-jp/library/system.security.accesscontrol.filesecurity(v=vs.110).aspx
FileSystemRights 列挙体 (System.Security.AccessControl)
ttps://msdn.microsoft.com/ja-jp/library/system.security.accesscontrol.filesystemrights(v=vs.110).aspx
AccessControlType 列挙体 (System.Security.AccessControl)
ttps://msdn.microsoft.com/ja-jp/library/w4ds5h86(v=vs.110).aspx

# <パス>のACLにアクセスルールを追加する
# <パス>のACLを取得する (戻り値は System.Security.AccessControl.FileSecurity オブジェクト)
$acl = Get-Acl <パス>
# 現在の内容を確認
$acl.Access
# 新しいアクセスルールを作る (上記列挙体ご参考) (1)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule "DOMAIN\hoge",([System.Security.AccessControl.FileSystemRights]::Modify),([System.Security.AccessControl.AccessControlType]::Allow)
( $rule = New-Object Security.AccessControl.FileSystemAccessRule "DOMAIN\hoge","Modify","Allow" でも良い)
# ルールの追加 (2)
$acl.AddAccessRule($rule)
# (1)(2)を必要なユーザー分繰り返す
# 変更されたACLを<パス>に適用する
$acl | Set-Acl <パス>

使ったことはないですが多分こんな感じで

# おまけ (powershellを管理者で起動)
Start-Process powershell.exe -Verb runas
名無し~3.EXE [sage] 2015/04/10(金) 10:47:59.17 :d4W3NaDJ
チャブーン氏とか早百合さん好き。
名無し~3.EXE [sage] 2015/04/15(水) 14:23:08.59 :zeYUjbrD
土井崎さん(確か)を忘れるな
名無し~3.EXE [sage] 2015/04/23(木) 22:08:53.18 :HzHeW5sP
ttps://twitter.com/hmemcpy/status/591159871032205312

Oooh, bit of syntax highlighting was added to the PowerShell console in Windows 10 build 10061
名無し~3.EXE [sage] 2015/04/26(日) 09:48:21.00 :CQ3bvaKi
ttps://twitter.com/markscholman/status/591998938921730049

Cool! PowerShell in win10 build 10061 try to type a command like get-service -( followed by (CTR + Space))
名無し~3.EXE [sage] 2015/04/26(日) 16:27:20.15 :M7+uw69m
build 10061版
PS C:\WINDOWS\system32> $PSVersionTable
Name               Value
----               -----
PSVersion            5.0.10061.0
WSManStackVersion      3.0
SerializationVersion      1.1.0.1
CLRVersion           4.0.30319.0
BuildVersion           10.0.10061.0
PSCompatibleVersions     {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion 2.3

Ctrl-Spaceの候補は数が多いと表示するか確認が表示される
ttp://i.imgur.com/XmP4sKp.png
候補の確定はスペースや文字キー
エンターを押すとコマンドが確定して実行されてしまうので注意

デフォルトではコマンドプロンプトみたいな見た目になってる
ttp://i.imgur.com/6ZkU0h7.png
デフォルト設定のオプション画面
ttp://i.imgur.com/d0ZwU6X.png
名無し~3.EXE [sage] 2015/04/26(日) 20:53:59.70 :+kV4gGT2
昔タブ補完で無理くりコピペ機能を実装してたころから行くとずいぶんUIも改善されたねぇ
まあ、ISEに移行してほしいんだろうけど
名無し~3.EXE [sage] 2015/05/03(日) 21:37:04.30 :clv3Cfy0
ttps://gist.github.com/altrive/c9b39f5bc8dcc8791274

v5はusingが使える
名無し~3.EXE [sage] 2015/06/12(金) 21:57:39.08 :OvVQ+JxV
ビルド 10130 で、PowerShellの実行ポリシーが変更できない。
ttp://answers.microsoft.com/ja-jp/insider/forum/insider_wintp-insider_security/%E3%83%93%E3%83%AB%E3%83%89-10130/37feda22-1bb2-4fb5-add4-d25c91932858
名無し~3.EXE [] 2015/07/01(水) 07:10:55.21 :7hM8JLQd
-------テキストファイル sample.csv 中身--------
Aaa,Bbb,Ccc
Ddd,Eee,Fff
Xxx,Yxx,Zxx
名無し~3.EXE [] 2015/07/01(水) 07:14:15.77 :7hM8JLQd
のようなテキストファイルを読み込み、
各行において、カンマ区切りにおける要素数を出力する処理を書いてる。
このようなフィルタを書いた。

filter trimString
{
$_.split(",") | % {
$line++
}
return $line
}

get-content sample.csv | trimString


しかし、これだともちろんうまくいかない。
フィルタの冒頭に"remove-variable line"を置けば意図した結果は得られる。
ただ、そういう方法ではなく、Aaa,Bbb,Ccc の処理が終わったら、次の行(Ddd,Eee,Fff)の処理に移る段階で、
変数には寿命が尽きて頂きたい。

で、いろいろ試行錯誤していたら、以下の方法でうまくいった。

filter F_trimString
{
&{ $_.split(",") | % {
$line++
}
return $line
}
}

get-content imaki.csv | F_trimString
名無し~3.EXE [] 2015/07/01(水) 07:20:06.51 :7hM8JLQd
ここで質問なのだが、俺がやっているこの方法は、クロージャーというやつなんだろうか?
それとも全然違う何かなのだろうか。

& というのは eval みたいなものだと理解しているが、どこかのブログで見たクロージャーの解説とやっていることが
似ているような気がするのだ。
ただ、その人のブログは GetNewClosure()というメソッドを使っていたから、違うのかもしれない。

違っていてもいいんだけど、とにかくこれで、パイプラインでこのフィルタを用いても、
処理が終了わるまで$lineが生かされてしまうということは防げた。

この手法が何と言うのかはわからないけど、これは、まさにこういう目的で使用するものなのだろうか?
名無し~3.EXE [] 2015/07/01(水) 07:24:04.60 :7hM8JLQd
ぐぁあああ すみません、  のコードの最終行間違えてる。

× get-content imaki.csv | F_trimString
〇 get-content sample.csv | trimString
名無し~3.EXE [sage] 2015/07/01(水) 08:32:46.59 :ynfABpgI
$private:line

じゃあかんの???パイプではどうかわからんが
名無し~3.EXE [sage] 2015/07/01(水) 09:33:00.46 :Iv5K3nMP

スクリプトブロックを実行して単に数値を返してるだけだから、クロージャーではないんじゃない?
スクリプトブロック({}の中身)は別スコープになるので、その使い方はありだと思う。
&{}は、C#とかでいうブロックと似たような使い方になるのではないかな。
名無し~3.EXE [sage] 2015/07/01(水) 12:10:53.56 :a4AB/N55

「スクリプトブロック」を使った何かなのか。
ありがとう!
名無し~3.EXE [sage] 2015/07/01(水) 12:11:50.76 :a4AB/N55

どうも。
それあかんかった。変な言い方になるが、パイプでは全部に効くみたい。
名無し~3.EXE [sage] 2015/07/01(水) 15:58:14.54 :+KAiBvSt
パイプラインで、次の行に行く段階では変数を死滅させる方法って他にある?
名無し~3.EXE [sage] 2015/07/10(金) 13:48:47.63 :L2ul6WOs
どこで初期化してるかわからん様な書き方はするなってことだろ
パイプはダイナミックスコープらしいので
唐突に$line++のような書き方するのは不安が残る
どうしてもやりたいならの&スクリプトブロックでいいと思う
でもをぱっと見ても処理の違いがすぐわからんのよね・・・

splitした配列をlengthで数えるんじゃ嫌なの?

filter _trimString
{
$items= $_.split(",")
return $items.length

}

まあ嫌なんだろうな
この話は興味深いところもあるけどプログラム板向けな気もする
気が向いたらスコープの話として適当にまとめてあっちに書いとくわ
名無し~3.EXE [sage] 2015/07/10(金) 17:25:05.51 :AKLZph39
興味深いからどこに書いたかあとでURLクレ
名無し~3.EXE [sage] 2015/07/13(月) 08:27:24.06 :M3Qu8mvN

そんなことができるのか!!!!
名無し~3.EXE [sage] 2015/07/13(月) 15:07:32.57 :a8SsnPji
>"まあ、関数にするほどでも、ないよな".split('、').length
3
名無し~3.EXE [sage] 2015/07/15(水) 08:23:09.66 :jA2zchu+
パワーシェルでエクセルにリアルタイムでセルに値を入れられるぞ!
名無し~3.EXE [sage] 2015/07/15(水) 08:23:39.26 :jA2zchu+
もうクッソ難解なVBA要らなくなるような
名無し~3.EXE [] 2015/07/22(水) 14:10:55.68 :aQspH6vY
指定文字列Aと指定文字列Bで挟まれた部分のみを抽出する関数を作ろうと思うんだが、
どうすればいいだろうか?


$line = 'Username:hoge ,Code:5 ,NextCode:ABC ,Groupname:keiri'

のうち、'Code:' と ', NextCode:' で挟まれた部分、すなわち 5 という数字「のみ」
を抽出したい。


指定文字列を含んだ形で出力されるところまでは、以下のような形でできるんだけど、
どうすればいいだろう?


function regex_pickup ($start,$end){
   $joinRegex = "$start(.*?)$end"
   $regex = [regex]$joinRegex
   return ($regex.Matches($line)).val
}

$str | f_regex_pickup 'Code:'   ' ,NextCode:'
名無し~3.EXE [] 2015/07/22(水) 14:12:50.32 :aQspH6vY
$line | regex_pickup 'Code:'   ' ,NextCode:'


最下行を↑に訂正
名無し~3.EXE [] 2015/07/22(水) 16:20:44.77 :nah9wIJs
.val  ×
.value ○
名無し~3.EXE [sage] 2015/07/22(水) 17:48:10.82 :El18rJ3g
()でくくった$1、$2の部分は$Matches[1]、$Matches[2]に入るよ
名無し~3.EXE [sage] 2015/07/22(水) 18:22:14.09 :El18rJ3g
と、思ったら[regex]使った場合は入らないのか
どうやって参照するんだろ
ついでに上のコード、$lineで取得したらパイプの意味ないじゃないか

要望の動きをする関数ならこんな感じ?

filter regex_pickup ($start,$end){
if($_ -match "$start(.*)$end" ){
$Matches[1]
}
}
名無し~3.EXE [sage] 2015/07/22(水) 18:51:22.95 :8EtfdAzF
[regex]ならこんな感じ。

filter regex_pickup ($start,$end){
$joinRegex = "$([regex]::Escape($start))(.*?)$([regex]::Escape($end))"
$regex = [regex]$joinRegex
$regex.Matches($_)| % {$_.Groups[1].Value}
}
名無し~3.EXE [] 2015/07/22(水) 21:27:39.39 :l83shnNd


どっちも出来た・・・ありがとう。

-matchは一致する行を表示させるときに鹿使わないので、びっくりした。
というより、そもそも $Matches[1]  って特殊な変数なのか!?
こんなの知らなかった。

[regex]::Escapeってのも知らない・・・なんか、いろいろあるんだな。
名無し~3.EXE [] 2015/07/22(水) 21:29:02.03 :l83shnNd
おお!

>ちなみに、一度-match演算子を使うと$matchesというHashtable型のシェル変数に、マッチ情報が入ります。
ttp://winscript.jp/powershell/197

ということのようだ。
すごい。
名無し~3.EXE [] 2015/07/22(水) 23:49:01.24 :l83shnNd
filter torikomi ($gyoutou,$gyoumatu){

$strings=$_.replace($gyoutou,"")
$strings=$strings.replace("$gyoumatu","")
return $strings
}

"My Name Is Tadokoro" | torikomi "My" "Tadokoro"


−−−−−−−−−−−−−−−−−−−−−


上記の処理でやりたいことは出来るんだが・・・・


できれば、 Tadokoro の部分は 行末一致で Tadokoro$
としたいんだが、できない。


$strings=$strings.replace("$gyoumatu","")
を、
$strings=$strings.replace("${gyoumatu}$","")

にしたんだけど、ダメ。
エスケープの \ とか バッククォートも試してみたんだけど・・・・
なんでできないんだろう。
名無し~3.EXE [sage] 2015/07/23(木) 00:04:15.79 :TmUJLKV0
string.Replace()は正規表現じゃないぞ…
-replace演算子を使ってみては
名無し~3.EXE [sage] 2015/07/23(木) 00:05:04.67 :cx7wabqL
""で囲った部分はreplaceに渡される前に変数の解釈されるからだろうな
$strings=$strings.replace($gyoumatu + '$','')
ならたぶんいけるだろう

解釈が必要ない部分は極力シングルクォーツでくくった方がいい
"My Name Is Tadokoro"のとこも
名無し~3.EXE [sage] 2015/07/23(木) 00:10:11.77 :cx7wabqL

あ、そうなんだ 試さずに適当言ったらだめだな
こうかな

$strings=$strings -replace ($gyoumatu + '$') , ''
名無し~3.EXE [] 2015/07/23(木) 00:35:47.69 :LwW6EXN9

492の方のやり方で成功した。ありがとう。


正規表現使えなかったのか・・・・ありがとう。
名無し~3.EXE [] 2015/07/23(木) 07:38:35.02 :LwW6EXN9
trimstart($hogehoge$) みたいなのも実は正規表現では対応できないとか?
名無し~3.EXE [] 2015/07/23(木) 07:41:23.65 :LwW6EXN9
$strings='My:Name:Is:Tadokoro'

から、

$strings.trimstart('My:Name')

ってやると、なぜか Is:Tadokoro ってなるんだよなぁ。

:Is:Tadokoro

じゃないのかよと。
名無し~3.EXE [] 2015/07/23(木) 08:16:32.86 :d/ZHeKZe
:が要らないんじゃね?
名無し~3.EXE [] 2015/07/23(木) 08:37:59.27 :5nYvgkLM
そもそもtrimstartって()でないとあかんのと違う?
名無し~3.EXE [sage] 2015/07/23(木) 10:35:33.28 :de6pVrmQ
ttps://msdn.microsoft.com/ja-jp/library/system.string.trimstart(v=vs.90).aspx

>TrimStart メソッドは、現在の文字列の先頭から、
>trimChars パラメータで指定された文字をすべて削除します。
>文字を削除する処理は、trimChars で指定されていない文字が出現したときに停止されます。
>たとえば、現在の文字列が "123abc456xyz789" であり、
>trimChars に "1" から "9" までの数字が含まれる場合、
>TrimStart メソッドは "abc456xyz789" を返します。

引数に:が入ってるんだからIs:Tadokoroの前の:も当然削除対象
名無し~3.EXE [] 2015/07/23(木) 12:01:33.62 :iy7g7QrY

つまり、「文字列」として扱うわけではなく、
キャラクタが並んでるだけ、なんだな?
名無し~3.EXE [sage] 2015/07/23(木) 12:56:33.74 :a5uKd5Av
なんでIsTdokoroにならんの?
名無し~3.EXE [] 2015/07/23(木) 14:40:24.05 :hCx0QfRt
パワーシェルで、マルチコアの恩恵を受けるにはどうすればいいだろう?

たとえば、単一のスクリプト内で、まず、巨大なファイルを読み込む。

その変数を、真ん中でぶった切って、二つの変数にわける。
この二つの変数に対する、集計処理を、並列に行いたい場合で、
マルチコアならではのパフォーマンスを得るには????可能なのかな。
名無し~3.EXE [sage] 2015/07/23(木) 14:52:44.94 :pOD9x2hC
集計処理ってIO依存だからマルチコアの恩恵を受けにくい悪寒
名無し~3.EXE [sage] 2015/07/23(木) 14:56:26.28 :Vd2+0TVt
コマンドレット単位で並列化に対応しているならともかく、
PowerShellのスクリプトの工夫で並列化による高速化をしようってのは筋が悪すぎるだろう
名無し~3.EXE [sage] 2015/07/23(木) 15:24:43.51 :5okeu0Gy
津波で死んだ人の8のライセンス拝借して
それをもとに10に無償ugできますか?
名無し~3.EXE [] 2015/07/23(木) 15:46:19.66 :d4iydyKC

なるほど
名無し~3.EXE [sage] 2015/07/23(木) 16:12:01.71 :kD+us/W1
独立な作業をいくつか用意しておいて、コア数分だけPowerShellプロセスを立ち上げる
名無し~3.EXE [] 2015/07/23(木) 20:33:32.00 :LwW6EXN9
489についてだが、

if($_ -match 案が一番高速だった。
名無し~3.EXE [sage] 2015/07/23(木) 21:19:17.98 :cx7wabqL
486の方が高性能ではあるよ
検索用語に()や\が入ってても大丈夫だし、複数箇所にヒットする

あまり意味はないが、高速化なら
関数呼び出し使わない、[regex]の設定を一回にして使い回す
一行に一カ所と分かってるならMatchesをMatchに変えるとか
名無し~3.EXE [] 2015/07/24(金) 11:57:42.48 :9Q3n2txp
確かに膨大になると高速だ
名無し~3.EXE [sage] 2015/07/28(火) 16:55:11.81 :RCoob5pZ
ttps://github.com/mattifestation/PowerShellArsenal

PowerShellな逆アセンブラ
名無し~3.EXE [] 2015/07/30(木) 00:18:27.39 :9jGL3t1Z

既存のコンソールアプリを同時に立ち上げて、プロセス数を常に監視して
制御するようなスクリプト組んだら恐ろしく捗ったわ
お互い干渉しない大量なファイルを処理するって場面だけだろうけど
名無し~3.EXE [] 2015/08/03(月) 01:16:59.40 :N/iTJH/h
俺の今までのコードの書き方として、

$fileData = get-content 4GBytes.txt

とした場合、その後の処理で

$needData = $fileData | foreach { $_ -match "Strings" }

とした場合、以後 $needData しか取り扱わないので、

$fileData = $null
または remove-valiable fileData
を実行している。

で、これって意味あるよね?
まさか、PowerShellが 「これ以降は$fileDataが使われている様子はなさそうだから、GCしちゃえ」
って賢く対応してくれるから、必要ない?
名無し~3.EXE [sage] 2015/08/03(月) 17:49:44.23 :CcPLg17e
意味がないわけではないがその場合変数に入れずそのままパイプラインに入れるなり、
スクリプトブロック内で処理して別スコープにして勝手に破棄される方が確実じゃない?
名無し~3.EXE [] 2015/08/03(月) 19:54:44.43 :N/iTJH/h

俺もそうしたいんだけど、
職場に「二度以上繋ぐパイプラインは逃げ」みたいに考えているアホが居る。

スクリプトブロック内にするのは良いな!
ありがとう。
名無し~3.EXE [] 2015/08/03(月) 19:55:39.76 :N/iTJH/h
あれ?
スクリプトブロック内になると破棄されるの?
名無し~3.EXE [sage] 2015/08/03(月) 20:03:09.40 :aCRPinwv
Windows10ではWindowsUpdateが大幅に変わりWindowsUpdate.logは使われなくなった
PoweShellで Get-WindowsUpdateLog (Logの前にピリオド無し)と叩くと
デスクトップにWindowsUpdate.logが生成される
とダミーのWindowsUpdate.logに書いてあった
名無し~3.EXE [sage] 2015/08/03(月) 23:49:25.32 :WTMa6SSN
パイプが逃げってよくわからんな、一番PSらしいとこじゃないか
5重以上のパイプもよく組むが
名無し~3.EXE [sage] 2015/08/04(火) 00:00:07.48 :qWs2SW5R
PowerShellのパイプはバイナリを流すと詰まるからな
名無し~3.EXE [sage] 2015/08/04(火) 02:46:33.08 :oIxTXiqH
理由あってスローガン掲げてるなら別にいいと思うんだけど
別のパラダイムで培った標語を無批判に持ち込む人って居るよね
名無し~3.EXE [sage] 2015/08/04(火) 03:13:51.24 :KRfMLoE9
実はオブジェクト指向ってしっくりこないんです!
名無し~3.EXE [sage] 2015/08/04(火) 09:29:54.44 :AWzW4HCX

スクリプトブロックの中は別スコープなので外から参照できない
なので実行し終わったら居ないも同然でほっとけばGCに回収される
名無し~3.EXE [sage] 2015/08/04(火) 23:59:53.58 :QGweG2U8

多段パイプでテキスト構文解析がややこしくなるUNIXの文化だろうなあ
俺の職場にはこいつVB書いてたろというのがいる
全段でtry catchしてcatchしたらEXIT 1してスクリプトを抜ける構造化の対極にいるすばらしいのうのとろけぐあいが
おまえその戻り値の1は誰が受けんだよとか1もどしても.netではBoolに解釈されねえんだよとか色々酷い
名無し~3.EXE [] 2015/08/05(水) 22:53:04.42 :X1Fg5gOm
ttp://hoge.com/pic1.jpg から
ttp://hoge.com/pic100.jpg までの100個の画像をダウンロードするにはどうすればいいですか?
名無し~3.EXE [sage] 2015/08/05(水) 23:19:03.32 :IG8sWnbH
jdownloaderとか使った方が楽ちゃうかとw
名無し~3.EXE [sage] 2015/08/06(木) 00:10:18.10 :6F1y1Bxh
Irvineでもいいなw
名無し~3.EXE [sage] 2015/08/06(木) 09:44:27.91 :sauSzCtU
Invoke-WebRequest使えば?
aliasでwgetになってるかもしんないけど

と書いておいてなんだけど俺もダウンロードそのものが目的ならダウンローダ使うのをおすすめするわw
名無し~3.EXE [] 2015/08/10(月) 08:06:55.65 :InJkjojY


え!そうなのか!!
名無し~3.EXE [] 2015/08/10(月) 08:09:31.43 :InJkjojY

どんなコードなのかよくわからない・・・・

exit -1 はなんとなく俺もよく書いてるけど、意味ないケースもあるってことか。

try catchは安易に使うものではないというのは聞いたことはある。
よっぽどの例外中の例外処理で
名無し~3.EXE [sage] 2015/08/10(月) 14:00:55.88 :+NEuODn5
そもそもpowershellでexitステートメントに何かつけるのに意味あるのか?
名無し~3.EXE [] 2015/08/11(火) 08:23:41.13 :cc5WjsJB
俺も以前、technetで指摘いただいたがtry,catchは設計者想定範囲内の挙動に対して使うものではないようだ。
例えばファイルの移動時にファイルに排他制御がかかっている状況なんか、よくあることで、例外でも何でもない。
だからそんな時にcatch文なんか使うものではない、という理解。
名無し~3.EXE [sage] 2015/08/11(火) 09:45:56.95 :pN8W6+v+
例外でもなんでもない言ってもエラーは全部例外としてスローしろってのが.NETでは
問題になるのはあらゆる状態でキャッチしてエラー状態をうやむやにするような書き方で
名無し~3.EXE [sage] 2015/08/12(水) 12:31:13.57 :49Kftis1
普通に書いていればバグで例外が出たとき
その発生位置と例外の詳細が出力される

無知なcatch濫用はすべてを
名無し~3.EXE [sage] 2015/08/12(水) 12:37:46.79 :49Kftis1
すべての有用な情報を捨ててしまって
全体として失敗(-1)でしたということしか教えてくれなくなる
名無し~3.EXE [sage] 2015/08/12(水) 14:04:11.34 :52qae1a9
catchしたい例外だけ捕まえればいいだけなんだけどな
名無し~3.EXE [sage] 2015/08/12(水) 21:23:51.39 :vjyAu9H7
まともな例
catch [system.io.exception]{
例外からの回復処理
}
マシな例
catch{
何かの処理
throw
}
ダメな例
catch{
  #エラーを抑制する
}

エラータイプ指定しない全キャッチは何が起こったかすらわからないので再スローしてくれ
一番下みたいのは論外
名無し~3.EXE [] 2015/08/15(土) 21:00:22.69 :clp1r6vx
#IEを起動する。
$ie = New-Object -ComObject InternetExplorer.Application

#移動して、IEを表示する。
$ie.Navigate("ttp://www.google.com")
$ie.Visible = $true

#ロードが完全に終わるまで待つ処理。
While($ie.Busy)
{
#1秒待機する
Start-Sleep -s 1
}

#表示されたサイトのドキュメントを取得する。
$doc = $ie.Document

#検索語を入力するテキストボックスを取得する。
$btns = $doc.getElementsByTagName("input")
$SearchText = $btns | ? { $_.Name -eq "q" -and $_.Type -eq "text"}

#検索語を設定する。
$SearchText.value = "search text"

#検索開始ボタンを取得する。
$SearchButton = $btns | ? { $_.Name -eq "btnG" -and $_.Type -eq "submit"}

#検索開始ボタンをクリックする。
$SearchButton.click()
名無し~3.EXE [] 2015/08/15(土) 21:00:49.82 :clp1r6vx
どう直せばいいかな?検索開始ボタンがうまくいかない。
名無し~3.EXE [sage] 2015/08/15(土) 22:13:35.82 :O3fR7y63

btnGをbtnKにしたら動いたよ
名無し~3.EXE [] 2015/08/15(土) 22:40:33.38 :clp1r6vx

うわ、、ほんとだありがとうございまーす!
名無し~3.EXE [sage] 2015/08/16(日) 17:07:22.69 :JikdXzdi
PowerShell v5 が Windows10 と共に出たというのに、さっぱり情報が出てこないな…
大幅な機能追加となる クラス の書き方すらまともにヘルプがないのはどうなのよ。
名無し~3.EXE [sage] 2015/08/16(日) 17:23:57.37 :cDcoCsA/
現状プレビューで正式版は来月以降で
ttp://blogs.msdn.com/b/powershell/archive/2015/08/06/windows-management-framework-wmf-5-0-roadmap.aspx
それまで利用者が少ないWin10だけとなれば盛り上がるわけがない
名無し~3.EXE [] 2015/08/16(日) 18:41:44.72 :71c1OHSX

そんなのマイクロソフトのお得意技だろ。
名無し~3.EXE [sage] 2015/08/16(日) 19:45:59.03 :PEG2E9Zj
出来るに越したことはないし、それ自体はかなり大規模な機能追加なのも分かるけど
私は別にクラス定義を求めていないのだよ
名無し~3.EXE [sage] 2015/08/16(日) 21:50:09.05 :Tu+SFM4P

about_Classes
ttps://technet.microsoft.com/ja-jp/library/dn820211.aspx
名無し~3.EXE [sage] 2015/08/18(火) 14:22:45.63 :ZBS0//kB

> In this release, New-Object does not work with classes defined in Windows PowerShell.
>
せやろか?
名無し~3.EXE [sage] 2015/08/19(水) 15:06:06.51 :ljHSQEF7

ヘルプが全然更新されてないのよね

>更新日: 2014年9月
名無し~3.EXE [sage] 2015/08/26(水) 07:05:26.15 :BoRUM7CA
ここのサイトを見て、ファイル比較を実施したのですが、
結果として、1行辺り60文字くらい?を超える文字列は「...」で省略されたものとなりました。
省略せずに、1行全ての文字列を表示させることは可能でしょうか?
ttp://qiita.com/kmr_hryk/items/9b0d28ed0fda5b34f07c
名無し~3.EXE [sage] 2015/08/26(水) 09:23:22.18 :Sp9vaZtV

自前で出力すればいい
Compare-Object $A $B|%{$_.inputobject + "`t" + $_.SideIndicator}

でもファイル比較ならwinMergeとか使った方がいと思うぞw
名無し~3.EXE [sage] 2015/08/27(木) 06:51:31.97 :9lLm303o
ありがとうございます。試してみます。
>でもファイル比較ならwinMergeとか使った方がいと思うぞ
XMLの比較なのですが、WinMergeやBeyond Compareを使いましたが、ダメダメでした。
そして、oxygenを使ってみたら、良い感じでしたが、その結果をエクスポートできなかったので、
PowerShellを試してみようかなと思ってる次第です。
名無し~3.EXE [sage] 2015/08/28(金) 22:28:53.16 :mOMBdRYz
関数のオプションに配列をバラして渡せないかな
myfunction $A[0] $A[1] $A[2]...
と同等のことを簡単に書きたい

とりあえず関数側で分解するようにしたが、もっとうまい方法ありそうなんだけど
名無し~3.EXE [sage] 2015/08/29(土) 10:09:51.06 :nrj6w9aI
配列そのまま渡して関数内でばらせば?
名無し~3.EXE [sage] 2015/08/29(土) 10:50:11.08 :nrj6w9aI
ゴメンもうやってたか
一番いいのはオブジェクトで格納して名前で関数に受け入れるかな
名無し~3.EXE [sage] 2015/08/31(月) 02:28:06.96 :WD+SQCop

配列が固定長なら、分配演算子(っていうのか?) 使って、「数字の名前のプロパティ」として取り出すのはどうだ?
function hoge ($0, $1, $2, $3) { 0..3 | %{ iex "`$$_" }; }
$array = @('foo 0', 'bar 1', 'foobar 2', 'giko 3')
hoge @array

部分的に使いたい場合は、別の配列に入れ直す必要があるが。
$array2 = $array[0..2]
hoge @array2

可変長なら、関数側で分解すべきだろう。
547 [sage] 2015/08/31(月) 07:20:44.54 :ME+SRlQU
PowerShellでXMLの比較をしました。
$A = Get-Content a.xml
$B = Get-Content b.xml
Compare-Object $A $B -IncludeEqual |%{$_.inputobject + "`t" + $_.SideIndicator} > diff.txt

比較結果(今回の場合diff.txt)の並びに関して、
=とか=>や<=が比較元のデータの並びどおりではなく、
まず=の行がならび次に=>の行、そして<=の行と並ぶのは仕様でしょうか?
名無し~3.EXE [sage] 2015/08/31(月) 12:47:35.26 :nY8GBZR2

仕様はヘルプに書いてないから知らないが、実装 (Microsoft.PowerShell.Commands.Utility.dll) はそうなっているので、少なくとも現バージョンはその順番で出力されるよ。
並び替えたければ Sort-Object にパイプして自分でやればよし。
名無し~3.EXE [sage] 2015/08/31(月) 13:54:04.25 :FxJJsPCr



ありがと、うまくいった
分配演算子か、そういう一文字で済む方法があればと思ってたんだ
渡すのは可変長だけど$argsで受け取れば問題なかった
名無し~3.EXE [sage] 2015/08/31(月) 23:50:44.79 :FxJJsPCr

行番号の情報が残ってないから難しいかな
ハッシュで内容と行番号含めたオブジェクトつくって比較とかかな

554が何をやりたいのかいまいち分からないけど、やっぱり他の専用ツール使った方がいいと思うぞ
547 [sage] 2015/09/01(火) 07:20:45.74 :cTDIgiEq


回答いただきありがとうございました。
現状では難しそうですね。

PowerShell で比較したきっかけは、WinMergeでXMLを比較した結果、
類似した項目が大量に並んでいる場合、
比較元と比較先で全く同じデータであるにもかかわらず、
別の類似項目と比較されて、「変更」扱いされたため、
使えないな〜と他の方法を考えていた結果、
「PowerShell 使ってみたら?」とアドバイスをもらったので、試しました。

XMLの比較に特化したツールで、外部ファイルに出力(エクセルに張り付けたい)できればいいのですが。。。
(フィルタをかけたうえで、どの変更に対して、なぜ変更になったか理由のコメントを付けたい)
名無し~3.EXE [sage] 2015/09/01(火) 09:19:39.38 :yMj1glK4

PSはXMLをそのまま変数に取り込める
$A = Import-Clixml a.xml
$A.'分類'.'項目' で取り出す
これでテキストでやるより確実に比較もできそうだけど
ただ書式覚えて自分でループ回さなきゃいけないし、これだけの為にps覚えるのはお勧めしない

よく知らないけど、XMLはメジャーな書式なんだし比較ソフトくらいないのかね
名無し~3.EXE [sage] 2015/09/01(火) 10:36:52.50 :963TikRS
正規化してからコンペアすれば解決する問題かもしれない
名無し~3.EXE [sage] 2015/09/01(火) 13:00:29.90 :Z7/ME/xj

これやな。


もはや PowerShell と何も関係もないが、 XML 用の入力フィルタ持ってる Rekisa とか使ってみることをおすすめするよ。
名無し~3.EXE [sage] 2015/09/01(火) 13:26:17.37 :yMj1glK4

Compare-Object の場合は出力が順番通りにならないのが問題らしいから
方法は考えられるけど、PS触ったことない人には難しいだろう
名無し~3.EXE [sage] 2015/09/01(火) 21:46:29.08 :6q65Tid7
Windows Management Framework 5.0 Production Preview is now available
ttp://blogs.msdn.com/b/powershell/archive/2015/08/31/windows-management-framework-5-0-production-preview-is-now-available.aspx
名無し~3.EXE [sage] 2015/09/01(火) 21:51:10.62 :62fN+zh7
Windows7にもインストール出来るのか
てっきり外してくると思ってた
名無し~3.EXE [sage] 2015/09/01(火) 22:08:14.84 :jsoh3Uzf
WMFって基本的にエンプラ向けだし、そうすると7のシェアが圧倒的だから外しようがない
547 [sage] 2015/09/02(水) 07:18:27.69 :4PYUChgS
皆様色々なコメントありがとうございました!


PowerShell は色々とおぼえれば、強力なツールとして活用できそうですね。。。
本当はPowerShell に限らず、その他プログラミング言語を覚えれば、
もっと業務が効率的になるのかな?とも思いながら、手付かずです。。。
(C言語は過去に仕事で使ってたので唯一理解できます)


正規化ですか。。。ちょっと検討してみます
イマイチXML自体わかってないですが。。。
今回のXMLもツールが吐き出す設定ファイルで、
それの新旧ひかくであったり、別のツールが吐き出したXMLとの比較であったりします
(一応、ツールの吐き出すXMLは業界の独自規格のXML?に沿ってます)


Rekisaを一度試してみます


やはり難しいですか。。。
名無し~3.EXE [sage] 2015/09/02(水) 09:39:44.06 :7u0NJoKM

WinMergeならFilesメニューからXMLモードで比較をすりゃええ
名無し~3.EXE [] 2015/09/02(水) 20:32:19.14 :j8gmEWgN
PowerGUIでコンパイルしたEXEに引数を付けて実行すると、Param()で引数が取れず、$argsも空になってしまいます。
ps1のままだと正常に引数が取得できるのですが、どうにかならないでしょうか?
名無し~3.EXE [sage] 2015/09/02(水) 22:40:06.35 :iGUgaLj4
正規化を PowerShell で (…というか、.NET で) やりたければ、↓こうやればできる。
出力した ($outFile) 同士を、WinMerge 等で比較すればよいだろう

$inFIle = "<入力ファイル名>";
$outFile = "<出力ファイル名>";
Add-Type -AssemblyName System.Security;
$xC14nTrans = New-Object System.Security.Cryptography.Xml.XmlDsigExcC14NTransform;
$xdoc = New-Object xml;
$xdoc.Load($inFIle);
$xC14nTrans.LoadInput($xdoc);
$ms = $xC14nTrans.GetOutput();
$xdoc.Load($ms);
$ms.Dispose();
$xdoc.Save($outFile); # スペース入れるためにあえて XmlDocument で書き出す
569 [sage] 2015/09/02(水) 22:58:00.06 :iGUgaLj4
しかし、正規化しても、属性の順番などは同じようになるものの、
要素の順番などは元からそろっていないと比較できない。

それでも比較したければ、ツリー状の XML を 比較できるように 平滑化 して比較するしかないな。

あんまり細かいこと考えずにおおざっぱな実装だと、↓のようにやればできるかも。。?
# PowerShell v3 以降または、 PowerShell v2 を .NET 4 以上で動かさないとダメ

ttps://gist.github.com/anonymous/993cbee909c53c9834e1
名無し~3.EXE [sage] 2015/09/02(水) 23:22:42.80 :iGUgaLj4

PowerGUI は使ったことないが 「powergui exe arguments」でググったら出てきたぞ。

Compile PowerShell scripts to exe | Dmitry's Blog: Cloud, PowerShell and beyond
ttps://dmitrysotnikov.wordpress.com/2011/08/22/compile-powershell-scripts-to-exe/

If your script access parameters – so will the exe file it generates. So for an executable generated from a script like:

param ($MyParam1, $MyParam2) "MyParam1: $MyParam1""MyParam2: $MyParam2"

You may use a command line like:
c:\Generated.exe -Arguments -MyParam2 "Value2" -MyParam1 "Value1"
名無し~3.EXE [] 2015/09/03(木) 00:31:48.80 :q1cXsLwO

ありがとうございます! 無事起動引数を受け取れました
名無し~3.EXE [sage] 2015/09/03(木) 09:24:03.13 :DtuAECA4
要素は順不同か否かの判断にスキーマから
解釈しだす必要があるので
手軽にスクリプトで書く範疇を越えそうやね
スキーマ拡張できない単純な規格なら
決め打ちでいいけど
名無し~3.EXE [sage] 2015/09/04(金) 10:06:23.15 :WGzCMjpK
Is PowerGUI still alive?
ttp://en.community.dell.com/techcenter/powergui/f/4833/t/19628186

>At this time, development of PowerGUI is on hold.

やる気無いなら、なんで買収したんだよ…
名無し~3.EXE [sage] 2015/09/04(金) 19:26:09.65 :Hb0IHkPK
ちゃんと変数見せてくれるとかrunspace分離とか素で使う分にはISEより便利だったんだけどな
v2のインテリセンスは.NETの名前補完してくれなかったし
名無し~3.EXE [] 2015/09/07(月) 19:03:36.52 :6BwcE1IB
[xml]$newfile=get-content xmlファイルのパス

これだけで、xmlファイルを読み込みPowerShellのファイルにしてくれる
xmlの操作は、.NETでできる操作全部できるので、そのメソッドは
$newfile|get-member で調べてみて。

Excelにデータを貼り付けるならxmlでもいいが、通常(海外でも)よく
使用され、簡単で一番高速な方法は、
PowerShellデータをタブで区切って、クリップボード経由でExcelに貼り付ける方法。
具体的には、
convertTo-csv -delimiter "`t" -NoTypeInformation|out-Clipboard
ここでout-Clipboardは事前にクリップボードコピープログラムにエイリアス
つけておけばいい。具体的には
 new-alias Out-Clipboard $env:SystemRoot\system32\clip.exe

これでクリップボードにコピーされるので、それをExcelの好きな場所に
ペーストすれば終わり。ペースト先はRangeで指定した先。
具体的には、$rangeを好きなセルの範囲とすれば
$excelSheet.Paset($range,$false)
これでExcelに張り付く。

XMLファイルの出力じゃないきゃいや。というなら
また回答したいと思います。
576 [] 2015/09/07(月) 19:05:45.05 :6BwcE1IB
宛先忘れた 

576 [] 2015/09/07(月) 19:18:05.09 :6BwcE1IB

xmlファイル比較したい場合、つぎのようにも出来る
a.xml
b.xml
があった場合、単純に内容が同じかどうかを比較したいなら
[xml]$a=get-content a.xml
[xml]$b=get-content b.xml

$a.equal($b)
これで結果がtrueなら一致

こんな簡単な事じゃなくって、もっと複雑な形の比較(でしょう)なた
また質問ください。勉強し直します。
576 [] 2015/09/07(月) 19:58:48.88 :6BwcE1IB
ちなみに、 のような変数を
xmlファイルで保存する場合は
$a.save("xmlファイル名.xml")
だけでいい
名無し~3.EXE [sage] 2015/09/07(月) 22:40:33.70 :n32rDoYk
powershellじゃないのでスレチかもですが、

>reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr "Display" | findstr /V "Icon"

を実行すると、出力が、
DisplayNameが先だったり、DisplayVersionが先だったりするので、Nameの次にVersionが来るように出力したいのですが、何かうまい方法はありませんでしょうか
名無し~3.EXE [] 2015/09/07(月) 23:09:01.58 :uqkMSG6i
フィルに出して、PowerShellで並び替えすればどう
名無し~3.EXE [sage] 2015/09/08(火) 01:40:36.17 :PEd6xW2L
環境が、powershellがセキュリティポリシーで無効にされてるっぽいんです
vbスクリプトとかでレジストリ舐めるようなサンプル探した方が早いでしょうかね。。
547 [sage] 2015/09/08(火) 07:18:57.75 :b/+Sifco

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

入力形式はXMLですが、出力形式にこだわりはありません。
(.NETは一度も扱ったことがないので、一から調べる必要がありますが・・・)

#WinMergeがもう少し賢ければいいのに・・・
同じようなパターンのデータが並んでいて、一部しか違いがないのに、
何故か大量に「違いあり」な結果になるという。。。
名無し~3.EXE [sage] 2015/09/08(火) 09:12:57.42 :92073K11

されてるっぽいってどういうこと?
スクリプトを関連付け実行できないFAQなら下記で対処できる
powershell -ExecutionPolicy RemoteSigned -File script.ps1

コマンドでやりたいならスレチだが
いずれにしてもsortにパイプで
名無し~3.EXE [sage] 2015/09/08(火) 16:47:52.63 :MC4w6taH

どの程度の変更を「一部」と言っているのかわからないけどさんのは試した?
Winmergeの設定項目も確認した?
どの部分で違いが出ているの?
名無し~3.EXE [sage] 2015/09/08(火) 21:32:17.17 :qs6hH/Wz

もうじれってぇから、比較したい XML 貼れよコラ
名無し~3.EXE [sage] 2015/09/08(火) 22:31:24.24 :6N790N4A
583はじらし上手。
547 [sage] 2015/09/09(水) 13:55:32.48 :e83l+dgf
流石にXMLを貼るわけにはいかないですので、もう少し設定を見直します。

行数が35万行ほどあるので、行数が長すぎるのも原因かと思い、
一度分割して比較してみます(面倒ですが)

なお、今まで試したテキスト比較ソフトは、WinMergeとBeyond Compareです。
名無し~3.EXE [sage] 2015/09/10(木) 01:43:00.55 :IG3sOYc7
35万とかバカじゃなかろうか
XMLの比較とか以前にファイル構造から見直すべきだろ
名無し~3.EXE [sage] 2015/09/10(木) 02:04:00.81 :TT6JDeQ+
1億件のデータファイル…w
名無し~3.EXE [] 2015/09/10(木) 09:55:25.09 :WI7O8njh
たま〜に扱うよ
もちろんツールは別だ。
名無し~3.EXE [sage] 2015/09/10(木) 10:47:41.98 :9IbIATwj
そういう件数はSQLDBにするわ
名無し~3.EXE [] 2015/09/10(木) 12:39:26.73 :QOFlwPdO
いちいちDBにいれないわ
名無し~3.EXE [sage] 2015/09/10(木) 19:11:43.09 :2Ffc8JYU
件数の問題ではないだろう
正規化についてはどうだったのかな?
せめて理屈までは押さえて欲しいところ

汎用のコンペアツールはそのデータが繰り返し構造であることを知り得ないのだから
差分と差分の間の一致部分が長ければ
人間が期待する結果とはずれが出る

ありものを使いたいなら
いろいろなツール、比較アルゴリズムを切り替えて試すのがいいんじゃないか
長考のものなら期待する結果を出すかもしれない
名無し~3.EXE [sage] 2015/09/10(木) 23:13:10.22 :SjiLFIDt

いきなり58万件やるんじゃなくて、
本来比較して一致としたいもの、一致としたくないもの、一致させたいのに比較ツールで不一致になってしまうもの、
のサンプル作って試すんだよ。

エラーでてるならともかく、58万が1万になろうが1024になろうが42になろうが結果はかわんねーし、かわったらその比較方法がおかしいだろーが
名無し~3.EXE [] 2015/09/11(金) 18:25:34.13 :tt4OmAiJ
そもそも、比較のルールを示してないのに
答えられるわきゃ〜ない
名無し~3.EXE [sage] 2015/09/19(土) 22:13:15.21 :DYok0N8F
if ($a = 1 && $b = 2) {} できるの?
名無し~3.EXE [sage] 2015/09/20(日) 03:53:51.63 :+JK7zQrc
if ($a -eq 1 -and $b -eq 2) {}
演算子変えるだけだろ
名無し~3.EXE [] 2015/09/20(日) 05:44:10.66 :mKgcJthl
xmlを比較したいねぇ・・
特定のイベントログをこしとってメールにでも添付して飛ばしたいのかなぁ
get-wineventだけじゃあとれないもんねぇ
名無し~3.EXE [] 2015/09/20(日) 05:45:55.84 :mKgcJthl
とおもったら35万行とか
どんだけって話でさw
名無し~3.EXE [sage] 2015/09/20(日) 06:02:07.72 :4/tidX3n

なんですけど、-and はエラーになりませんか -or なら使えるけど。
気のせいかもしれないからもう一回やってみる
名無し~3.EXE [sage] 2015/09/20(日) 06:26:04.58 :+JK7zQrc
orが使えてandが動かないとかんな訳ねーだろ…
orしか動かないなら片側の条件式がbool返さないような状態かと思って
$a = 1
if(($a -eq 1) -and ('hoge')){write-host 'hage'}

ってやったら通っちゃってbool値返してないのにtrue評価されて逆に俺が困惑するはめに
名無し~3.EXE [sage] 2015/09/20(日) 13:44:24.90 :4/tidX3n

それ空文字じゃないからtrueってだけじゃないの?
-and普通にできた。他のとこがエラーだったのかもしれん。
失礼しました。こんな超入門レベルに答えてくれるなんて優しすぎ。
ありがとうございました。
名無し~3.EXE [sage] 2015/09/21(月) 19:44:28.93 :+FV0GEYu
検証してみたら空文字じゃないからtrueだった
bool値で評価すべきとこをそんなんで判定すんな!
せめて論理演算のときにbool型以外が混じってたら素直にエラー吐いて…
名無し~3.EXE [sage] 2015/09/21(月) 21:08:02.77 :NA8zmF69
シェルスクリプトがユルめな言語仕様を採用するのは間違ってないと思うぞ
名無し~3.EXE [] 2015/09/21(月) 21:24:25.86 :+FV0GEYu
俺もPowerShellのゆるさが好きだけど
文字から数値とか整数からboolへの変換許さない型安全な志向になってる安全なゆるさが好きなので
文字列が空か否かでT/Fが論理式で評価されちゃう安全でないゆるさは好みじゃないな…
名無し~3.EXE [sage] 2015/09/22(火) 14:31:23.35 :IRdHpU0S
if文自体はboolしか受けないけど
評価前に暗黙の型変換が効くっぽい
[bool] $b = "abc"; // エラー
のような型安全な書き方はできない模様
== と = の書き間違え事故が起こりにくい分だけマシなのかもしれない
名無し~3.EXE [sage] 2015/09/26(土) 03:22:08.54 :wJPqDySt
Select-Objectの存在意義が長年理解できなかったけど、基本情報の勉強しててようやく経緯は分かった
なんだこのSQLにあるからとりあえず付けました感の半端なさは
名無し~3.EXE [sage] 2015/09/27(日) 01:05:19.94 :ay2w9xF/

あ??? -First * で ? や ? 通した先頭, 末尾指定個とりだすのや、 v2でプロパティの順番並び替えるのに よく使うだろ禿!!!
名無し~3.EXE [sage] 2015/09/27(日) 09:54:51.20 :kyLE2fzb
selectはsortに並んでよく使うけどな
むしろ608がPSをどんな使い方してるのか気になる
名無し~3.EXE [] 2015/09/27(日) 11:26:49.16 :AkaaJ9V6

私も、投稿見てそう思った
名無し~3.EXE [sage] 2015/09/27(日) 12:52:54.73 :OHRLujZ4
Select-Object に ハッシュの Exp プロパティ使って、スクリプトブロック指定できることを知らないなんていわないでよねっ!
名無し~3.EXE [sage] 2015/09/27(日) 16:28:11.77 :OTNzgbox
あーうんすまんな、フィルタl的な使い方は良くするが、射影機能は何のために必要だったんだかなってね
SQLでは必要なんだろうが、そのままのデータ型として再利用できないものをパイプに流されてもな


あれを喜ぶのは触り始めの頃だけだ・・・そういう使い方をしたいならft使った方が何かと便利だし
名無し~3.EXE [sage] 2015/09/27(日) 23:11:05.02 :EkThN4VY
射影なんて今時の言語なら大抵持ってるじゃん
必要ないならなんで色んな言語が使えるようにしてるんだよ
名無し~3.EXE [sage] 2015/09/28(月) 00:00:40.42 :+mNgkq+J
他の言語でどうとかじゃなく、PowerShellで必要?どういうケースで使う?
特定のプロパティに絞って表示したいだけならftの方が便利じゃん
わざわざ射影した後にforeachで回す必要性もないし
名無し~3.EXE [sage] 2015/09/28(月) 18:47:19.36 :dFP3fR+y
結構適当というか網羅的だから
それこそ適当にこねくり回してると上手く行くのが面白いところ
そっから付け足し付け足しして
他人からしてみりゃ迷惑極まりないスクリプトだわな
名無し~3.EXE [] 2015/09/28(月) 21:08:36.08 :GgCFx4QZ
expandpropertyとか便利だと思うよ
名無し~3.EXE [sage] 2015/09/29(火) 22:43:09.08 :2SyLlDj3
この俺様が理解できないものは糞だ!糞に決まってる!糞じゃないと困る!
名無し~3.EXE [sage] 2015/09/30(水) 16:32:51.56 :fgJmI/o3
foreach で break すると、たとえ関数内であったとしてもループの最外側に抜ける仕様って、いまだかつてこんな仕様の言語ありましたっけ?
名無し~3.EXE [sage] 2015/09/30(水) 19:48:55.14 :Xntjddq3

試してみたがそんなことはなかった
foreachステートメントとforeach-objectコマンドレットを混同してるのでは?
foreach-objectコマンドレットでは
breakではなくreturnを使う
名無し~3.EXE [] 2015/10/04(日) 12:11:55.32 :PvMeJGIe
MTP(Media Transfaer Protocol)モードのスマホとかカメラのファイルにアクセスするには
どうすればいい?
名無し~3.EXE [] 2015/10/05(月) 08:42:09.19 :yJ0DXv3a

単にファイルなんで、それをどうしたいのかが書いていないと
なにをしたらいいのかわからない。
名無し~3.EXE [] 2015/10/06(火) 00:39:35.17 :rV/qZaaj
何をしたいのかと問われれば
ファイルシステムとして普通にできそうなことは一通りとしか

ファイルの 作成、読み書き、削除
フォルダの 作成、配下のフォルダやファイルの一覧取得、削除
等々

ていうかMTP用のプロバイダないんすか?
PoserShellに組み込みであってもよさそうなのに
名無し~3.EXE [sage] 2015/10/06(火) 04:58:28.90 :GN/s593e
PSReadline入れた状態でコマンドに2バイト文字入れると途中までしか表示されないんだけど
解決策ある?
名無し~3.EXE [sage] 2015/10/06(火) 07:18:43.12 :+wPYV3pn
そういえば、XML比較の件ってどうなったんだろうかね?
名無し~3.EXE [] 2015/10/08(木) 15:34:02.32 :ib3OoMbu
ある行のうち、ダブルクォートで囲まれた文字列が4組あるので、それらを個別に抽出したい。
(以下、$strings)

-matches を使おうと思ったんだけど、どうもあれは「最初にマッチしたものだけ」しか抽出できないようだ。
なので、以下のようにした。


$strings = '"aaaa""bbbb""cccc""dddd"'
$regex=[regex]"\`".+?\`""
$regex.Matches($strings) | % {
   $stg  += @($_.value)
}

$stg -join "----"
$stg = $null

「ダブルクォートで囲まれた中の文字列にダブルクォートそのものが含まれている」というケースは想定しなくて良い。
上記を実行すると

"aaaa"----"bbbb"----"cccc"----"dddd"

と出力される。
しかし、ダブルクォートは除去した状態で取り扱いたいのである。
たとえば、$stg[1] には "bbbb" が入ってしまう。
どうすればいいだろうか?
$stg.Removeは正規表現が使えないので、ダメだった。


あと、上記のコードは、美しくて、厳格だろうか?
かなりシビアなデータなので、間違いのないようにしたいのだけど・・・。
名無し~3.EXE [sage] 2015/10/08(木) 16:09:53.56 :gsu2c/41
()でくくってグループで取り出せば中だけ取り出せる

$strings = '"aaaa""bbbb""cccc""dddd"'
$regex=[regex]'"([^"]+)"'
$regex.Matches($strings) | % {
$stg += @($_.Groups[1].Value)
}

あと最初に $stg=@() で初期化しといた方が安心。だと思う
省略したのかもしれんが
名無し~3.EXE [] 2015/10/08(木) 17:40:39.48 :BHkn6upA

え、正規表現で解決出来るのか(´Д`;)
ありがとう、やってみる
名無し~3.EXE [sage] 2015/10/09(金) 15:03:25.03 :zsdAcLR6
美しいかとの問いなので、まとめてみた

(
%{([regex]'"([^"]+)"').Matches('"aaaa","bbbb""cccc""dddd"')}|
%{$_.Groups[1].Value}
) -join '----'

短くはなったが、拡張性皆無だなw
名無し~3.EXE [] 2015/10/09(金) 15:27:33.64 :THqY0jDZ

それだと、例えば二番目のグループと四番目のグループを取り出したいとき、個別にregex書く必要ない?
名無し~3.EXE [sage] 2015/10/10(土) 00:08:41.87 :6EaJL0kU

大丈夫みたいよ
ソースの"はセパレータじゃなくて、()や「」と同じ囲みだよ
名無し~3.EXE [] 2015/10/10(土) 22:05:22.99 :wQ0CMO/u
$string = '"aaaa""bbbb""cccc""dddd"'
$string2=($strings.TrimStart('"').TrimEnd('"')).Replace('""',("`t")).Split("`t")
名無し~3.EXE [] 2015/10/10(土) 22:08:26.71 :wQ0CMO/u
2行目のstringがstringsになっていたので訂正

$string = '"aaaa""bbbb""cccc""dddd"'
$string2=($string.TrimStart('"').TrimEnd('"')).Replace('""',("`t")).Split("`t")
名無し~3.EXE [] 2015/10/10(土) 22:12:04.67 :wQ0CMO/u
要は、頭とお尻の"をとってしまえば
あとは""を好きなセパレーター(ここではタブ)に置き換えれば
スプリットできる。と考えた。
名無し~3.EXE [sage] 2015/10/10(土) 22:33:35.74 :6EaJL0kU
"aaaa〜はxmlかなんかの要素を取り出すサンプルじゃないのか
本当に""だけで区切られたシビアなデータがあるとは思えんが
名無し~3.EXE [] 2015/10/10(土) 22:36:56.71 :wQ0CMO/u
どうなんだろ、わざわざダブルクォートと明記してるんで
それを想定した次第。
名無し~3.EXE [sage] 2015/10/15(木) 01:13:20.84 :qfN7eM0Y
訳あってpowershellから離れて半年
なんか初心者にいいサイトとか有ります?
名無し~3.EXE [sage] 2015/10/15(木) 09:45:12.39 :ZsWWmX75
Windows PowerShell でのスクリプティング
ttps://technet.microsoft.com/ja-jp/scriptcenter/dd742419.aspx
powershell チートシート
ttp://qiita.com/jca02266/items/a0c71ae90d055ab3893c
名無し~3.EXE [sage] 2015/10/15(木) 11:24:46.38 :1zYdssrg

scripting guyは見てたなぁちよっと懐かしい

下は初めてどうもありがとう
名無し~3.EXE [sage] 2015/10/15(木) 14:47:46.57 :qRPU5CiT

 ヘ⌒ヽフ
( ・ω・) 横d
/ ~つと)
名無し~3.EXE [sage] 2015/10/15(木) 18:43:33.73 :a9hpgysW

Windows PowerShell | ++C++; // 未確認飛行 C ttp://ufcpp.net/study/powershell/
書きかけ項目多いけど、 PowerShell の「考え方」みたいなのが多く載ってる ufcpp の説明は好き。
名無し~3.EXE [sage] 2015/10/16(金) 10:44:37.95 :cBAzfgz/
ライトユーザー向け:PowerShell再入門
ttp://m0t0k1x2.tumblr.com/post/120697058604/
使う気が無い人向けのPowerShell入門
ttp://karino2.livejournal.com/69885.html
田所 [] 2015/10/16(金) 12:29:49.44 :8d8ZpADo
param内でエラーメッセージを書くのは変でしょうか

function ReadFileDialog()
{
   param(
      [ValidateScript({
         if ((test-path $_)-eq $false){
          write-host "[$(($MyInvocation.MyCommand).name)]パスの指定が間違っています  $_"
            return $false
         } 
         return $true }
      )]
      [String]$TDN
   )

#(以下、処理)  
}

ファイル選択ダイアログを表示させる関数を書いています。
使用者が一般ユーザーであるため、わかりやすいエラーメッセージを表示させたく、
あえて上記のような処理をparam構文内に入れています。
そして、エラーメッセージには、どうしても自身の関数名"ReadFileDialog"を入れたいのですが、
入りません。
param構文じゃなければ、大丈夫です。
param構文内でこんなこと(分岐処理)をするのはあまりしないですか?
 
名無し~3.EXE [sage] 2015/10/16(金) 17:39:13.12 :IHjHgoEA
>使う気が無い人向けのPowerShell入門
タイトル笑ったw
でも内容は割と面白かった
使う前提じゃないから、細かい注意とかトピック省いて特徴だけ簡単に書いてある
名無し~3.EXE [sage] 2015/10/17(土) 09:12:46.34 :oHppExUq
組み込み関数の一覧とかどっかにあります?
名無し~3.EXE [sage] 2015/10/17(土) 10:02:17.08 :PYALeco8

Core Modules in Windows PowerShell
ttps://technet.microsoft.com/en-us/library/mt156967.aspx
名無し~3.EXE [] 2015/10/17(土) 13:44:45.31 :ervVVyyh
PowerShellでCSVのように、一定の規則に則った行で構成されたリストファイルがある。
この各行に対し、特定のフィールド同士を結合して出力する、
という動作の処理を書くのに、UMLのクラス図を書くことって意味はある?
また、UMLで表すことって出来る?
名無し~3.EXE [sage] 2015/10/17(土) 17:12:52.95 :+mHWZaXY

ありがd!
名無し~3.EXE [sage] 2015/10/18(日) 15:17:47.73 :+MDVdMXD

書けるけど有効性はない
特にクラス図は不適
お勉強ならアリ
名無し~3.EXE [] 2015/10/19(月) 08:02:52.04 :zy6qE6mr

ども!
名無し~3.EXE [] 2015/10/21(水) 08:23:41.92 :LwqRCWqd
powershellで各行にカンマが30個存在するかどうかをチェックするのに10分もかかるんだけど、
こんなもん?15万行ある。

foreach-objectじゃなくて、きっちりforeach使ってる。
名無し~3.EXE [sage] 2015/10/21(水) 13:58:54.97 :OpA4voBJ
CPUコア数に合わせてファイルを分割して例えば4つスレッドを回せば1/4になんない?
名無し~3.EXE [sage] 2015/10/21(水) 14:26:19.61 :zPm6Cky3

150万行とか桁を間違えてるわけじゃないよな
どうやって存在チェックしてる?
チェックした結果をループの中で毎回出力してる?
名無し~3.EXE [] 2015/10/21(水) 14:42:08.60 :RWzxKTPx

ああいや、読み込む際に一行ずつチェックしてる
名無し~3.EXE [] 2015/10/21(水) 14:42:37.98 :RWzxKTPx

それ考えたけど、遅かった
プロセスは複数立ち上がるけどw
名無し~3.EXE [sage] 2015/10/21(水) 15:50:04.11 :tC1FLUzK
誤差程度だろうけど読み込んだあとforeachで回してみるとか
読込や処理部分をC#で書いてそれをpowershellで実行するようにするだけで劇的に速くなるだろうけど
全部C#で書いちまえってところに行き着くジレンマ
名無し~3.EXE [sage] 2015/10/21(水) 16:56:11.10 :bCYHmPSz
行数やカンマ数を少量から徐々に増やしてみて
計算時間がO(N)より明らかに悪そうならアルゴリズムを見直す
名無し~3.EXE [] 2015/10/21(水) 17:45:34.92 :s2Sy2sIi

うーん、外部の力を借りるのを考えるわ。
名無し~3.EXE [] 2015/10/21(水) 17:46:58.03 :s2Sy2sIi

カンマ減らすにつれやはり早くなる
意外と各要素の文字列の長さ自体はあんまり影響受けないな。
名無し~3.EXE [sage] 2015/10/21(水) 18:36:37.85 :uEJzvJyN

じゃあ、やっぱり「カンマが30個存在するかどうかをチェックする」アルゴリズムが悪いのでほぼ確定じゃん?

「文字列 文字数カウント .NET」でぐぐって出てきたた最初のアルゴリズムや、正規表現でマッチするかを確認する方法で 1秒以下でできたぜ?
名無し~3.EXE [sage] 2015/10/21(水) 19:36:10.38 :UTZ0fkyy
どんなチェックの仕方してるの?
splitじゃないの?
名無し~3.EXE [sage] 2015/10/21(水) 22:40:22.82 :JkyS3tM8
また、ソース張らないじらし上手が現れたと聞いて。
名無し~3.EXE [] 2015/10/22(木) 08:12:37.09 :9lXPKSl+
出社したらはるw
651 [] 2015/10/22(木) 09:33:47.51 :hpUi1173
これがコードです(´Д`;)
引数にデータファイル名つけて実行してください

半角カンマを30個並べた文字列を15万行つくった。


#コードはこんなの

$sep = [regex]'(,)'
$line = (get-content $ARGS[0])[0]
$count = $sep.Matches($line).count

$readFile = get-content $ARGS[0]
foreach ($line in $readFile) {
   $i++
   if ($sep.Matches($line).count -eq $count){
      $forExportFile += @($line)
   } else {
      write-output "$i 行目の列の数が1行目と違う"
      exit
   }
}
out-file $forExportFile


#ロジック以外にも、「こんなコーディングはプログラマーはしない」ってところがあったら教えてほしい
名無し~3.EXE [sage] 2015/10/22(木) 20:54:47.55 :6t81TAsx
一番問題だと思うのは列数の異なる行が出るたびにexitしてることだと思う
その行修正するなり消すなりしてもっかいやってまた引っかかったらってやるの?
それ以外の行はそのまま出してるならオリジナルのファイルでおかしいトコだけ修正すれば良くない?
スクリプトの原型残して変えるとこんな感じに

$sep = [regex]'(,)' ;
$readFile = Get-Content $ARGS[0];
$header = $readFile[0];
$count = $sep.Matches($header).count;

$i = 0;
$forExportFile = @();
foreach($line in $readFile) {
$i++;
if($sep.Matches($line).count -ne $count){
write-output "$i 行目の列の数が1行目と違う" ;
$forExportFile += [pscustomobject]@{lineno=$i;line=$line};
}
}
#列数の異なる行のリストを出力する
$forExportFile| Export-Csv -Path f:\hage.csv -NoTypeInformation
名無し~3.EXE [sage] 2015/10/22(木) 20:56:04.04 :6t81TAsx
行頭の半角スペース全部消えてもうた(´・ω・`)
名無し~3.EXE [sage] 2015/10/22(木) 21:24:22.77 :2yr/rHIW
get-contentの中の人は良く知らないが、メモリ上に残さずにパイプで全部つなげた方がいいんでない?
それかADODB.Stream使ってストリームで読み込むとか
あと上の人も言ってるけどregexよりもsplitの方が多分高速
名無し~3.EXE [sage] 2015/10/22(木) 21:53:20.41 :9SR1euA7

全部の行が同じカンマの数なの前提で、違うのあった場合だけ エラーとして 1回だけ exit してるんじゃないの?


Matches で返される MatchCollection は、 Match オブジェクトの集合体で、
さらに その Match オブジェクトも、 Groups とか 配下に大量のオブジェクトを持ってるわけですよ。
それを毎回毎回生成したら遅いのは当たり前やん。


$readFile = gc C:\Users\t-Surface_Pro_2\Desktop\t.txt;
$count = [regex]::Matches($readFile[0], ',').Count;
$re = New-Object regex("(?:,[~,]*){$count}"); # キャプチャされないように、正規表現は () ではなく (?:) 使う
$i = 0;
$forExportFile = @();
foreach ($line in $readFile) {
$i++;
if ($re.IsMatch($line)) {
$forExportFile += @($line);
} else {
Write-Error "$i 行目の列の数が1行目と違う";
exit 1;
}
}

これだけで 30倍 早くなった。


また、 がいってるのと似てるけど、$forExportFile に 配列追加していくのは、そのたびに配列のなが栄える処理が入るので、行数が増えれば増えるほどクソ遅くなる。
ファイルは直接パイプではき出した方がよいな。
&{foreach ($line in $readFile) { $i++; if ($re.IsMatch($line)) { $line } else { Write-Error "$i 行目の列の数が1行目と違う"; exit 1; } } } } | Out-File $forExportFile
名無し~3.EXE [sage] 2015/10/22(木) 21:57:46.43 :/ubUSV5V
やべ、ユーザ名含んだフルパス消さずに投稿しちまった。
名無し~3.EXE [sage] 2015/10/22(木) 22:29:44.10 :/ubUSV5V
15万回転して、一致するものだけをカウントしたときの速度:

$sep = [regex]'(,)';
$sep.Matches($line).Count -eq $count
> 11.4秒

($line.Split(',').Length - 1) -eq $count
> 6.9秒

($line.Length - $line.Replace(',', '')) -eq $count
> 2.2秒

$re = New-Object regex("(?:,[~,]*){$count}", [System.Text.RegularExpressions.RegexOptions]::Compiled);
$re.IsMatch($line)
> 0.82秒

30倍は言い過ぎだった。
名無し~3.EXE [sage] 2015/10/23(金) 01:35:32.54 :8ZTGaERY
該当行を列挙したいだけなら
[IO.File]::ReadLines(path) -notmatch '^([^,]*,[^,]*){30}$'
行数と併せて表示したいなら
Select-Striing '^([^,]*,[^,]*){30}$' -NotMatch -Path file

とかで済む話を、なんで小難しく書こうとするのか
名無し~3.EXE [] 2015/10/23(金) 21:50:28.75 :NW9sCtHl
お返事おくれましたが、かえったら報告します。速くなったかもしれない!まだはっきりしない
もう手立てはないとおもってたのに。

キャプチャとかの意味の理解はこれから始めます

メモリの使われ方も面白い。グラフで見ると山と谷の連続で、上昇しないようになった
名無し~3.EXE [] 2015/10/23(金) 22:06:21.38 :xqPLqqU1
カウント取るくらいなら
正規表現そのものが遅いから
避けた方がいいと思うよ
名無し~3.EXE [] 2015/10/24(土) 00:07:32.55 :iO75vTOe

今日は時間がなかったので明日試してみる
名無し~3.EXE [sage] 2015/10/24(土) 00:09:59.22 :H/TRCgaj
クソ素人のクソ質問で申し訳ありませんが教えてください。

何がダメでエラーが出てるのか教えてください(>_<")

ttp://imgur.com/h8jRgk8.png
名無し~3.EXE [] 2015/10/24(土) 00:15:09.85 :iO75vTOe

オンメモリーにすることが必ずしもベストとは限らない?
名無し~3.EXE [sage] 2015/10/24(土) 00:57:33.15 :gSv2qoSp

調教分析.ps1の中身がダメだと思われるので、まずはISEでそのスクリプトを開いてステップ実行して、どこの行でエラーが出てるのか確認してみることをオススメします。
名無し~3.EXE [sage] 2015/10/24(土) 07:24:59.92 :H/TRCgaj

レスありがとうございます。やるだけやってみます!おそらくISEとやらの使い方でつまづくと思うのでその時はまた質問させていただきます。
名無し~3.EXE [sage] 2015/10/24(土) 08:52:12.21 :DFTbTRvA

オンメモリ⇒高速っていう考えは短絡的
それが成り立つのは総I/Oが削減される場合
例えばDOMよりSAXの方が性能面で有利なように、アルゴリズムやデータ構造が無視できない
名無し~3.EXE [sage] 2015/10/24(土) 08:54:05.39 :6JiMhbJe

調教分析の目的の方が気になるな
名無し~3.EXE [] 2015/10/24(土) 09:03:14.76 :R4reK4x6

そういう事は知らなかったので今後は必ず両方のケースで試すことにするわ。
ありがとう。
名無し~3.EXE [] 2015/10/24(土) 09:12:24.90 :R4reK4x6
がいってるのと似てるけど、$forExportFile に 配列追加していくのは、そのたびに配列のなが栄える処理が入るので、行数が増えれば増えるほどクソ遅くなる。


ひょっとして、処理がすすむにつれてペースが落ちている気がしたのは、このせいか。
納得した。
ということはこれはPowerShellでなくても、あんまり良くない書き方なのかな。
名無し~3.EXE [sage] 2015/10/24(土) 09:46:13.83 :4ysRLJ6N

なんとなくエスパーすると、不自然な文字列のファイルを呼びだそうとしていることから
空白混じりのパスを生で指定しようとして切れて認識されるあれっぽい
でなければタイポ
名無し~3.EXE [sage] 2015/10/24(土) 11:10:54.72 :iq4eS2xa

競馬?
名無し~3.EXE [] 2015/10/24(土) 11:20:26.17 :+N4BsUKj


@()
の宣言だと行追加などが起こると、全配列がコピーされ新規に再度作成される
という内部処理ので、めちゃくちゃパフォーマンスが悪くなるよ。
名無し~3.EXE [] 2015/10/24(土) 11:21:32.47 :+N4BsUKj

なぜか、ブラウザに嫌われて開けない。
675 [sage] 2015/10/24(土) 13:06:52.12 :xwjAD0aM


競馬ソフトに使いますw
名無し~3.EXE [] 2015/10/24(土) 13:07:09.34 :WiAqyF9p
大変うれしい結果になった

@質問前
⇒1時間20分

A初回にファイルの中身をまるごと入れるのではなく、get-contentとパイプを使い、後続の処理に渡す。
正規表現も668のようにした。
そして、計算結果だけをメモリに追記していき、最後にその配列を書き出す。
⇒17分

Bさらに、パイプでAの計算結果をメモリを介さずファイルに書き出す。
⇒4分



exitしてるのはテスト中だからで、実際は別ファイルに吐き出すようにするつもりでした。
[pscustomobject]のところはあとで実験してみます。


やってみたらすごかった。ありがとうございます。
splitはあとで実験してみます。


スクリプトブロックの使い方がいまだに良くわかってないけど、
その個所をフィルタ化し、パイプ通したら爆速になりました。


それもあとで試してみます。

というわけで、まだまだ速くなる可能性があるのはすごい!
最初、わりと出来が良いと思ってたのに全然そんなこと無かったのはショックであり収穫だった・・・。
675 [sage] 2015/10/24(土) 13:07:22.21 :xwjAD0aM

タイポとは何でしょうか(´・ω・`)
675 [sage] 2015/10/24(土) 13:08:10.41 :xwjAD0aM

これでもダメですか?
ttp://imgur.com/h8jRgk8.png
名無し~3.EXE [sage] 2015/10/24(土) 13:40:50.31 :iq4eS2xa

この場合はタイプミスのことだと思います
自分も2ちゃんで初めて知った言い方だけど
世間様では割りと一般的な言い方みたいよ
名無し~3.EXE [] 2015/10/24(土) 19:46:14.10 :hTGk7VZz

みえたよ〜〜
ありがと
675 [sage] 2015/10/24(土) 21:14:06.83 :ZES+3HDL
すみません、自力では解決できません(>_<")どなたかアドバイスをお願いします!
ttp://imgur.com/0F7KtXl.png
ttp://imgur.com/RfLHGph.png
名無し~3.EXE [sage] 2015/10/24(土) 21:24:37.16 :m7BGSwIL
詳しく見たわけじゃないけど、$aに入るのはファイルオブジェクトじゃないのかなー
$a.nameで取り出さなくていいのかね
しかしいちいちcmdで処理するとか、何のためにPSで組んでるのか良くわらん
名無し~3.EXE [sage] 2015/10/24(土) 22:28:03.00 :atg+bPwn
やりたい目標をサンプルデータ付きで言ってくれたほうが早そう
ただし自分で理解できないとメンテナンスができないから
わけわからん状態なら他の手段を考えたほうが良いかもしれない
名無し~3.EXE [sage] 2015/10/24(土) 22:44:39.60 :+gvkvHGw

パイプ処理はforeach構文より重いから、別にそこは元のままでいいよ
問題だったのは配列に何度も追加する処理をしていたこと
そうする必要があるならリスト(ArrayListなど)を使う
675 [sage] 2015/10/25(日) 07:24:24.55 :dwoQtJIQ

すみません、具体的にどういうことか教えていただけますか?
名無し~3.EXE [sage] 2015/10/25(日) 10:53:47.27 :rBN6Vf7+

まあそこは自動でやってくれて問題ないのかもしれん
直すのなら、ファイルが見つからないってエラーが出てるんだから、言われてるように半角スペースじゃないか
$なんとかname = '"' + $なんとかname + '"'
とでもしてダブルクォーテーションで囲ってみては
んで Write-Host $なんとかname で確認する
あとコードを直接ここにコピペした方が答えてくれる人も出るかもよ
675 [sage] 2015/10/25(日) 11:17:42.76 :dwoQtJIQ

コピペしようとしたら本文が長すぎると言われて怒られてしまいました(´・ω・`)
675 [sage] 2015/10/25(日) 11:25:38.75 :dwoQtJIQ
このページの内容を実行したいのです。直リンさせていただきました(´・ω・`)

ttps://www.evernote.com/pub/view/takobouzu/keiba/6cd05efc-d397-4125-b920-b24c65be89a8?locale=ja#st=p&n=6cd05efc-d397-4125-b920-b24c65be89a8
名無し~3.EXE [sage] 2015/10/25(日) 12:13:45.52 :rBN6Vf7+

んで698は試してみたのかい?
配布されてるコードでもデバッグ必要なのは多いよ
する気が無いならそのページの人に聞くしかないな
675 [sage] 2015/10/25(日) 12:19:00.37 :dwoQtJIQ

試したくても意味が分からないので今勉強してます!
名無し~3.EXE [sage] 2015/10/25(日) 12:33:41.79 :D6OYZuu5

勉強が終わってから来てくれるかな。
名無し~3.EXE [sage] 2015/10/25(日) 15:01:09.02 :txNt7R/P
なんという甘えん坊…
スクリプト以前にパソコン初心者やね

とりあえず一番上のエラーから解決すべし
tmpフォルダ等を作れ
lhactというツールをインストールしろ
それでダメならパスを通せ
ここまでで言ってることが自力で解決できないようなら
親切な友達を探して聞くべし
675 [sage] 2015/10/25(日) 15:09:58.52 :dwoQtJIQ

すみません(;´Д⊂)
tmpフォルダは作成済みです!lhactもインストールしてます!
675 [sage] 2015/10/25(日) 15:10:20.70 :dwoQtJIQ
パスを通すというのが分かりません…
名無し~3.EXE [sage] 2015/10/25(日) 17:41:42.87 :PlfkMZSB

そこまでいったらもうPS関係ないわい
Windowsの環境変数について勉強しなおしてから改めて来い
名無し~3.EXE [sage] 2015/10/25(日) 21:32:26.62 :0MnDW+Yo
コマンドライン=PowerShell って流れになりつつあるってことなんだろう
名無し~3.EXE [] 2015/10/26(月) 03:21:17.10 :2Bz0ey6v
質問なんですが、まずはコードとデータから。

データファイルの例
PS C:\git\conv> cat .\CSV_FILE.CSV
Q,BBB,1000,EEE,FF,GGGG
A,BBB,2000,EEE,FF,GGGG
C,BBB,1000,EEE,FF,GGGG
A,BBB,2000,EEE,FF,GGGG
E,BBB,3000,EEE,FF,GGGG
A,BBB,3000,EEE,FF,GGGG
---------------------------------
つづき [] 2015/10/26(月) 03:21:49.67 :2Bz0ey6v
#コードの抜粋 CSV_FILE.CSVは実際はハードコーディングではないです。
$YMD = (get-date).ToString("yyyyMMdd")
$csvfile =  Get-Content .\CSV_FILE.CSV | ConvertFrom-CSV -header @(1..7)
$csvfile | % { ($_."3") = "Q" + ($_."3")  }
$hash_table = @{}
foreach ($line in  ($csvfile)) {
   $Code = $line."3"
   if($hash_table.Contains($Code)) {
      $hash_table[$Code] += $line
   } else {
      $hash_table[$Code] = @($line)
   }
}
#ここで、どんな種類のコードがあるのかリスト化
$CodeList = $hash_table.Keys
foreach ($Code in $CodeList){
   foreach ( $Recoad in $hash_table["$Code"]){
      $Type = $Recoad."1"
      $OutputFile = "${Type}_${Code}_${YMD}_01.CSV"
      $Recoad | ConvertTo-CSV | select -skip 2 | out-file -Append $OutputFile
   }
}
つづき [] 2015/10/26(月) 03:23:40.18 :Tcn0nXyD
≪前提≫
・CSV形式で、カンマの数は、処理対象のファイルごとに異なる
・ただし、ファイル単位では、カンマの数はすべての行で同じ。
・どんなファイルでも A列が"データ種別" 、C列が"部署コード" という点は共通しているし、今後もその方針は崩れない。
・今回の例では6列あるCSVファイル”CSV_FILE.CSV”とする
・CSV形式ではあるが、残念ながらヘッダが無い。
・各々の要素は、ダブルクォーテーションで括られていないタイプである

≪期待するアウトプット≫
・列C(部署コード)は、ヘッダとして"Q"という文字を付与。 例 "Q2000"
・各々の要素はダブルクォートで括る
・部署コード別にファイルをわけて出力する
・そのファイル名の命名規則として、 データ種別_部署コード_yyyyMMdd_01.CSV としなければいけない。yyyyMMddは実行日付とする。
709 [] 2015/10/26(月) 03:46:21.16 :Tcn0nXyD
やりたいことは、上記のようなコードでとりあえず出来ています。
しかし、問題があります。
このコード、一度きりの実行なら何の問題も無い。

ただ、「実行をやり直したい」こともあって、同一日に、複数回の実行となると、
初回に生成したファイルに「追記」されてしまうのが厄介なんです。

わけあって、

・生成前に、前回実施分の同一名のファイルがあれば削除する
・ファイル名の命名規則を変える(たとえば秒数まで入れる)

といった回避策は取れません。
ただし、末尾の _01.CSV の部分だけは、通番として変更が許されます。
つまり、既に Q_Q1000_20151026_01.CSV というファイルがあったら、 一つ上の整数にして Q_Q1000_20151026_02.CSV
とすることは、許されます。02があれば、03に、03があれば04に、といった形です。

しかし、仮にこういうことができる処理や関数を作ったとしても、問題があります。
それは、

「同一日付で、スクリプト実行時に重複ファイルがあれば別のファイル名で保存」
するという処理を組み込んだ場合、
上記のコードだと「foreachで同じファイルに追記し続けて期待するファイルを完成させる」という処理である以上、
共存が難しいのです。

賢い方法は無いものでしょうか。
名無し~3.EXE [sage] 2015/10/26(月) 09:21:28.74 :N0Ec1pjn
長いねえw
その問題は、今回の実行で使っているファイルの連番をタイプとコードの組み合わせごとに覚えて使い回せば手っ取り早い
そのために最後のループあたりで新しいHashtableの変数を使う
名無し~3.EXE [sage] 2015/10/26(月) 09:26:29.05 :N0Ec1pjn
タイプとコードと年月日だった
名無し~3.EXE [] 2015/10/26(月) 10:59:59.21 :Zkh/1D5q

あ!
ひょっとして、実行時に、最初に、get-childitemなりを実行して、命名規則に沿ったファイル(あるいは要素に分割)の一覧を作れ、
ってことだよね!?
出来そう!
675 [sage] 2015/10/26(月) 19:23:03.56 :RDy8GEe2
長い戦いの末、ようやく解決しました。
まずpathにlhactを追加することでpowershellがlhactを見付けてくれるようになりました!
そしてlzhファイルを解凍するためのプログラムをlhactに設定してやることで無事にスクリプトを実行することができました。
アドバイスをいただいた皆様、大変助かりました。ありがとうございました!
名無し~3.EXE [] 2015/10/26(月) 20:20:34.58 :+KcUwg/c

foreachのネストする必要あるか??
名無し~3.EXE [] 2015/10/27(火) 08:13:45.65 :dXaycdO7
このスレなんでwindows板にあるのん?
名無し~3.EXE [sage] 2015/10/27(火) 12:42:35.31 :Ki9UktZr
windowsのシェルのスレがwindows板になかったら困るから
名無し~3.EXE [sage] 2015/10/27(火) 19:58:38.27 :0/saJbgi
v5 RTM と ヘルプ早よ。 もう日本語ヘルプとか贅沢言わないから、せめてヘルプ…ヘルプ…
名無し~3.EXE [sage] 2015/10/27(火) 20:02:29.58 :cv2/YD87
WMFのサブセットだからServer2016(8月のTechnicalPreview3で止まってる)が
もう少し形にならんとだめでしょ
名無し~3.EXE [sage] 2015/10/27(火) 23:16:13.47 :xNThCHKw
現在の仕様でfilterとfunctionの違いってあるのかな
同じ処理をfilterとfunctionで作って計測してみたが、ほとんど同じかfunctionの方が早い事もある
709 [] 2015/10/28(水) 07:51:39.69 :VvmDKO1R
filterって、パイプの後ろで何かをさせるときの関数を作る時、便利なような気がしてる。
名無し~3.EXE [sage] 2015/10/28(水) 08:27:35.20 :bogyWS35


filter {...} は、 function { process {...}} のとほぼ同じだよ。よく使う(と、想定された)から短い表記を用意したんじゃないかな。 実際使ってるとこあんまり見ないけど。 %{...} のほうが書きやすくて事足りることが多いし。
about_Functions ttps://technet.microsoft.com/en-us/library/dd347712.aspx
ヘルプでは「似てる」ってかいてあるけど。

速度の違いは function で begin, process, end ブロック省略すると function { end {...}} になるから、その違いが現れてるのかと。
名無し~3.EXE [sage] 2015/10/28(水) 09:19:30.62 :lrKQTu0r

昔はなかったらしいけど、.net4.5ではfilterでもbegin-Processやparamでの細かい設定出来るんだよね
functionで出来てfilterで出来ない事が見当たらない

>速度の違いは function で begin, process, end ブロック省略すると function { end {...}} になるから、その違いが現れてるのかと。
テストでbegin, process, endの有り無しでも試したが、あまり変わらなかったよ
名無し~3.EXE [] 2015/10/28(水) 13:04:08.93 :Tcq67EBU

どういう意味?
名無し~3.EXE [] 2015/10/28(水) 13:04:46.54 :Tcq67EBU
filterもfunctionも同じだと思ってたんだが
名無し~3.EXE [sage] 2015/10/29(木) 08:23:01.56 :4yEhEXnJ
結局 begin, process, end などのブロック省略したときのデフォルト動作の違いだろ

function _func { Get-Date; "$input / $_"; }
filter _fltr { Get-Date; "$input / $_"; }
0..9 |{ sleep -m 100; $_; } | _func;
0..9 |{ sleep -m 100; $_; } | _fltr;
名無し~3.EXE [] 2015/10/29(木) 18:38:57.04 :5tJ8OIwf
filter だと、

get-content | hogehoge

みたいな1行ずつ処理楽じゃね?
名無し~3.EXE [sage] 2015/10/29(木) 21:51:13.74 :77hGm+Mm

じゃあ省略しなければ同じと言うことか
いっそfilterはbegin〜不可、functionは必須にすれば差別化できたかもなw
名無し~3.EXE [sage] 2015/10/30(金) 00:20:57.46 :S/PEDX5h
beginとendブロックのないfunctionがfilterだった気がする
名無し~3.EXE [sage] 2015/10/31(土) 14:32:18.85 :rwCY9Lpw
$a = "山"
$msg = "$aに行きたい"
$a = "海"

これで $msg は「山に行きたい」になりますけど、
「海に行きたい」にする方法って無いですかね?
こうするのは無しで。

$a = "山"
$msg = "$aに行きたい"
$a = "海"
$msg = "$aに行きたい" 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
名無し~3.EXE [sage] 2015/10/31(土) 14:41:08.96 :z/uevSy6
$a = "海"
$msg = "$aに行きたい"
にする

下手な例えにするのではなく本来の目的を明確にしてください
名無し~3.EXE [sage] 2015/10/31(土) 14:47:15.07 :M4xI/C3U
$msg = "海に行きたい"
でいいんじゃね?
名無し~3.EXE [sage] 2015/10/31(土) 15:31:03.86 :6G2tRouH
エスパー検定会場はここですか
こういうことがやりたいとか?

$b = "{0}に行きたい"
$msg = $b -f "海"
$msg = $b -f "山"
名無し~3.EXE [sage] 2015/10/31(土) 15:38:10.04 :rwCY9Lpw
すみません、もう少し具体的に書かせてもらいます。
デフォルトの設定を持ってて、外部の設定ファイルから差分を読み込んで上書きするプログラムを作ってます。
その設定でメッセージを定義してるんですけど、その中に変数を含めたいんですよね。

デフォルト設定
$a = "山"; $msg = "$a に行きたい"

このあとで利用者が設定ファイルで
$a = "海"
にしても
"海に行きたい"
にならない、という。

じゃあ設定ファイルで
$a = "海"
$msg = "$a に行きたい"
と言われそうですが、極力変更分だけを記述させたいんですよね。

デフォルト
$a = "山"; $b = "に行きたい"
設定ファイル
$a = "海"
設定を読んだあとの処理
$msg = $a + $b
こうしろ、と言われそうですけど、メッセージを自由に定義できるようにする必要があるのでこれも出来ないです。

なお設定ファイル読み込みは
イ)ドットソースで読み込む
ロ)get-content して foreach して Invoke-Expression
ハ)get-content して convertfrom-stringdata して foreach で Set-Variable
を試してます。
名無し~3.EXE [sage] 2015/10/31(土) 16:17:02.73 :z/uevSy6
ドットソース形式は設定ファイルに向いてないと思うけど
読み込んだ後にデフォルト値設定してたら上書きされてるんじゃないの
iniファイルじゃダメなの?
名無し~3.EXE [sage] 2015/10/31(土) 16:23:39.64 :6G2tRouH
ご希望に近いのはこれかな?

$a = "山"
$msg = { "$aに行きたい" }
$a = "海"
echo (& $msg)
名無し~3.EXE [sage] 2015/10/31(土) 16:53:27.35 :rwCY9Lpw
すみません、せっかくアイデアを出してもらっておきながら、このように対応しました。
デフォルト設定
$a = "山"
$msg = $null
設定読み込み
$a = "海"
設定を読んだあとの処理
if([bool]$msg -eq $False){ $msg = "$a に行きたい" }


ini でも xml でも CSV でも、なんでも良いんですけどね。

そんな書き方もできるんですね、参考になります。
名無し~3.EXE [sage] 2015/10/31(土) 19:42:49.35 :z/uevSy6

$nullである場合にメッセージを入れたいのなら素直に$nullで判定したほうがシンプルだし保守性も増すよ
設定を読み込む部分もシンプルに考えたほうが安全
739 [sage] 2015/11/01(日) 10:02:20.94 :Se8GsmC+

$a=$null
$b=$a
if($b -eq $null) {echo "ヌルポ"}

この例では正しく動作しますけど、以前こんな感じで変数に変数を入れたら
途中で $null ではなく "" (文字が入っていない状態) になっちゃって、上手く
動かないことがあったんですよね。

なので、$null でも "" でも確実に動作するよう、
if([bool]$b -eq $False) {echo "ヌルポ"}
って書くようにしてます。
名無し~3.EXE [sage] 2015/11/01(日) 11:58:42.51 :8EuQ8lDx

[string] 型固定してるところに $null 入れると、 "" になる謎仕様があるのよね。
そういうときは、 [string]::IsNullOrEmpty() だ。
名無し~3.EXE [sage] 2015/11/01(日) 12:52:12.15 :c6SmFHKG
.NETのメソッドに渡す時だったと思うけど、nullを空文字にしないString型がv3くらいで追加されたのって、何だったっけ
739 [sage] 2015/11/01(日) 13:43:44.43 :Se8GsmC+

> [string] 型固定してるところに $null 入れると、 "" になる謎仕様があるのよね。
なるほど!それが原因でしたか。

> そういうときは、 [string]::IsNullOrEmpty() だ。
なるほどなるほど!そのほうが意味も分かりやすいですね。
早速書き換えました。

とても参考になります。ありがとうございました。
名無し~3.EXE [] 2015/11/02(月) 14:54:44.90 :KL1i47R9
牟田口大介氏
名無し~3.EXE [sage] 2015/11/03(火) 23:54:05.83 :fkYsIskO
関数でパラメータ名の指定を必須にするって出来たっけ?
hoge -name '〜' はOKで
hode '〜' はNGにしたい

紛らわしいパラメータがあるんで自動割り当てを無効にしたいんだけど
名無し~3.EXE [] 2015/11/04(水) 07:52:29.20 :Eg3H5crh

関数内でパラメータをチェックするのが、どんな言語でも普通だと思いますか?
名無し~3.EXE [sage] 2015/11/04(水) 12:45:52.79 :vcGqSikp

詳しくは about_function_advanced_parameters ヘルプ読んで欲しいが、
どれか一つの引数に対して [parameter(Position=0)] の属性つければ、残りの引数は パラメーター名が必須になる。

どれかひとつの引数だけ、位置指定パラメーターを認めるか、
あまりスマートじゃないが、必ず検証が失敗する使えない引数を位置指定パラメーターに割り当てるか、どっちかかな。
DynamicParam 使っても、位置指定禁止はできなかったような気がする…

param([parameter(Position=0)][ValidateScript({$false})]$Invalid, $A, $B)
みたいな感じ。
名無し~3.EXE [sage] 2015/11/04(水) 13:35:21.93 :ObsWmkDS

ありがと、やれそうだ
位置指定属性か、どこかで読んだ気がするが使わないからすっかり忘れてた
名無し~3.EXE [sage] 2015/11/06(金) 10:53:46.83 :4tCIkoqK

Parameterデコレーターを指定してPositionを省略すれば位置指定は効かなくなるみたいだね
名無し~3.EXE [sage] 2015/11/06(金) 12:22:39.61 :4kIWpEs9

function f1([parameter()]$a1) { $a1 }
f1 "hoge"; # ←エラーになる?
ってこと? ならなくね?

やっぱり最低でもひとつ以上の引数が、 Position の名前付き引数になってないと、全ての引数が位置指定が効いちゃうし、
逆にひとつでもなっていれば、それ以外の引数は parameter 属性付けてなくても位置指定が効かなくなるデショ
function f1([parameter(Position=0)]$a1, $a2) { $a1; $a2; }
f1 "hoge" "fuga"; # ←エラーになる

System.Management.Automation.ParameterAttribute.Position の初期値を見るに、 Position を省略するのは、 Int32.MinValue を設定するのと同義みたいね。
function f1([parameter(Position=-2147483648)]$a1, $a2) { $a1; $a2; }
f1 "hoge" "fuga"; # ←エラーにならない
名無し~3.EXE [sage] 2015/11/06(金) 14:35:08.15 :4tCIkoqK

スマン、その通りでした
全部省略したらそりゃデフォルトと同じ動きになるよね…
名無し~3.EXE [sage] 2015/11/08(日) 20:43:48.77 :EkY4nvWT
foreach ( $count in 1..100000 ) {

"xxxxxxxxxxx,$count" | out-file -append count.csv
}


これが、めっちゃ時間がかかるんだけど、これより早い方法無いかな。
名無し~3.EXE [sage] 2015/11/08(日) 20:47:09.23 :EkY4nvWT
ごめん、  リダイレクト > だとめっちゃ速くなったので、解決した。
名無し~3.EXE [sage] 2015/11/08(日) 20:47:59.65 :EkY4nvWT
ちなみに一旦変数に入れてから、最後に out-file を通しても遅かった。
名無し~3.EXE [sage] 2015/11/08(日) 21:11:13.64 :EkY4nvWT
重ね重ねすみません。
techの方のブログで、完全解決しました。

ttp://winscript.jp/powershell/213
名無し~3.EXE [sage] 2015/11/08(日) 23:45:24.76 :hAnKHQwc

亀だが、ファイルに書き込むんだったら、各ループごとに Out-File するんじゃなくて、ループ全体を Out-File したほうが良い。

ファイルオープンクローズが一度ですむほか、動作的には各ループ毎に書き込みが行われるのでパフォーマンスも良いはず。
ループ数が極端に大きくなければ、自己レスしてるように、一旦 StringBuilder でメモリに置いてからの方が早いかもしれんが。

つまり、

foreach(...) { "hogefuga" | Out-File; }



&{foreach(...) { "hogefuga"; } } | Out-File
名無し~3.EXE [] 2015/11/09(月) 01:25:16.71 :+WbbPYk+

ええ!?こんな書き方できるの!??
名無し~3.EXE [] 2015/11/09(月) 07:47:17.90 :exI1jMXA
どこまでうまくいったのか分からなくなるデメリットもあるよな。
名無し~3.EXE [sage] 2015/11/09(月) 12:28:13.53 :En9zKRTF
{}が単体ではスクリプトブロックを意味して、&はそれを実行するって分かれば理解は出来るんだけど
ぱっと見何をやってるのか分からないよな
757を分かりやすく書けばこんな感じか

function hoge {
foreach(...){ "hogefuga" }
}

hoge | Out-File
名無し~3.EXE [sage] 2015/11/09(月) 19:39:57.40 :+WbbPYk+
配列$stringに対して、QcccからQだけとったものに置き換えたいんだけど、
下のやり方でうまくいかない。
俺の認識では、変数名が変わっても、配列の場所は同じのはずだから、
$lineが書き変わると思ってたんだが・・・。

$string = @()
$string = @('aaa,bbb,Qccc,ddd,eee,fff', 'aaa,bbb,Qccc,ddd,eee,fff')

foreach ($line in $string)
{
$split = $line.Split(",")
$trim = $split[2]
$split[2] = $trim -replace '\bQ'
$line
}
名無し~3.EXE [sage] 2015/11/09(月) 20:30:42.39 :amaieSfV
$lineは文字列、$splitは文字列の配列
名前だけじゃなくてデータ構造が別物になってる
また、配列の要素としてセットされたオブジェクトに対して内容変化を促すならともかく、別のオブジェクトで要素を置き換えてるんだから、由来元データが変わることはない
しかも、stringオブジェクトはイミュータブルな設計なので一度生成されたら変更できない
名無し~3.EXE [sage] 2015/11/09(月) 20:49:50.60 :+WbbPYk+

そういうものなのか。
型がそもそも違うのか・・
変更できないとなると、$lineじゃなくて、
こうするしかないかな?

$split[0] + "," + $split[1] + "," + $split[2] + "," + $split[3] + "," + $split[4] + "," + $split[5]
名無し~3.EXE [sage] 2015/11/09(月) 20:50:34.53 :+WbbPYk+
ごめん、こうか。

$split -join ","
名無し~3.EXE [sage] 2015/11/09(月) 20:57:22.67 :+WbbPYk+
PSでコード書くとき、必ずしも戻り値があるわけでもなし、引数があるわけでもなし、おまえけにexitすることもある functionを作って、
サブルーチン的な使い方をして、最後に一気にバンと実行するようなコードって、あり?
名無し~3.EXE [sage] 2015/11/09(月) 22:26:24.05 :I9+5v6Yd

その例だと、$line -replace 'Q','' で終了では?
名無し~3.EXE [sage] 2015/11/09(月) 22:38:23.87 :+WbbPYk+

確かにこの例ではイケる。
ただ、実際は他の列にもQが存在しうるので・・・・あくまでこのスレのために書いたサンプルなんだ。
名無し~3.EXE [sage] 2015/11/09(月) 23:18:18.28 :I9+5v6Yd

そういう情報は最初にちゃんと書かないと、適切な回答はもらえないですよ。
名無し~3.EXE [sage] 2015/11/09(月) 23:45:31.19 :R9cMmSxQ

無しと思う理由がよくわからんが。

それで可搬性が良くなるか、読みやすくなってるならいいんじゃねーの?
名無し~3.EXE [sage] 2015/11/09(月) 23:48:13.09 :+WbbPYk+

すまない・・・


あ、やっぱりあり得る手法なのか。
なんというか、関数名それ自体がコメントの役割を果たす書き方が出来るんだよ。
我流だと思ってたけど安心した。
名無し~3.EXE [sage] 2015/11/09(月) 23:50:46.32 :+WbbPYk+
気になってるのは、GitHubとかpowershell code repositoryを見てると、
関数ごとにファイルを分けたり、ps1ファイルに関数しか書かれてなくて、どういう使い方してるのか、
よくわからないものが多い。
あれも特にお約束というほどの暗黙的な作法があるわけじゃなくて、好きにやってるのかな。
名無し~3.EXE [sage] 2015/11/09(月) 23:55:48.00 :R9cMmSxQ

なんで $string を無駄に配列にして foreach する意味ねェことしてるかも書かないとよくわからないぜ?
想像はつくけど。

replace は 正規表現だから
$stringOut = $string.Split(",") -creplace "^Q";
で、頭の大文字Qだけの置換になる。


また みたいにブロック内でループ回して、それを変数で受け取ればいい。

$stringIn = @('aaa,bbb,Qccc,ddd,eee,fff', 'aaa,bbb,Qccc,ddd,eee,fff')

$stringOut = &{
foreach ($line in $string)
{
$split = $line.Split(",");
$trim = $split[2]
$split[2] = $trim -creplace '^Q'
$split -join ',';
}
}

この書き方の場合、ブロックにしないで直接 $stringOut = foreach... にしても動くけど。
名無し~3.EXE [sage] 2015/11/10(火) 00:00:08.95 :sTMkmJnf

多人数でコード各時は、コードは機能ごとに小さくした方が編集が競合しづらくておとく。
Git のバージョン管理システムはそこまで気にしなくて良い優れモノだが、 SVN とかつかってると、発生しやすいからね。
名無し~3.EXE [sage] 2015/11/10(火) 00:16:07.13 :WgoUSSr4

$line -replace '(^|,)Q','${1}' にすれば分割なしでダイレクトに置換できるぞ。どっちが早いかは知らんが。
名無し~3.EXE [] 2015/11/10(火) 00:32:06.48 :Xz8hCE9c
みなさんがプログラマではないことがよく分かります。
名無し~3.EXE [sage] 2015/11/10(火) 00:33:42.92 :sTMkmJnf

3列目だけ変換したいっぽいからダメなんじゃねーの?
'(?<=^[^,]*,[^,]*,)Q' ならいけるかなと思ったけど、そもそももとが \bQ でリプレイスしてるから、行頭置換は の目的と違う気がしてきた。
名無し~3.EXE [sage] 2015/11/10(火) 00:36:10.38 :lNZyimLm
ここで優秀なプログラマ から、素晴らしい回答が

ってか、よく考えたらシェルってプログラマじゃない人でもそこそこ使えるようにするためのもんだよな。
名無し~3.EXE [sage] 2015/11/10(火) 00:54:40.10 :WgoUSSr4

ああ、3行目だけが置換対象なのね。今理解した。
お題がわかりにくいわ。
名無し~3.EXE [] 2015/11/10(火) 08:05:56.57 :5rIaQ06R

なるほど。多人数のときの習慣か
名無し~3.EXE [] 2015/11/10(火) 08:15:16.41 :5rIaQ06R

申し訳なかった。
まず、$stringsには実は大量に、同カンマ数の文字列が入っている。今回は二個だけ入れた。
(実際はテキストファイル)

正規表現は^B の方が、正解だと思う。

やりたいのは、第三列目の先頭のQだけを置換したくて、それ以外はNG

そして、そもそも正規表現を駆使すればsplitが要らないのもわかった。
(とはいえ、今後、個別の列に対して仕様変更を食らう可能性があるので区切っておこうと思う)

ありがとうです。
名無し~3.EXE [] 2015/11/10(火) 11:36:14.25 :F2l8C55i
三万行( .countが30000)ある配列同士の比較って、

-contain
-eq
compareコマンド

どれが高速?
名無し~3.EXE [sage] 2015/11/10(火) 12:04:31.88 :ZuiZqkRA

数減らして自分で試した法が手っ取り早いだろ。
名無し~3.EXE [] 2015/11/12(木) 14:48:57.81 :soTE9mjW
Invoke-RestMethod もしくは Invoke-WebRequest で
Method は GET を使いたい
Body でフォームのリストを流したい

これを -Method GET -Body $Param と書くと
「コンテンツ本体をこの verb-type では送信できません。」
と出てしまうのですが、 GET でもフォームを引き渡すにはどうしたらよいでしょうか?

また、引き渡しフォームの name=value が a[]=1, a[]=2, a[]=3 のように同じ name があり、かつ配列と認識されてエラーになってしまいます。
これもよい方法がありましたらお聞きしたく

よろしくお願いします。
名無し~3.EXE [sage] 2015/11/12(木) 15:18:37.53 :gwnGaAqZ
まずHTTPの勉強をしよう
やってることが矛盾してるし外部サイトに向けてやってるとしたら迷惑で危ない
名無し~3.EXE [] 2015/11/12(木) 16:17:14.85 :soTE9mjW

説明だけでは矛盾していますね。
やりたかったことは、 Ruby で書かれたコードの焼き直しで、
Ruby は
HTTPClient.new.get(@domain+@path, @params)
でパラメータを渡した GET をやっているのですが、同じように Powershell でやるにはどうすればよいかということです。
ファイルの後ろに ? でパラメータを渡せば実現できますが、 Ruby のように簡単に書けないかということで聞きました。
パラメータは配列になっているので、そのまま使いたかったということもあります。
名無し~3.EXE [sage] 2015/11/12(木) 22:26:05.30 :uqHBCHCB

普通に Invoke-RestMethod のヘルプにかいてあるとおり、 -Body は IDictionary を指定してやれば、 GET でクエリパラメータになってくれる。
ttps://technet.microsoft.com/ja-jp/library/hh849971%28v=wps.620%29.aspx

ただ、 .NET には 同一の Key を許容できる IDictionary を使ったクラスはなかったと思うので、自作するしかないな。


単に クエリパラメータ作りたいだけだったら HttpValueCollection を使えばいいんじゃねぇの?

$hvc = [System.Web.HttpUtility]::ParseQueryString('');
$hvc.Add('foo','bar');
$hvc.Add('foo','bar bar');
$hvc.Add('hoge', 'fuga');
$hvc.ToString();
名無し~3.EXE [] 2015/11/13(金) 09:51:10.17 :uUDEnza4
読み込んだテキストファイルが、
BOMなしのUTF8で、
全行CRLFかどうかを判定するコードってpsで実現可能
名無し~3.EXE [] 2015/11/13(金) 10:49:17.02 :E3FTlqVp
Cでも無理では。可能性を極力排除する、という形になるかと。
名無し~3.EXE [sage] 2015/11/13(金) 12:32:44.61 :B7CfhHdg
それ判定するクラスライブラリはいくつかあるからそれ使ったら?
無論完璧に間違いない判定は難しい
名無し~3.EXE [] 2015/11/13(金) 15:14:40.85 :4gPi16mY
そういうものなのね。
名無し~3.EXE [sage] 2015/11/19(木) 13:59:37.33 :ib2D3oP7
VS Code での PowerShell サポートが強化されました - tech.guitarrapc.c ttp://tech.guitarrapc.com/entry/2015/11/19/030028
VS Code での、本格的サポートキタコレ
あぼーん [あぼーん] あぼーん
あぼーん
名無し~3.EXE [] 2015/11/19(木) 16:55:49.12 :h+dxQVBO
上記はすでに値が静的に入っているが、実際は、ランダムで文字列を生成する関数を使っている。
つまり、たとえば電話番号の場合は $class_common."tel" = get-cellPhoneNumber
という記述になる。
でも、もうひっぽ踏み込んでカッコよくしたい。
なんか方法あるかな

$class_common.tel()

こうするだけで、文字列を返すような記述が良い。
そうすることができれば、こんな風に回したい ↓
foreach ($outLine in 1..100000) {
   write-host $class_common.tel() , $class_common.name() , $class_common.address() , $class_family.hogosyaName() , $class_family.zokugara() ,$class_staff.koyouKeitai()
}
 
名無し~3.EXE [sage] 2015/11/19(木) 17:11:22.94 :KDtthdx0
スクリプトで登録すればいいんでない?

$class_common = [PSCustomObject]@{}
$class_common|Add-Member -Name tel -Type ScriptMethod -Value {
Get-Random 9999
}
Write-Host $class_common.tel()

これだけじゃ電話番号っぽくないから適当に変えてくれ
名無し~3.EXE [] 2015/11/20(金) 08:15:43.20 :MBDR6xa7
オブジェクト指向したかったんじゃね?
名無し~3.EXE [] 2015/11/20(金) 09:19:43.02 :tb0QPh0H

横レスだが、引数(かっこの中に書く)を持たせるにはどうするの?

$this という変数かと思ったら違うみたいだ
名無し~3.EXE [sage] 2015/11/20(金) 10:07:35.00 :RfpK6OyL

関数と似てるよ
$args[0] で直接取り出すか、 param($arg) で変数に入れるかすればいい
ただ似てるだけで [parameter(〜)]とかは使えない
名無し~3.EXE [] 2015/11/20(金) 12:32:51.61 :GDoljv4U

おお!paramを逆手にとる方法があるか!!!
名無し~3.EXE [sage] 2015/11/25(水) 22:19:02.87 :2bHAq9jP
1から100までの連番で、それぞれを一つのグループとする。
ただし、各々のグループには1〜3までの範囲で異なるメンバー数が属している。
こんな感じ。

group memberNum
---------------------
1 01
1 02
2 01
2 02
2 03
3 01
4 01
4 01
5 01
6 01
6 02
6 03
7 01
8 01
9 01
9 01
10 01
11 01
11 02
11 03

これを上のように出力したいんだけど・・・。
(このメンバー数は、Get-Random(1..4)で取得するものとする)
799 [sage] 2015/11/25(水) 22:19:37.96 :2bHAq9jP
$groupCount = 1
$numberOfFmember = 1
$memberCnt=0

$createList = {
foreach ($count in 1..100) {
$memberCnt++
if($groupCount -ne $numberOfFmember){
$groupCount++
"$count $groupCount "
} else {
$numberOfFmember = Get-Random(1..3)
$groupCount = 1
"$count $groupCount "
}
}
}

&$createList
名無し~3.EXE [sage] 2015/11/26(木) 00:15:35.48 :JCLATL7h

要はゼロパディングしたいって事かな?
"{0:000}" -f 12
で 012 の文字列になるよ
名無し~3.EXE [sage] 2015/11/26(木) 00:32:49.12 :JCLATL7h
すごく基本的な事かもしれないけど

if($a = $true){
"true"
}
↑でPSの代入演算子は値を返さないはずなのに、ifにはちゃんと$trueが渡ってる
どうなってんだろ
こういうC系みたいな書き方していいのかな? .netのバージョンが古いと駄目とかだと困るんだけど
799 [sage] 2015/11/26(木) 07:34:50.08 :kM84BUHY
あ、ゼロパディングってことではなく、上のだと

92 1
93 2
94 1
95 2
96 1

ってなってしまうんだ。

92 1
93 1
93 2
94 1
95 1
95 2

ループは100回繰り返すが、得られる結果は100行とは限らないって意味
ゼロパディングは余計な情報だった。失礼しました
名無し~3.EXE [sage] 2015/11/26(木) 07:54:34.93 :h7RSjKL0
100回しかループさせてないんだから100行しか出ないよ
過疎スレとはいえデバッグや試行錯誤を露骨にサボって他人にやらせようとするのは萎える
PSの言語仕様も関係ないし
名無し~3.EXE [sage] 2015/11/26(木) 08:23:06.36 :JCLATL7h

やっと分かった、こういう事かな

1..100|%{
$c=$_
1..(Get-Random(1..3))|%{
"$c $_"
}
}

単にループを二重にするだけじゃないか
名無し~3.EXE [sage] 2015/11/26(木) 08:23:57.75 :h7RSjKL0

help about_Assignment_Operators を見ると、代入式が値を返すことは書かれてないようだけど、下記がOKとされているので値を返す仕様だと考えていいと思う
$a = $b = "連続代入"

PSとしてはスクリプト言語として利便性を取りつつ、比較演算子を -eq にすることでミス誘発も避けたんじゃないかな
名無し~3.EXE [sage] 2015/11/26(木) 08:41:58.24 :JCLATL7h

その連続代入もそうだけど、周りの環境に合わせて結果が出たり出なかったりするよね
$a = 1
($a = 1)
で上は出力なしだけど下は1が返る。かなりモヤモヤする

まあ環境依存とかでなくてPSの基本仕様っぽいのは分かった、安心して使える
ありがと
名無し~3.EXE [sage] 2015/11/26(木) 12:13:51.22 :VoXYji3Y

それ、言語仕様のどっかに書いてあったような。
i++:
は値返さないけど、
(i++);
は値返す、みたいな。
名無し~3.EXE [sage] 2015/11/26(木) 12:15:30.63 :VoXYji3Y

間違えた。

$i++:
は値返さないけど、
($i++);
は値返す、な。
名無し~3.EXE [sage] 2015/11/27(金) 23:27:26.85 :mQUfAHvK
PowerShell Advent Calendar 2015 : ATND ttps://atnd.org/events/72226
読むの楽しみにしてるから誰か参加してあげてw
名無し~3.EXE [sage] 2015/11/28(土) 00:27:45.58 :G1aWLSjQ
ここに書いていいなら参加するけどさw
名無し~3.EXE [] 2015/11/30(月) 15:39:56.82 :OYr6sfqb

それって、比較じゃなくて
単に$trueを代入された$aを判定してるだけなんだろうな。
だから

$a=$false
if($a=$false){
"abc"
}

if($a -eq $false){
"xyz"
}

とかいてもabcは出力されないがxyzは出力される。
名無し~3.EXE [sage] 2015/12/01(火) 08:18:23.97 :jdzJOXfk
そりゃifの評価してるとこはスコープが違うからな
名無し~3.EXE [sage] 2015/12/01(火) 10:20:37.79 :KVOgkiMZ
えっ、変数のスコープの話?
話があらぬ方向に進んでいるような
名無し~3.EXE [] 2015/12/01(火) 11:46:52.25 :+Y9ATsRB

ここでスコープの話が出る理由が理解できない
名無し~3.EXE [sage] 2015/12/01(火) 21:13:57.42 :ITY59gPO

コマンドプロンプト(cmd.exe) Advent Calendar 2015
ttp://qiita.com/advent-calendar/2015/cmd

参加者数ではPowerShellの圧倒的勝利ww
名無し~3.EXE [sage] 2015/12/01(火) 23:44:56.31 :rm8vLjPU

だいたいのテクニックは、
Windows Script Programming ttp://scripting.cocolog-nifty.com/blog/
のひとが書いてるもんなぁ。 索引悪いけど、一昔前はググるとだいたいここにたどり着いた記憶が。
名無し~3.EXE [sage] 2015/12/02(水) 21:29:37.73 :jGBf2mey
コマンドプロンプトは攻撃者に悪用される邪悪なツール
やっぱりPowerShellじゃないとな

攻撃者が悪用するWindowsコマンド
ttp://www.jpcert.or.jp/magazine/acreport-wincommand.html
名無し~3.EXE [sage] 2015/12/03(木) 08:05:20.41 :pu8Xo4h8
いつの間にか翻訳されてた

Windows PowerShell コア About トピック
ttps://technet.microsoft.com/ja-jp/library/hh847856.aspx
名無し~3.EXE [] 2015/12/04(金) 10:23:36.24 :wGdUvl0z
100000カスタムオブジェクトなものをパイプの後ろでgroupするのはやっぱら時間かかるな
名無し~3.EXE [sage] 2015/12/04(金) 12:55:01.38 :26BMu7/q

せやろか?
キーの比較が遅いか、 group するのが遅いんじゃなく カスタムオブジェクト作るのが遅いんじゃ?

$rand = New-Object random
$objs = 0..100KB | %{ $v = $rand.Next() ;New-Object PSObject -Property (@{Val=$v; Key=$v % 128;}); }

Measure-Command { $grp = $objs | group Key; }

2秒かからんかったで。
名無し~3.EXE [] 2015/12/04(金) 17:47:49.56 :t63upgBm

俺が悪いみたいだ
名無し~3.EXE [sage] 2015/12/04(金) 21:21:48.02 :/V6Yb9on

PowerShell スクリプト用の新エディタ登場 〜 Visual Studio Code
ttp://blogs.technet.com/b/junichia/archive/2015/12/04/3657831.aspx

正直、まだまだ発展途上です。
ISE のほうが、まだ使い勝手がよいです。
名無し~3.EXE [sage] 2015/12/05(土) 05:36:32.80 :LUqvvh5P

PSObject とpscustomobjectは別モノで、pscustomobjectの方が生成が早いらしいぞ
計ってないけど
名無し~3.EXE [sage] 2015/12/06(日) 13:22:48.37 :RLNeHSfg

New-Object PSCustomObject -Property (@{Val=$v; Key=$v % 128;})

だとクソ遅いけど、
PowerShell v3 以降で使える

[PSCustomObject]@{Val=$v; Key=$v % 128;}

なら、桁違いに早いみたいだね。
v2 では使えないから避けたけど。
名無し~3.EXE [sage] 2015/12/06(日) 15:13:48.83 :rUADW5nI
head1,head2,head3
aaa,bbb,ccc
ddd,eee,fff

こういうテキストファイルsample.csvを読み込んで


$csvobj = gc sample.csv | convertfrom-csv 

とやっていろんな処理をしたんだけど、
$csvobjそのものを使って、元のデータのように  'aaa,bbb,ccc' を文字列として取り出す方法てある?

TypeName: System.Management.Automation.PSCustomObject

Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
head1 NoteProperty System.String head1=aaa
head2 NoteProperty System.String head2=bbb
head3 NoteProperty System.String head3=ccc



$cvobj | %{ "$_.head1","$_.head2","$_.head3" }

では余計な文字列がくっついてくる。
名無し~3.EXE [] 2015/12/06(日) 17:55:11.62 :+OVfZm9U
@{Type=1; CD=0001; fCode=00000290; aCode=; qNumber=00785}

これ、どうやってそれぞれの値を取り出すのかわかる人いませんか?
型は以下
TypeName: System.Object[]
名無し~3.EXE [] 2015/12/07(月) 18:02:53.82 :wibyCCGl


$csvobj=ConvertTo-csv -NoTypeInformation
じゃあだめなの?
名無し~3.EXE [] 2015/12/08(火) 08:24:02.28 :17MDv2df

え、なにそれ(´Д`;)
名無し~3.EXE [] 2015/12/08(火) 19:06:17.98 :dIOJyAjq

なんだろね。

ごめん、おれだ。何かいたんだろ?


$csvobj = gc sample.csv
まででいいのに、一度 cmverFrom-csv にしてからじゃないといけない
という理由があるわけね?
だとしらた、また戻しちゃえば。
($csvobj|ConvertTo-Csv -NoTypeInformation)[1..$csvobj.Count]
名無し~3.EXE [sage] 2015/12/11(金) 21:46:34.45 :mUbccld5
Mastering Windows PowerShell for Japanese
ttps://channel9.msdn.com/Blogs/Mastering-Windows-PowerShell-for-Japanese

Windows PowerShell をこれから始める方に向け、PowerShell の使い方を動画でお伝えします!
また、PowerShell を使用したさまざまなソリューションについても解説します。
いまさら聞けない基礎の基礎からやっていきますので、是非手手元のPCでご一緒に!
取り上げてほしいテーマがあれば、是非コメントをください。
名無し~3.EXE [sage] 2015/12/12(土) 00:37:53.87 :F7zdzVhK
何故初回の題材がクッソ敷居高そうなそれなんだ…
名無し~3.EXE [] 2015/12/13(日) 10:31:47.71 :NPOWC50s

どういう背景を持つ人が「これから始める人」なのかの定義が
ないと、こりゃ難しいからやめておこうとなるね。
名無し~3.EXE [sage] 2015/12/18(金) 09:41:01.43 :9nUSUahD
Windows Management Framework (WMF) 5.0 RTM is now available
ttp://blogs.msdn.com/b/powershell/archive/2015/12/16/windows-management-framework-wmf-5-0-rtm-is-now-available.aspx
名無し~3.EXE [sage] 2015/12/18(金) 10:09:42.51 :IbDoAMXe
え…Serverだけ?
名無し~3.EXE [sage] 2015/12/18(金) 23:54:25.37 :NrDPpDiq
また翻訳はいつまでも待つことになるのか。
あと、いい加減英語ヘルプを 2014-09 から更新しろ。
名無し~3.EXE [sage] 2015/12/19(土) 08:15:55.51 :qePXqhS+

[Edit 12/18/2015 – Added additional detail describing support for Windows 7 and Windows 8]
名無し~3.EXE [sage] 2015/12/19(土) 08:26:38.95 :qePXqhS+

ttp://blogs.technet.com/b/heyscriptingguy/archive/tags/classes/
名無し~3.EXE [sage] 2015/12/20(日) 02:32:52.96 :8s9PK3vx
お、8.1と7にも来たな
名無し~3.EXE [sage] 2015/12/20(日) 08:43:40.75 :BppX4voM
ttps://twitter.com/jsnover/status/678043461396729856

What is your favorite PowerShell V5 feature?
・Desired State Config
・Classes & debugging
・Package Mgmt
・Security
名無し~3.EXE [sage] 2015/12/20(日) 09:16:29.80 :B6CGidqV

ttps://www.microsoft.com/en-us/download/details.aspx?id=50395
なるほど、これがPowerShell5.0を収録されてるWindows Management Framework (WMF) 5.0か。ちょっと試してみようかな。
名無し~3.EXE [sage] 2015/12/24(木) 12:03:49.08 :UPuVGwN8
PSReadLine で、所謂全角幅の文字を扱うと目も当てなれない状況になるの、修正させる気ないのかしら…?
名無し~3.EXE [sage] 2015/12/24(木) 13:14:01.35 :Gb91x0bs
Windows Management Framework (WMF) 5.0 currently removed from Download Center
ttp://blogs.msdn.com/b/powershell/archive/2015/12/23/windows-management-framework-wmf-5-0-currently-removed-from-download-center.aspx

お預け
名無し~3.EXE [sage] 2015/12/24(木) 13:36:56.15 :BhmGFuzU
もう入れちゃったよ
名無し~3.EXE [sage] 2015/12/25(金) 19:21:52.46 :oRh+ciBS
psobjectにadd-menberする際に、
末尾じゃなく先頭や指定箇所に追加する方法ありませんかね
名無し~3.EXE [sage] 2015/12/25(金) 21:10:00.55 :AySXZAra
オブジェクトに追加されるメンバーに順番なんてないから意味わかんねえけど並べ替えて出力したいならSelect-Object で並べたい順番に名前かけ
名無し~3.EXE [] 2015/12/26(土) 19:33:20.71 :2RbkQOpd
psobject と pscustomobject では、その並びが保持されるかどうかの
違いがあるよね。psobjectはされない。
とはいえ、add-memberで好きな場所にってのは無いんじゃないの。
名無し~3.EXE [sage] 2015/12/26(土) 19:33:50.80 :ymR/y0/P

csvをimportしてカラムを先頭に追加して出力しようとしてました

selectobjectで任意順指定して出力オブジェクトを再作成すればできますかね
今テスト出来ないので後で試してみます
ありがとうございます
名無し~3.EXE [sage] 2015/12/29(火) 19:16:14.64 :ATubAxMZ
のやり方でやったら無事出来ました
ありがとうございます
名無し~3.EXE [sage] 2016/01/04(月) 23:03:08.14 :WeX59M8E
いえいえどういたしまして
名無し~3.EXE [] 2016/01/18(月) 23:46:16.93 :TBrX4i0N
ディレクトリdir以下をどこまでも深く再帰的に掘って全ての(普通の)ファイルの
md5を計算させたい。md5コマンドはすでに存在しているとしてUNIXで言えば
find dir -type f | xargs md5
をやりたいんだけどどうもうまくいきません。教えて下さい。

自分の作ったのはこれです。-recuseしてますが
c:\dirの直下のファイルしか取れません。

Get-ChildItem -path c:\dir -recurse | foreach {
if (Test-Path $_ -PathType Leaf) {
c:\bin\md5.exe $_.FullName
}
}
名無し~3.EXE [sage] 2016/01/19(火) 01:25:46.10 :VldS6an1

自分の勉強がてら試してみた
ifの中にパスを単純出力する文でも入れてみればわかりやすいと思うけど
Test-Pathに$_を渡しても$_はSystem.IO.FileSystemInfoで
パスとして渡ってないからif分が常にfalseになってるふいんき
Test-Pathに$_.FullNameで渡してみてほしい

あとはTest-Path使わずに
($_.Attributes -notmatch "Directory") とか
($_ -is [System.IO.FileInfo]) のほうがTest-Pathを毎回実行させるよりコスト減るかもしんない
名無し~3.EXE [sage] 2016/01/19(火) 02:46:27.18 :k9HnCU+v
$files =
Get-ChildItem -Path $path -Recurse|
Where-Object {$_ -is [System.IO.FileInfo] }
$list = New-Object System.Collections.ArrayList;
foreach($obj in $files){
$filename = $obj.Name;
$hash = (Get-FileHash -Path $obj.fullname -Algorithm MD5).hash;
[void]$list.Add([pscustomobject]@{file=$filename;hash=$hash})
}

やっつけ
名無し~3.EXE [sage] 2016/01/19(火) 02:50:31.38 :DN2pz+HF
からずいぶん経つがWMFチームはいつまで冬休みなんだ
名無し~3.EXE [sage] 2016/01/19(火) 07:04:23.17 :fJpM2evG
いろいろな民族や宗教の人がいるから、
クリスマス・正月・小正月・旧正月、みんなまとめてるんだったりして。
851 [] 2016/01/19(火) 23:47:52.20 :MVj/0cLZ
返事遅れてすみません。の方法で自分がやりたいことは達成できました。
は俺の環境では動かなかったけどmd5の外部コマンド用意しなくても
いけるのかな?と言うか俺にはコード理解できず…

長らくcygwinで作業できてたけど255バイト超のファイル名を扱う必要が出てきて
しまい最近PowerShellに手を出しました。
名無し~3.EXE [sage] 2016/01/20(水) 01:10:10.12 :7vTyn2b4

get-filehashは新しいバージョンでないとないから動かなかったか
やってるのはファイルオブジェクトだけ取得したのをforeachで回してファイル名とハッシュをまとめたオブジェクトにしてarraylistに追加してるだけ

ファイルが少ないならパイプで繋いだ方が便利だけど、
対象が千越えたりするとどうして遅くなるのでこういう書き方になった
名無し~3.EXE [sage] 2016/01/20(水) 16:38:08.85 :3wDLd396
Windows Management Framework (WMF) 4.0 Update now available for Windows Server 2012, Windows Server 2008 R2 SP1, and Windows 7 SP1
ttp://blogs.msdn.com/b/powershell/archive/2016/01/19/windows-management-framework-wmf-4-0-update-now-available-for-windows-server-2012-windows-server-2008-r2-sp1-and-windows-7-sp1.aspx

今更? WMF5.0はよ
名無し~3.EXE [sage] 2016/01/20(水) 19:16:43.74 :pIcMxyVa
サーバー2012以外はメインストリーム終わってたよね?
提供されないんじゃね
名無し~3.EXE [sage] 2016/01/21(木) 21:28:59.68 :B8z0JmZv
もうすぐv5復活

ttp://blogs.msdn.com/b/powershell/archive/2015/12/23/windows-management-framework-wmf-5-0-currently-removed-from-download-center.aspx
名無し~3.EXE [sage] 2016/01/23(土) 13:46:59.04 :reWRfctv
来週ISEについてなんか発表ある?

ttps://twitter.com/daviwil/status/690650451428044800
名無し~3.EXE [sage] 2016/01/26(火) 15:39:19.25 :o7PVlH/5
select-stringってヘンジャね?

get-contentで読み込んだファイルの後ろで使って、¥S で、
「スペースだけの行や、改行だけの行」を削除してファイルに吐き出そうとしたんだけど、

先頭行に空行が入って出力される。
名無し~3.EXE [sage] 2016/01/26(火) 18:36:41.20 :h6HslU3g
BOM付いてるとかじゃね
名無し~3.EXE [sage] 2016/01/28(木) 15:51:58.09 :+Ej4AjV9
Introducing the Windows PowerShell ISE Preview
ttp://blogs.msdn.com/b/powershell/archive/2016/01/20/introducing-the-windows-powershell-ise-preview.aspx

You may notice after installing the ISE Preview that not much has changed; this is intentional!
This first release is meant to ensure that the new preview release model
will work and that there are no major issues.
After the initial release, we hope to ship a new release roughly once per month with
new feature improvements and bug fixes.
It will also be a lot easier to ship minor releases to address bugs that may appear due to new features.
名無し~3.EXE [sage] 2016/01/29(金) 21:37:36.76 :BlvCBNHE
Windows Management Framework (WMF) 5.0 RTM Release Notes
ttps://msdn.microsoft.com/en-us/powershell/wmf/releasenotes
名無し~3.EXE [sage] 2016/02/03(水) 22:11:35.58 :gTfZ2BtD
v5復活
名無し~3.EXE [sage] 2016/02/10(水) 08:26:45.41 :mJWWri2t
月末に延期とかいい加減にしろ
名無し~3.EXE [] 2016/02/19(金) 17:09:33.90 :EMEkEcls
初めて一週間の初心者です。powershell2.0環境となります。

c:\test\1\main.zip
c:\test\1\test.zip
この二つのファイルを同じ場所に解凍して
以下のようにしたいのですが、
c:\test\1\main.zip
c:\test\1\test.zip
c:\test\1\main\中身
c:\test\1\test\中身

サンプルコードそのままで$fileを固定した場合はうまくいくのですが
$file =
名無し~3.EXE [] 2016/02/19(金) 17:11:56.40 :EMEkEcls
初めて一週間の初心者です。powershell2.0環境となります。

c:\test\1\main.zip
c:\test\1\test.zip
この二つのファイルを同じ場所に解凍して
以下のようにしたいのですが、
c:\test\1\main.zip
c:\test\1\test.zip
c:\test\1\main\中身
c:\test\1\test\中身

サンプルコードそのままで$fileを固定した場合はうまくいくのですが
$file = "f:\test\1\main.zip"
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace($file)
$dest = $shell.NameSpace((Split-Path $file -Parent))
$dest.CopyHere($zip.Items())

条件を満たす複数のzipファイルを順次処理したいので
$file = dir *\*.zip
$file = Get-ChildItem *\*.zip
このように指定しても$zipの値がうまく取得できず、エラーが出てしまいます。

$file指定をどのように直したらよいか教えていただけないでしょうか?
名無し~3.EXE [sage] 2016/02/19(金) 17:40:36.26 :njR/0rwl
PSScriptAnalyzer v1.4.0 release and support on PSv3.0
ttp://blogs.msdn.microsoft.com/powershell/2016/02/18/psscriptanalyzer-v1-4-0-release-and-support-on-psv3-0/
ScriptAnalyzer v1.4.0 (available in PowerShellGallery),
ships with binaries compatible on systems containing
PSv3.0/4.0 and PSv5.0 and loads the correct supported version.
Rule functionality automatically adapts to underlying PowerShell.
For example ? Rules that validate PowerShell Classes get triggered only on PSv5.0.
名無し~3.EXE [sage] 2016/02/20(土) 14:35:07.56 :mv4DNtKg

PowerShellだけの初心者じゃないような
わけもわからないまま呪文をコピペしているだけだろうけど
謎のエラーを解決させても目的は解決しないと思う
もう少し順番に学んだほうが安全
名無し~3.EXE [sage] 2016/02/23(火) 14:15:31.48 :zkJUpCy7
スクリプト中で取得した文字列を
Out-Fileコマンドレットでテキストファイルに出力したのですが

"aaa" | Out-File -FilePath "C:\Hoge\手順[参考].txt"

↑のようにパスに"["や"]"が含まれてると

「ワイルドカード パス C:\Hoge\手順[参考].txt がファイルに解決されなかったため、操作を実行できません。」

というエラーになります。
Out-Fileではパスの一部に半角記号が含まれてると処理できないのでしょうか?
他に代替手段は何かありますでしょうか?
名無し~3.EXE [sage] 2016/02/23(火) 17:22:09.25 :l3wSm6Ce

"aaa" | Out-File -LiteralPath "C:\Hoge\手順[参考].txt"
名無し~3.EXE [sage] 2016/02/23(火) 19:25:08.98 :zkJUpCy7

残念ながらOut-FileにはLiteralPathオプションがないのです…
名無し~3.EXE [sage] 2016/02/23(火) 20:09:31.41 :xyThJlgu
適当な名前で出力してmove-itemかRename-ItemにLiteralPathオプション付けるんじゃだめ?
`(アクサングラーブ)でエスケープ出来るみたいな記事があったんだけど処理がおかしいから使えん

"aaa" | Out-File -FilePath "C:\hoge\手順`[参考`].txt"
や"aaa" | Out-File -FilePath 'C:\hoge\手順[参考].txt'
だとエラーになる癖に
"aaa" | Out-File -FilePath "C:\hoge\手順``[参考``].txt"
や'aaa" | Out-File -FilePath "C:\hoge\手順`[参考`].txt'
だと手順`[参考`].txtが出力される
意味わからん
名無し~3.EXE [sage] 2016/02/23(火) 20:11:39.24 :l3wSm6Ce

4.5環境で試したら出来たんだけど、バージョン違いか
なら
"aaa" | Out-File -FilePath "C:\Hoge\手順[[]参考].txt"

[]は文字のリストを指定するマルチキャストで、この場合"[" だけを指す
名無し~3.EXE [sage] 2016/02/23(火) 20:33:28.95 :l3wSm6Ce

「`」
名無し~3.EXE [sage] 2016/02/23(火) 20:37:51.70 :l3wSm6Ce
途中で送信しちゃった

「`」は""の中で定義する文字のエスケープなので、コマンドに渡ってからのパス認識とは無関係だよ
Write-Host "C:\hoge\手順`[参考`].txt" とかで試してみては
名無し~3.EXE [sage] 2016/02/23(火) 20:40:27.88 :ga6zxo8/
この辺のエスケープ規則は鬼門だな
[ はPSの予約語ではないから文字列リテラル内の `[ は単に [ として解釈され、コマンドレットには最初と同じ文字列が渡されてエラーになる
``[ は `[ と解釈されるからコマンドレットがエスケープ済みの記号として受け取るってことかな
その上でOut-Fileは [ ] の扱いに一貫性がないバギーな挙動があるってことか
名無し~3.EXE [sage] 2016/02/23(火) 21:28:27.71 :vrRGP9n/
ファイル名[]の扱いはほんと面倒だよね
単語でググりにくいことも含めて厄介でハマりやすい問題
square bracketsとかbracketsを含んでググると海外でもハマった人たちが結構出てくる
リネームでも厄介だった記憶があるよ

おかげでTechNetにも出てるよ
Windows PowerShell Tip: Taking Things (Like File Paths) Literally
ttps://technet.microsoft.com/en-us/library/ff730956.aspx

ぶっちゃけ丸括弧()でいいなら()を使ったほうが楽
名無し~3.EXE [sage] 2016/02/23(火) 22:39:33.99 :zkJUpCy7

>適当な名前で出力してmove-itemかRename-ItemにLiteralPathオプション付けるんじゃだめ?

処理内容的にそれじゃ逃げられんのです(汗)
出来れば逃げ出したいんですがw


それでも同じエラーだったのですが、
だがしかし、使ってるPowerShellのバージョン確認したらなんと1.0!(汗)
いや、自宅PCが12年選手のXP Homeだから当然なんですが(滝汗)
でも実際に使うのは職場のWin7なんで恐らくLiteralPathあるので解決みたいです。
ありがとうございました!

みなさんお騒がせしました。いい加減PC買い換えます…
名無し~3.EXE [sage] 2016/02/23(火) 23:37:18.47 :l3wSm6Ce

XPでも4.0までは確か入る
捨てる前にやってみようw
名無し~3.EXE [sage] 2016/02/23(火) 23:55:07.55 :dGS+QU54
ブラケットってそんな面倒なキャラクタだったのか…
ホームユースだと大した問題にはならないんだろうけど覚えとこう
名無し~3.EXE [] 2016/02/25(木) 01:01:13.03 :eyN20Z3z

たしか3までだと思う
名無し~3.EXE [sage] 2016/02/25(木) 08:30:15.59 :W5CVA6zd
Windows Management Framework (WMF) 5.0 RTM packages has been republished
ttps://blogs.msdn.microsoft.com/powershell/2016/02/24/windows-management-framework-wmf-5-0-rtm-packages-has-been-republished/
名無し~3.EXE [sage] 2016/02/25(木) 11:25:51.62 :sQ8kNr1t
来たな
名無し~3.EXE [sage] 2016/02/26(金) 09:07:54.40 :VOFVYy1b
PowerShell Galleryがプレビュー版から正式版に
ttps://blogs.msdn.microsoft.com/powershell/2016/02/25/the-powershell-gallery-is-public/
名無し~3.EXE [sage] 2016/02/29(月) 06:58:23.11 :cgvsS5qr
v5正式版でもPSReadlineで全角文字扱うとズレるのは変わらずか
こんなん標準にするとか、相変わらず多国語環境ナメてるな
名無し~3.EXE [] 2016/03/02(水) 00:20:02.16 :L4dDo88Z

フォントの関係じゃなくて?
名無し~3.EXE [] 2016/03/02(水) 00:26:11.64 :L4dDo88Z
データ本体はフォントでそろうけど
列見出しなどとは、ずれちゃうんか
名無し~3.EXE [sage] 2016/03/02(水) 00:31:46.45 :2i8ixq14

MSゴシックでもなるよ
色分けする位置を文字数で決定して流し込んでる感じだね

cd "C:\全角を含むパス" -PassThru

cd "C:\全角を含 -PassThru
と表示される
名無し~3.EXE [sage] 2016/03/02(水) 07:28:05.00 :THQcgGC+
batからpowershellに移行を考えている者ですが質問があります。
powershellでは標準エラー出力をファイルに書き込みつつ出力を画面に表示することは可能ですか?
名無し~3.EXE [sage] 2016/03/02(水) 11:15:42.27 :LZH6vQVO
同じようにリダイレクトできるよ
> コマンド 2>ファイル名
ついでに、エラーだけを両方に吐くならこうかな?
> コマンド 2>&1 | Tee-Object -file ファイル名
名無し~3.EXE [sage] 2016/03/02(水) 12:43:33.38 :THQcgGC+

Tee-Objectなんて便利なものがあったのですね有難うございます。
名無し~3.EXE [sage] 2016/03/03(木) 09:36:22.93 :uQukpWZ7
When editing a command line with CJK glyphs under DBCS codepages, the command line will be displayed incorrectly
ttps://github.com/lzybkr/PSReadLine/issues/289
名無し~3.EXE [sage] 2016/03/03(木) 10:18:19.73 :eWNq/LW6
Windows10でPSのコンソールウィンドウを立ち上げ、
ウィンドウの右隅あたりを右クリッック→画面の色にて
画面の文字を設定するも、色が反映されない。
正確に言うと、デフォルトで、キー入力のコマンドレットと引数、出力をそれぞれ色を変えてるみたいで、
Win7のころとは動作が違うんだけど、これは仕様?
名無し~3.EXE [sage] 2016/03/03(木) 10:58:34.85 :6LzgSaQ2

それもPSReadLineってモジュールによる色分け
C:\Users\ユーザー名\Documents\WindowsPowerShell\Modules\PSReadLine
があるはずなんで、それを消せば昔の仕様にもどるよ
名無し~3.EXE [sage] 2016/03/03(木) 23:01:39.57 :eWNq/LW6
C:\Program Files\WindowsPowerShell\Modules\PSReadline
じゃなく自分のフォルダの下?
Modulesの下には何もないんだけど
名無し~3.EXE [sage] 2016/03/03(木) 23:10:15.88 :eWNq/LW6
AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline
にあった
名無し~3.EXE [sage] 2016/03/03(木) 23:14:07.58 :eWNq/LW6
こっちは消してもヒストリ書き込むために復活するのね。
んで、色問題解決せず

でも、仕様変更があったことがわかったわTHX
バグじゃなかったのね
名無し~3.EXE [sage] 2016/03/03(木) 23:17:05.30 :eWNq/LW6

C:\Program Files\WindowsPowerShell\Modules
の下のPSReadLineをてきとーにrenameしてみたら色問題解決しましたTHX
名無し~3.EXE [sage] 2016/03/04(金) 00:02:21.94 :RJ/3yCF6


自分はそこにあって消したら無効にできたんだが、
まあwin7だし前に試しで入れて消したりしたから、環境が違うのかもしれん
名無し~3.EXE [sage] 2016/03/20(日) 11:31:30.54 :PI/ES13t
フォルダをいじるのは後で問題起きそう
profileに
Remove-Module PSReadLine
を入れる程度にしておいたほうがいいのでは
名無し~3.EXE [sage] 2016/03/20(日) 12:23:27.08 :tB9GcQwH
Remove-Moduleが効かないんだよなぜか
登録されてないって出る
標準になったから別の形式で入ってるんだろう、よく分からん
名無し~3.EXE [sage] 2016/03/27(日) 12:41:40.87 :UQvyJK0X
linuxで言う所のalias ll='ls -la --color=auto'みたいに、既存のコマンドのデフォルトパラメーターをセットする事は出来ますでしょうか
cat anyutf8file.txt で文字化けしてしまって、もちろんエンコーディングをパラメーターで指定すればいいんだけど9割がutf8なのでデフォルトをutf8にしたいです
名無し~3.EXE [sage] 2016/03/27(日) 22:30:57.70 :bjDcgtmm

about_Parameters_Default_Values
ttps://technet.microsoft.com/ja-jp/library/hh847819.aspx
名無し~3.EXE [sage] 2016/03/27(日) 23:44:50.36 :UQvyJK0X

完璧すぎる・・・ありがとうございます
名無し~3.EXE [sage] 2016/03/31(木) 23:24:51.80 :7/OS6ULf
PowerShellを悪用したマルウェアが徐々に増加の予感!?
ttp://blog.f-secure.jp/archives/50764405.html
名無し~3.EXE [sage] 2016/04/06(水) 09:17:13.72 :mmtdKRjz
これ需要あるの?

ttps://twitter.com/KCVutukuri/status/717484469347745792
名無し~3.EXE [sage] 2016/04/08(金) 15:49:25.91 :D4P2C/zf
ドキュメント日本語訳
ttps://github.com/PowerShell/powerShell-Docs.ja-jp
名無し~3.EXE [] 2016/04/10(日) 17:17:02.99 :Ya+yql5v

foreach ($files in Get-ChildItem c:\test\1\*.zip)
{
$file = $files.FullName
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace($file)
$dest = $shell.NameSpace((Split-Path $file -Parent))
$dest.CopyHere($zip.Items())
}

元の提示コードはほとんど変えていない、zip.Itemsというのがあるとは。
v5でないとZIPが扱えない(vbsのみ)と勝手に勘違いしてた。ありがとう。
名無し~3.EXE [sage] 2016/04/11(月) 07:36:44.98 :H/IVRRFq
そのコードtry{}finally{}でリソース解放してないしエラー処理全然してないMSがやるなって言ってるバッドノウハウやぞ
.NET使って安全に操作するコードはググれば出てくるからそっち使え
名無し~3.EXE [sage] 2016/04/11(月) 07:43:02.18 :H/IVRRFq
よく見たらv2向けか
.NET4で追加されたコンポーネントだからコンフィグ書いて有効化しないと駄目だから素のPSv2だとつらいぬ
リソース解放はしないと駄目だが
名無し~3.EXE [sage] 2016/04/12(火) 22:04:19.71 :Hvynaw8z
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine]
"RuntimeVersion"="v4.0.30319"
名無し~3.EXE [sage] 2016/04/13(水) 00:14:54.45 :O7omPW5i
どんなときもアンマネージなものはちゃんと破棄しないと延々プロセスに居残ったりするぞ
try{
$com = New-Object -ComObject hoge
}
finally{
[System.Rumtime.InteropServices.Marshal]::FinalReleaseComObject($com)
}
名無し~3.EXE [sage] 2016/04/26(火) 19:02:26.18 :fH5fwBkQ
VScodeのpowershell使ってみたけど、これプロファイルもモジュールも読み込んでくれんのだな
設定にもない
もちろんスクリプトに書けばいいんだけど、めんどくさい
編集機能はさすがだけど、手軽さではまだISEには遠く及ばない
名無し~3.EXE [sage] 2016/04/29(金) 17:09:54.19 :bLhrQyfm
タスクスケジューラからpowershell.exeを登録すると、windowstyle hiddenを指定しても一瞬ウインドウが表示されるけど
一瞬も無しで完全にバックグラウンドでスクリプトを走らせるにはどうしたらいいの?

ググるとvbscriptを経由して〜とかあるけどそれは意味ないやん…
名無し~3.EXE [] 2016/04/29(金) 20:18:57.97 :KVZJGJfN
C#経由してもいいぞー
名無し~3.EXE [sage] 2016/04/29(金) 21:41:33.27 :bLhrQyfm
マジで出来ない感じかー
名無し~3.EXE [] 2016/04/30(土) 00:47:46.31 :PHdioS6S

ま、VBSでも1行書くだけだから
名無し~3.EXE [sage] 2016/04/30(土) 01:21:12.70 :PbZP7EPO
オプションを渡すのまで含めると一行じゃ済まないような
名無し~3.EXE [] 2016/04/30(土) 02:16:03.32 :PHdioS6S
ま。実際は
短く書いて2行
長くく書いて3行
名無し~3.EXE [sage] 2016/04/30(土) 08:37:28.02 :F5RZd8EQ
試してないけど、予約の時点からatコマンドを使ってSystemアカウント側で実行したらどうだろう
名無し~3.EXE [] 2016/05/01(日) 06:35:05.54 :VkOZSDxp

2〜3行書はば、あとはパラメータ変えて
使いまわすだけじゃない
名無し~3.EXE [] 2016/05/01(日) 09:45:41.60 :eOYUaM1/
マ イ ン ド コ ン ト ロ ー ル の手法

・沢山の人が、偏った意見を一貫して支持する
 偏った意見でも、集団の中でその意見が信じられていれば、自分の考え方は間違っているのか、等と思わせる手法

・不利な質問をさせなくしたり、不利な質問には答えない、スルーする
 誰にも質問や反論をさせないことにより、誰もが皆、疑いなど無いんだと信じ込ませる手法

偏った思想や考え方に染まっていたり、常識が通じない人間は、頭が悪いフリをしているカルト工作員の可能性が高い

靖 国 参 拝、皇 族、国 旗 国 歌、神 社 神 道を嫌う カ ル ト

10人に一人は カ ル ト か 外 国 人

「ガ ス ラ イ テ ィ ン グ」 で 検 索 を !
名無し~3.EXE [sage] 2016/05/01(日) 20:43:22.56 :mDRI+sfm

別ユーザで実行はむり?
名無し~3.EXE [sage] 2016/06/03(金) 14:05:18.60 :fchdWesW
PowerShellが多重起動してPC起動時にWindows PowerShell は動作を停止しました。
と表示されます。

スレチかもしれないですが、助けてほしいです・・・。

ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13160046463
名無し~3.EXE [sage] 2016/06/03(金) 16:39:23.82 :I/w+vokO
マルチかもしれないので、助けないでほしいです・・・。

ttp://hissi.org/read.php/win/20160603/ZmNoZFdlc1c.html
名無し~3.EXE [] 2016/06/05(日) 18:35:17.14 :T0CgIZBO

PowerShellの問題じゃなく
いれている(入っていた)ソフトの問題。

もう一つの可能性はウイルス(PowerShellに起因すウイルスと
いうよりも、他の関係によるものかな)

あなた以前もいろいろ当たっていたと思うんだけど
その時に指摘したウイルス周りをちゃんと調べた?
名無し~3.EXE [sage] 2016/06/09(木) 08:15:09.77 :dtv3xeQJ
新連載

Windows PowerShell基本Tips
ttp://www.atmarkit.co.jp/ait/series/3410/
名無し~3.EXE [sage] 2016/06/10(金) 09:29:28.88 :9wLf6Q3D
突然スマソ
スレ違いだったようでこちらで質問させてください

Windows10で突然システムダウンして
スタートメニューや設定やストアやEgdeが開かなくなって
復旧させようとしても
DISMとsfcでは復旧出来ていますが
powershellのコマンドが動きません
このエラーってどう対応すればいいかわかりますか?

PS C:\WINDOWS\system32> Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocat
ion -like "*SystemApps*"} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Re
gister "$($_.InstallLocation)\AppXManifest.xml"}
Get-AppXPackage : サーバーの実行に失敗しました
サーバーの実行に失敗しました
発生場所 行:1 文字:1
+ Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation -like "*S ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-AppxPackage], Exception
+ FullyQualifiedErrorId : System.Exception,Microsoft.Windows.Appx.PackageM
anager.Commands.GetAppxPackageCommand

PS C:\WINDOWS\system32>

Powershellを動かしたいんですが、このエラーを検索しても情報がなくて困っています
該当のサービスが動いているのは確認しています
エラーメッセージでは認証エラー乱発しているところまでは突き止めました
名無し~3.EXE [sage] 2016/06/10(金) 14:49:01.84 :c6aYeIck
PCのリセット
名無し~3.EXE [sage] 2016/06/16(木) 22:32:23.94 :fGMY8cbM
Add-Content ABC.txt "あああ"

↑で既存のテキストファイル(ABC.txt)の末尾に"あああ"を追記できることはわかったのですが
末尾ではなく先頭に追記することも出来るのでしょうか?
名無し~3.EXE [sage] 2016/06/17(金) 12:52:23.10 :F3eRwBMb
"あああ"という内容の一時ファイルを作って
その一時ファイルにABC.txtの内容を追記する
934 [sage] 2016/06/17(金) 13:00:03.93 :F3eRwBMb
"あああ" + (Get-Content ABC.txt) | Set-Content ABC.txt

でよかった
934 [sage] 2016/06/18(土) 11:39:49.66 :rDWXddiE
だと改行が消えちゃうな
"あああ" + (Get-Content ABC.txt -Raw) | Set-Content ABC.txt
であってるはず
名無し~3.EXE [sage] 2016/06/18(土) 11:46:19.25 :p2IPyLKP
読み込みと書き込み同時に起こってエラー出そうだけど、()でくくってるからいいのか
応用ききそうだね、これ
禁断の名無しさん [] 2016/07/02(土) 22:19:04.36 :WBq7371R
10秒間隔でコマンドを実行して結果をcsvに出力させるスクリプトを作成したのですが、データの一番左にコマンドを実行した時刻を挿入するにはどうすればよいですか?
名無し~3.EXE [sage] 2016/07/03(日) 21:02:29.91 :SewQY6G0
現在時刻自体は
Get-Dateでも[DateTime]::Nowでも
容易に取れるけどそういう事ではないんだよね?

何処に苦慮してるのか教えて貰えると
もうちょい答えられると思う
禁断の名無しさん [] 2016/07/03(日) 22:59:27.42 :BXJvDp8m

レスありがとうございます。
はい、例えばGet-processをIEにフィルターして10秒間隔で結果をcsvに出力します。この結果に時刻を挿入したいのです。
名無し~3.EXE [sage] 2016/07/04(月) 10:31:22.39 :Tn3EYpPx
りんねのような微妙な噛み合わなさだな

そのフィルタ結果の文字列をCSVに渡す前に日付を+演算子で結合すればいいと思うよ
名無し~3.EXE [sage] 2016/07/05(火) 00:34:24.20 :z6vkue0d
SpeedFanを起動時にタブを切り替えてCPU温度が表示されるように
自動実行させたいのですがうまくいきません。

【PS】UI AutomationをPowerShellで使ってみる
ttps://de9bx.wordpress.com/2015/04/26/%E3%80%90ps%E3%80%91ui-automation%E3%82%92powershell%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/
の「タブを切り替える」を参照して

# アプリケーションウィンドウ
$appWnd = Get-UiaWindow -Class ‘ TForm1’ -Name ‘SpeedFan 4.51’;
# タブ取得
$tabs = $appWnd | Get-UiaTab -AutomationId ‘197374’ -Class ‘TPageControl’;
# 切り替え先のタブを取得
$targetTab = $tabs | Get-UiaTabItem -Name ‘チャート’;
# タブ切り替え
$targetTab.Select();

というふうに書いたのですが実行すると
名無し~3.EXE [sage] 2016/07/05(火) 00:34:56.76 :z6vkue0d

>Get-UiaTab : failed to get control in 5000 milliseconds by: title: '', automationId: '197374',
> className: 'TPageControl', value: ''.
>発生場所 C:\Users\user\Documents\PowerShell\無題1.ps1:6 文字:29
>+ $tabs = $appWnd | Get-UiaTab <<<< -AutomationId ‘197374’ -Class ‘TPageControl’;
> + CategoryInfo : OperationTimeout: (:) [Get-UiaTab]、Exception
> + FullyQualifiedErrorId : ControlIsNull,UIAutomation.Commands.GetUiaTabCommand
>Get-UiaTabItem : パラメーター 'InputObject の引数を確認できません。引数が null または空です。null または空でない引数を指定して、コマンドを再度実行してください。
>発生場所 C:\Users\user\Documents\PowerShell\無題1.ps1:8 文字:36
>+ $targetTab = $tabs | Get-UiaTabItem <<<< -Name ‘チャート’;
> + CategoryInfo : InvalidData: (:) [Get-UiaTabItem]、ParameterBindingValidationException
> + FullyQualifiedErrorId : ParameterArgumentValidationError,UIAutomation.Commands.GetUiaTabItemCommand
>
>null 値の式ではメソッドを呼び出せません。
>発生場所 C:\Users\user\Documents\PowerShell\無題1.ps1:10 文字:18
>+ $targetTab.Select <<<< ();
> + CategoryInfo : InvalidOperation: (Select:String) []、RuntimeException
> + FullyQualifiedErrorId : InvokeMethodOnNull

とエラーメッセージが出て切り替えできません。
引数が間違ってる模様ですがどのようにしたらよろしでしょうか。

UI Automationはインポート済みで確認もしております
OSはWindows7、PowerShellのバージョンは2.0です。
名無し~3.EXE [sage] 2016/07/06(水) 21:57:00.11 :WN6+AOJJ

SpeedFanが管理者権限で動いているからとか
名無し~3.EXE [sage] 2016/07/15(金) 18:22:21.89 :WC+IAGr4
管理者権限ならwindow取得でエラーになってるはずなので
エラー通りタブコントロールの取得に失敗してるだけでは?
もっかいやり直した方が良い
944 [sage] 2016/07/15(金) 21:52:41.14 :E/wxFopI

すまん
全然言葉が足りてなかったけど実際に試したんだ
管理者権限なくてもGet-UiaWindowは成功するがGet-UiaTabでこける
管理者権限で動かせばこのスクリプトはちゃんと動作したのでだと思った

ただ対象のプログラム(SpeedFan)を起動する度に
AutomationIdが変わるみたいなのでそれも関係あるかも
AutomationId指定しなくても今回の場合はうまく動くけども
942 [] 2016/07/16(土) 02:58:54.72 :a2OHumHV
−946
どうもありがとうございます。
書きなおしてみました。

#SpeedFanの起動
$process = Start-Process "C:\Program Files\SpeedFan\speedfan.exe" -PassThru
#プロセスIDの取得
$window = Get-UiaWindow -ProcessId $process.Id -Seconds 5
#タブ取得
$tabs = $window | Get-UiaTab -Class ‘TPageControl’
#切り替え先のタブを取得
$targetTab = $tabs | Get-UiaTabItem -Name ‘チャート’
#タブ切り替え
$targetTab.Select()

でタブを切り替えることができました。

さんの書いてある通り取得がうまくいってなかったみたいです
はっきりした所はわからないのですが。

でさらに上記に下記を追加してチェックを追加しようとしたのですが

# 「Core」チェックボックス
$box = $targetTab | Get-UiaCheckBox -Name 'Core'
#チェックをつける
$box | Invoke-UiaCheckBoxToggle
名無し~3.EXE [] 2016/07/16(土) 03:07:23.79 :a2OHumHV

>Get-UiaCheckBox : failed to get control in 2000 milliseconds by: title: 'Core', automationI
>d: '', className: '', value: ''.
>発生場所 Z:\Dropbox\プログラミング\PowerShell\SpeedFan.ps1:14 文字:36
>+ $box = $targetTab | Get-UiaCheckBox <<<< -Name 'Core'
> + CategoryInfo : OperationTimeout: (:) [Get-UiaCheckBox]、Exception
> + FullyQualifiedErrorId : ControlIsNull,UIAutomation.Commands.GetUiaCheckBoxCommand
>Invoke-UiaCheckBoxToggle : パラメーター 'InputObject の引数を確認できません。引数が null または空です。null または空でない引数を指
>定して、コマンドを再度実行してください。
>発生場所 Z:\Dropbox\プログラミング\PowerShell\SpeedFan.ps1:16 文字:32
>+ $box | Invoke-UiaCheckBoxToggle <<<<
> + CategoryInfo : InvalidData: (:) [Invoke-UiaCheckBoxToggle]、ParameterBinding
> ValidationException
> + FullyQualifiedErrorId : ParameterArgumentValidationError,UIAutomation.Commands.Invok
> eUiaCheckBoxToggleCommand

とエラーメッセージが出てチェックできません。
前レスと同じようにチェックボックスが取得できてないと思うのですが
調べるとTabItemとCheckBoxの間にも取得しないといけない物があるようですが
やってみてもエラーが出てどこが問題点かがつかめません。
名無し~3.EXE [sage] 2016/07/28(木) 08:23:19.72 :/xKHpClL
Announcing Windows Management Framework (WMF) 5.1 Preview
ttps://blogs.msdn.microsoft.com/powershell/2016/07/16/announcing-windows-management-framework-wmf-5-1-preview/
名無し~3.EXE [sage] 2016/08/02(火) 00:22:42.44 :RsXUjc19
WMF5.0でハードリンク作成できるようになったと聞いてやってみたけど、
使えねー 元ファイルに[]が入ってると解釈しちゃう
cmd /c mklink の方がマシ

なんだかな
名無し~3.EXE [sage] 2016/08/02(火) 01:18:22.69 :3ITzTA6w

ファイル名・フォルダ名に使えない文字に[]も入れて欲しいよな。
大量のファイルをPSで一括処理する時にいつもこれが問題になってウンザリ。

ってが言ってるのはそういうことではない?
名無し~3.EXE [sage] 2016/08/02(火) 01:34:41.66 :RsXUjc19

そういう事だけど、ハードリンク作る時は解釈しないようにするだけだ
だいたい処理的に1ファイルしか対象に出来ないコマンドで、なんでマルチキャスト解釈するのか分からん

勢い5万以上のスレをメールでお知らせするサービス、実施中!!
憧れボディをGETしたい!その夢、ボニックで!

新着レスの表示

2ch勢いランキング アーカイブ Windows板ランキング

凡例:

レス番

100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている

名前

名無しさん (青) → sage のレス
名無しさん (緑) → age のレス

ID

ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID

このページは2ch勢いランキングが作成したアーカイブです。削除についてはこちら