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 行ごとに指定項目があるとすると、 &{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 &#128064; 👀 : 名無し~3.EXE [sage] 2015/02/27(金) 08:54:19.35 :bSthd26A &#128064; こうか : 名無し~3.EXE [] 2015/02/27(金) 18:29:37.90 :9x7T7vro 練習 &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/ 俺も目玉練習&#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ファイルしか対象に出来ないコマンドで、なんでマルチキャスト解釈するのか分からん
凡例:
レス番
100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている
名前
名無しさん (青) → sage のレス
名無しさん (緑) → age のレス
ID
ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID
このページは2ch勢いランキング が作成したアーカイブです。削除についてはこちら 。