Windows PowerShell 2.0 Part2
1 :
名無し~3.EXE :
2009/12/18(金) 12:14:24 ID:H2dW8sR1
3 :
名無し~3.EXE :2009/12/18(金) 12:16:47 ID:H2dW8sR1
>>1 PowerShell 2.0 の Part2 ってするくらいならせめてリンク先ちゃんと変えろよw
ぶっちゃけバージョンごとにスレ番変える必要はないと思うけど
7 :
名無し~3.EXE :2009/12/19(土) 13:19:47 ID:6t1jUQFW
だれか、以下の条件を満たす*.ps1ファイルの関連付け教えて 1. ps1スクリプトに複数のファイルをD&Dして各ファイルの絶対パスを渡す 2. 絶対パスは文字列の配列としてスクリプトに渡す 3. パス/ファイル名として使える文字全てに対応 4. Ver2.0でしか動かなくてもOK 5. 引数の事前処理としてバッチファイルの併用可 6. *.batの関連付けで引数の部分変更可 自分でやってたけど & とスペースが組み合わさったファイル名の時の対策がどうにも難儀だわ
どこまでできたの?
11 :
9 :2009/12/27(日) 22:25:48 ID:DBMTfN0o
>>10 ps1スクリプトの関連付けを run.bat "%1" "%*" として
↓みたいなPowerShellを起動するバッチファイルを作ったけど、正直全然やりたいことできてない
set arg=%*
set arg=%arg:&=^&%
set arg="%arg:"=''%"
set arg=%arg:''''=''%
set arg=%arg:~1,-3%
rem ↓書き込みの制限で改行してるけど、実際には改行してない
powershell "$str = iex ('@''' + (echo `n) + ' %arg% ' + (echo `n) + '''@'); $str = [System.Management.Automation.PSParser]::Tokenize($str, [ref]$null) |
select -exp Content; $files = New-Object System.Collections.ArrayList; $path = ''; foreach ( $fragment in $str ) { $path += $fragment;
if ( Test-Path $path ) { [void]$files.Add($path); $path = ''; }} $files; & '%1' $files"
今はバッチファイルは使わずに powershell.exe "$a = '%1' " みたいな感じでやってみようかと思うけど、にんともかんとも
あー・・・できたかも、これでどうだろ # PS1ファイルへのドラッグを有効化する cp -Path HKCR:\VBSFile\ShellEx\ -Destination HKCR:\Microsoft.PowerShellScript.1\ cp -Path HKCR:\VBSFile\ShellEx\DropHandler -Destination HKCR:\Microsoft.PowerShellScript.1\ShellEx # D&Dされたファイルを引数にスクリプトを実行可能にする New-Item HKCR:\Microsoft.PowerShellScript.1\shell\open New-Item HKCR:\Microsoft.PowerShellScript.1\shell\open\command $command = @' C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -NoExit "&'%1' ('%*' -replace '(\w+\:)',',$1' -split ',' -ne '' )" '@ # 引数はファイルのフルパスなので、ドライブレターの前にカンマ入れて分割 New-ItemProperty -Path HKCR:\Microsoft.PowerShellScript.1\shell\open\command -Name "(default)" -Value $command テストに使ったファイル名が適当なので、暇な人は試してみてくれると嬉しい
ごめん、
>>12 だとファイル名に'がある時にエラーが出るままだった
C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -NoExit "&'%1' ((iex ('@''' + (echo `n) + ([String]{<#%*#>} -replace '^<#(.*)#>','$1') + (echo `n) +'''@')) -replace '(\w+\:)',',$1' -split ',' -ne '')"
{<#%*#>} のところ {#%*} ってできれば1.0でもそのまま使えるんだけど
なぜかこっちは文として完結してないって解釈されるみたいなんだよなー
まあ別に1.0で使える必要性はないんだけども
powershell.exe -file "%1" %* で駄目な例は?
>>14 あー、Fileを指定してると他はスクリプトの引数として扱ってくれるのか・・・全く見落としてた、ありがとう
しいて言うなら引数は$argsで処理するから [CmdletBinding()] と併用できないって程度かな?
それを気にしないならその方がスマートだねぃ
powershell.exe "〜" one linerの〜の部分の書き方、どこかにない? "'`のエスケープがうまくいかん
>"(二重引用符)はcmd.exeの方で解釈しちゃうからエスケープは無理だと思う なことはない
なんか某所で突っ込まれた気がするので適当にまとめてみた 間違ってたら誰かフォローよろしこ 以下、コマンドプロンプトから powershell.exe の -command オプションに任意の文字列を渡してコマンドとして実行するときの話 ・ 二重引用符 " は \ でエスケープする ・ | & < > は 奇数番目の二重引用符 " の後ろにある時は特別なエスケープ処置は必要はない 偶数番目の二重引用符 " の後ろにある時は ^ を使ってエスケープする CMD > powershell " \" hoge \" " hoge CMD > powershell " ' hoge > fuga ' " hoge > fuga > は奇数番目の二重引用符の後にあるので自動的にエスケープされる、出力結果は ' hoge > fuga ' CMD > powershell " \" hoge > fuga \" " 偶数番の二重引用符 " の後に > があるので、> がエスケープされずに (コマンドプロンプトの)リダイレクト演算子として機能し powershell.exe の出力結果 ' hoge ' が fuga というファイルにリダイレクトされる CMD > powershell " \" hoge ^| fuga \" " hoge | fuga 偶数番の二重引用符 " の後に | があり、| が二重引用符 " によってエスケープされないので ^ を使って | をエスケープする、出力結果は ' hoge | fuga '
文法は面白いけどもっさり過ぎる dirするだけでどんだけCPUパワー食ってんのかと CPUが後2、3世代進んでから乗り換えるわ
22 :
名無し~3.EXE :2010/01/10(日) 00:44:12 ID:O/OoSzS1
知れば知るほど、良い出来だなぁ もう少し改良して欲しい点として、UnixスタイルのCTRL+U、CTRL+A、CTRL+Eの対応と。 コンソールの作りをTeraTermみたいにキーワードをマウスで選択右クリックでペーストとかなって欲しい。 左上のコンテキストメニューつかうの面倒くさいから。 New-ObjectあたりはnewにAlias割り当てて良いんでないかぁ
23 :
名無し~3.EXE :2010/01/11(月) 07:45:26 ID:W7jRU6IE
PowerShellってインストールせずに使うことはできないのかなぁ。 powershell.exeだけコピーして動かそうとしたけどだめだった。
>>21 Powershell用のプロパティが重いんだよね。(gi -l .).getfiles()とかを使えば軽い。
powershellでiseみたいにread-hostでGUIにできない?
なんか似たような質問がちょっと前にもあったような # [Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") [Microsoft.VisualBasic.Interaction]::InputBox("以下に入力","タイトル","デフォルトの文字列") それともpowershell.exe自体をRead-Hostコマンドを実行することで ISEのようなGUIアプリの概観にするという意味じゃろか
get-credentialみたいに、GUIにするか、consoleにするか、のスイッチがあるかと
28 :
名無し~3.EXE :2010/01/14(木) 23:32:28 ID:xZGgtzzJ
質問です。二重ループの内側で外側のオブジェクトどうやったら参照できますか? dir -Recuse c:\temp | %{ cat $_ | % { // $_の外側のForEach-Objectオブジェクト参照どうすればいいの? } }
別の変数に代入しておけばいいだけじゃん?
30 :
名無し~3.EXE :2010/01/15(金) 00:53:18 ID:bgPwBRCA
シェルスクリプトの美しさっていうのか、 さりげないけど、高機能を多用してるのが気持ち良いノリってあるんだよなw
バッチファイルにシェルスクリプト・・・一番簡易で一番高度だもんげ
32 :
名無し~3.EXE :2010/01/17(日) 22:01:51 ID:60xRBkvR
ところで次期VS2010では、PowerShellはメインストリームになるの? やっぱシェルは開発で、ガシガシ使われてナンボではあると思うけど。
34 :
名無し~3.EXE :2010/01/22(金) 00:02:58 ID:YdI+bHOF
PSだけで殆どの業務アプリが作れるような感じがしてきた。 動的言語に近いから、PL/SQLとかT-SQLの置き換えに良いと思ったりする。
これつい先日使い始めたばかりなんだけど、ISEの出力をウィンドウに 合わせて改行とかどうやるの? 一行200桁以上とか見にくくて困るんだけど。
36 :
名無し~3.EXE :2010/01/27(水) 01:17:12 ID:47cnnfMm
これってnetrisできるの?
>>35 アウトプットペインの話ならコマンド実行した時のウインドウサイズに合わせて出力されるよ?
サイズ変更した時に追従はしないけど
>>37 その後何回かウィンドウサイズ変えてやってみたんだけど
赤文字のエラー文てウィンドウサイズの2倍位の位置で改行されてない?
半角80文字位のウィンドウサイズ幅で
存在しないコマンド入れてEnter押した結果
用語 'a' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが
含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:2
+ a <<<<
+ CategoryInfo : ObjectNotFound: (a:String) []、CommandNotFoundExcep
tion
+ FullyQualifiedErrorId : CommandNotFoundException
改行位置は原文まま。半角157文字で改行入ってるし。
わけわからん。
40 :
名無し~3.EXE :2010/02/05(金) 00:06:50 ID:qu9FtZMu
たしかに、PowerShellのエラー表示はちょっとUnixとか汎用機のものとも違って、 ちょっとヘンテコだよね。
1.0の時に合ったクイックリファレンスのドキュメントはどこかに行っちゃったんだな、ふむ。
>>41 インストールフォルダの中にテキストがいっぱいありますよ?
45 :
名無し~3.EXE :2010/02/06(土) 21:00:06 ID:RW7gxJxl
なにかのオブジェクトで、GetClosurerだったかNewClosurerみたんだけど、 高階関数つかるのこれ?
format-tableについて教えください コマンド結果の全プロパティを見たいとき以下のように打ったとします PS C:\> ls | ft * 結果、省略表示されますが省略しすぎてとても何が返ってきてるのか分かりません そこでautoオプションつけますがこれはこれで 収まらない分は削除されてしまいます。リダイレクトしてファイルに吐いても同じです。 PS C:\> ls | ft * -auto 「警告: 18 個の列が表示に収まらないため、削除されました。」 全行を省略しない形で表示できないでしょうか?
PowerShellの画面バッファ/ウインドウのサイズを十分に大きく/フォントを小さく設定/解像度の大きいモニタを使う ls | select * | ogv として別ウィンドウに表示 ls | Export-Csv としてCSVファイルに保存してからエクセル等で表示する の、どれか。
PowerShellは殆どの演算子をハイフンで始まる文字列に押し込めたから ^ とか ~ とかが何にも解釈されない文字として残ってるけど これを利用して 3^3 で塁乗、 9~2 で累乗根、とかできるようにして 他の追随を許さない電卓言語として君臨、とかならんかな、いやならんでいいけど
50 :
名無し~3.EXE :2010/02/09(火) 01:40:39 ID:kaRTV0fr
その辺はエイリアスで勝手にどうぞなんじゃない? それよかスタティックなメンバーをカッコ書きで格納面倒だけど。 $date=[System.DateTime]::Nowとか スクリプトだからしょうが無いかもしれないけど、名前空間とリファレンスを参照するキーワードが欲しいけな。。
ogvが閉じるのを待ち合わせるにはどうすりゃいいの?
52 :
名無し~3.EXE :2010/02/10(水) 00:00:44 ID:yDsRur2e
フォルダ内の検索オプションですが、例えば今日の20時以降に 更新・作成されたファイルをリストアップしたいのですが 標準では年月日までしか日時指定できません。 時間まで指定する方法はありますでしょうか?
53 :
名無し~3.EXE :2010/02/10(水) 00:15:29 ID:LYLYPZIx
そんなことはない
date:>2010/02/09 20:00
>>52 get-date 20:20
とかを試してみるべし。
56 :
52 :2010/02/11(木) 01:11:49 ID:LhylZmK1
>54,55 ありがとうございます。早速やってみます。
>>38 このエラーメッセージをそのまんま変数に取り出せない?
なぜか改行までしか取れないだけど
>>48 ls | convertto-html | out-ie
>>50 PSObjectにAdd-Memberで特定の型の静的メンバをくっ付けて行くことで対処できないことはない
例えば[DateTime]を対象とすると
$typename = "datetime"
$arglimit = 20
$argtext = (1..$arglimit | % { $n = $_.ToString('00'); "`$myarg$n=(`$_iranaiko+=,'myarg$n')"} ) -join ', '
iex "`$$typename = New-Object psobject"
iex "[$typename] | gm -s -MemberType Method" |
% {
$exp = @"
{param($argtext);
Remove-Variable `$_iranaiko ;
`$argtext = (gv myarg* -Scope Local | % { '$' + `$_.Name }) -join ', '
iex "[$typename]::$($_.Name)(`$argtext)"
}
"@
$sb = iex $exp
iex "`$$typename | Add-Member ScriptMethod $($_.Name) -Value `$sb -force"
}
$datetime.DaysInMonth(2, 5)
とかそんな感じで
変数に格納した文字列をあいまい検索する場合 後からアスタリスクを追加するにはどうすれば良いでしょうか? ●作成したいスクリプト 「c:\移動元」 ディレクトリ内にOS名が付いたファイルがたくさんあります。(yyyy_Windows_xxxx.xlsとかで命名規則はバラバラです) これを「c:\移動先」 ディレクトリの同会社名ディレクトリに選別して移動するスクリプトを作成しようとしています。 ディレクトリは↓のイメージです C:. ├─移動元 └─移動先 ├─Windows ├─Linux ・・・ ●作成中のスクリプト ============================================== $SORUCEPATH = "c:\移動元" $DESTPATH = "c:\移動先" $SERCHFILE = ls $DESTPATH | select-object name foreach ($SERCHSTR in $SERCHFILE) { $j = join-path $DESTPATH $SERCHSTR $SERCHSTR = *$SERCHSTR* #←ココ● ls $SORUCEPATH -include $SERCHSTR -recurse | foreach ($_) {move $_.fullname $j -whatif} } ============================================== 結局↓のコマンドのようにしたいのですがどう記述すればよいのでしょうか? ls c:\移動元 -include "*Windows*" -recurse | foreach ($_) {move $_.fullname $j -whatif}
63 :
62 :2010/02/23(火) 01:33:41 ID:1YrNYLaH
>>62 すいません。ズレてしまいましたが
「c:\移動先」ディレクトリの配下に「Windows」「Linux」ディレクトリが存在します
>>62 多分こんな感じでいいんじゃなかろうか
$DESTPATH = "R:\Dest"
$SORUCEPATH = "R:\src"
ls $DESTPATH -Name | % { cd $DESTPATH\$_; ls $SORUCEPATH\* -In *$_* | move -dest .\ }
ああいやまあ-Destの方で指定すればcdする必要ないんだけども
ふむ、タブファイラで渦中のフォルダを3分割表示して 1..10 | % { ls $DESTPATH -Name | % { ls $SORUCEPATH\* -In *$_* | move -dest $DESTPATH\$_ } ; sleep 2 move $DESTPATH\*\* -In *.txt -Dest $SORUCEPATH; sleep 2 ; } とかやるとなかなか楽しいな、なんかのデモに使えそう
よく見たら2回もlsする必要なかった ls $DESTPATH | % { move $SORUCEPATH\*$_* $_.FullName } なんかもっと短く出来そうな、出来なさそうな
>>64-67 ありがとうございました。以下でうまく行きました
$SORUCEPATH = "c:\移動元"
$DESTPATH = "c:\移動先"
ls $DESTPATH -Name | % { ls $SORUCEPATH\* -In *$_* | move -dest $DESTPATH\$_ -whatif}
スクリプト本体と関係ないが soruceはわざとなのかい?
1.0の話ってスレ違い? 誰か教えてください。 今日1.0を入れたら、PowerShell起動時に80ポートを開いて116.91.142.191と225に接続しようとしたんだけど、 これって正常な挙動? 2.0に入れ替えたらこの挙動はなくなりました。もしかしてウイルスにやられてるのかな?
73 :
名無し~3.EXE :2010/03/13(土) 04:27:52 ID:dTKQVsL3
cmd.exeあたりはどこかでバッサリ捨てて欲しいな
64bit Windowsでcommand.comは消えた cmd.exeも同じくらいの時間をかけて消えるのかもしれないね Windows PowerShellはcmd.exeやWSHで使うVBScript、JScriptをどこまで 置き換えるんだろう
>>73-74 WindowsMEを目指すのかwww
Windows上からDOS窓は使えたけど
telnet接続もcmdベースじゃなかったか?
>>75 PowershellからでもSystem.Net.Sockets.TcpClientあたりを使えばいいが。
vista x64 sp2 無印rtmから再インストールしてSP2までアップグレードした後に PowerShell1.0をWindowsUpdateで入れてみたけどやっぱり116.91.142.191にアクセスが発生する。 クリーン環境でも発生したから結局問題なかったんだ、と思うことにします。 一晩かかって疲れた。
>>75 CLIベースの実行ファイルをcmdベースって言ったら、それこそPowerShell自体がって話になるんでは。
1,2,3,4,5|Export-csv -path "abc.csv" ってやったら、 abc.csvの内容が #TYPE System.Int32 と出ました。 どうして"1,2,3,4,5"にならないのでしょうか?
>>81 System.Int32型のプロパティをCSV形式にしてるから(プロパティないから改行だけになる)。
ていうか、そのやり方ではできたとしてもせいぜい
"1"
"2"
"3"
...
みたいな出力しか期待できんだろ
-join 使えばいいじゃん
一発ネタ コマンドプロンプトの環境変数表記を使えるようにする ls env: | % { iex "function $(`"%`" + $_.Name + `"%`") { `$env:$($_.Name) }" } うん、それだけなんだ、すまない
85 :
名無し~3.EXE :2010/03/28(日) 21:35:22 ID:omxsl1A9
PowerShellのTransaction系の実装には期待している。 一貫性を保障出来るならかなり良い思うんだけど。
ieコンポーネントを使ってgoogleを開き、キーワードを入力して検索する。 検索結果を10ページ分、名前を付けてhtml形式で保存する。 この操作をPowerShellで可能なのでしょうか? 可能であればサンプルコードを見せてもらえるとうれしいです。
一人月で開発してやるよ
生産性悪そうだから単金百円で
仮に・・・ 裏がPowerShellやDosコマンドで、UIは他言語でアプリを作るとしたら何が良いのでしょうか?VB?
UIもPowerShellで作ればええじゃないか
91 :
89 :2010/03/30(火) 00:10:53 ID:is44HdHL
見た目はビジュアル重視で行きたいです。
だったらVisualBasicだね
Add-History は CSV 形式にすれば好きなコマンドをヒストリに追加できる Invoke-History はコマンドを実行する前に実行するコマンドを画面に出力する というわけでバッチファイルのように自分自身を読み上げながら実行するスクリプト思いついた ------------------------------------------------------------------------------------ (type $MyInvocation.MyCommand.Path) | select -Skip 7 | % -Begin { @' #TYPE Microsoft.PowerShell.Commands.HistoryInfo "Id","CommandLine","ExecutionStatus","StartExecutionTime","EndExecutionTime" '@ } { '"0","{0}","Completed","0001/01/01 0:00:00","0001/01/01 0:00:00"' -f $_ } | ConvertFrom-Csv | Add-History ((h)[-1].Id-((type $MyInvocation.MyCommand.Path).count-8))..(h)[-1].Id | % -Begin {$i=1} { "#"*30 + ("`tBegin`tCommand:{0,3}" -f $i++) + "#"*30 ; Invoke-History -Id $_; "#"*30 + ("`tEnd`tCommand:{0,3}" -f $_) + "#"*30 } return # ここまで7行 # 実行したいスクリプト ls ps ------------------------------------------------------------------------------------ まあプロンプトは出てこないから自分で装飾する必要があるんだけどもー
94 :
89 :2010/03/30(火) 20:35:57 ID:is44HdHL
95 :
名無し~3.EXE :2010/04/02(金) 01:16:28 ID:M7yf1HAI
PowerShellさっさとWin2008 Serverに載せてればよかったんだけど・・・ V3いつリリースされるかわからないけど、 日本じゃ、これってサーバ製品に普通に標準で乗らないと一向に普及しないよな。
2008は標準搭載(ただし要有効化)、2008R2から標準インストールされてるがな
うがー、コンソールアプリはフック効かないって分かったらここ2日くらい悩んでたのが全部無駄になった気分だ・・・ cmd.exeのマウスでコピーとかはWinAPI使わない独自実装なんかな
バッチファイルをバックグラウンドで走らせたいのですが $cmd={& "C:\hoge\hoge.bat"} ; Start-Job -ScriptBlock $cmd はOKでしたが、 $bat = "C:\hoge\hoge.bat" $cmd={& $bat} ; Start-Job -ScriptBlock $cmd はNGでした。 うまい書き方はないですか?
Start-Process -FilePath $bat -NoNewWindow とするか iex "`$cmd={& $bat}" とするか $cmd={param($bat); & $bat} Start-Job -ScriptBlock $cmd -ArgumentList $bat とするかくらいだと思うよ
100 :
名無し~3.EXE :2010/04/06(火) 06:19:49 ID:Q597yQV9
>>99 ありがとう。
iex "`$cmd={& $bat}"
でOKでした。
バックグラウンドでは Write-Progress の表示が見えないのですが、 フォアグラウンドのコンソールにリダイレクトする方法はありますか?
>>101 バックグラウンド処理は別プロセスだからホスト側のプロセスには影響しない
というか、Write-Progress使うならバックグラウンドでやる意味がないと思うんだが・・・
中の処理で進行度の数値を出力してReceive-Jobで拾って、
(ホスト側の)$host.ui.rawui.windowtitleに入れてタイトルバーで表示するくらいじゃね
103 :
101 :2010/04/07(水) 13:52:54 ID:z101cFdY
>>102 よく考えたらバックグラウンドのプロセスが画面持ってるのはおかしいですよね
その方法で試してみます。ありがとう。
powershellでGUI書いてみたんですが、ビジュアルスタイル?が適用されない様で困っています PowerGUIから実行する場合は問題ないんですが、シェルからだと例えばボタンの上にカーソル持っていっても ハイライトされないんです [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") で読み込んでるdllは同じなんですが、何が違うのか見当がつきません 有識者の方、御教示お願いします
Format-List の出力を行単位で取り出すにはどう書けばいいですか? > Get-ChildItem .\hoge.txt | Format-List | foreach {echo "[" $_ "]" } [ ディレクトリ: C:\hoge ] [ Name : hoge.txt Length : 9 CreationTime : 2010/04/09 9:59:24 LastWriteTime : 2010/04/09 9:59:48 LastAccessTime : 2010/04/09 10:03:44 VersionInfo : File: C:\hoge\hoge.txt InternalName: OriginalFilename: FileVersion: FileDescription: Product: ProductVersion: Debug: False Patched: False PreRelease: False PrivateBuild: False SpecialBuild: False Language: ] ... この Name Length を一行ずつ取り出したいのですが。。。
>>104 ソース見ないとなんともだな
>>105 素直に Format-List Name, Length って書けばいいだけに見える
特定のアプリケーションを強制終了させて、再起動させて、特定のボタンを押す。 というのを3時間周期で行わせたいのですが、こんなことってPowerShellでできますか? WHSのほうがいいの?
109 :
名無し~3.EXE :2010/04/10(土) 22:19:25 ID:Ii5m8hz2
MSのサーバ製品、PowerShell経由で操作するように組み換えが進んでるよな。
>>107 後は定期実行はタスクスケジューラに登録すれば何使ってもできる
余談だけどUIAutomationがPowerShellから直接は使えないってのは2.0でも直ってないんだな
特定のボタンを押す動作を自動化する方法がわかりません。 Windowsをアクティブにして、ボタンが3個目だとしたら、TABに相当するコードを SendMessageすると良いと思うのですが、どうコーディングすれば良いのでしょうか?
>>111 あ、少し文章が抜けてました。
「TABに相当するコードを3回Sendmessageして、クリックに相当するコードをSend」
> "a`r`nb".split("`r`n") a b > "a`r`nb".split("`r`n").count 3 > "a`r`nb" -split "`r`n" a b > ("a`r`nb" -split "`r`n").count 2 ハマったぜ。。。
function f { Write-Host $args.length foreach ( $i in $args) { write-host $i } } $opt = "1 2 3" f $opt -- 1 1 2 3 引数をばらす方法ないですか? -- 3 1 2 3
>>115 String.Split(Char[])
である。
"`r`n"はStringではなく、Char[]として解釈され、"`r"または"`n"で文字列を区切った
String[]を返す。"`r"と"`n"の間には何もないのだから、nullとなる。
PS> "a`r`nb".split("`r`n")[1] -eq "`0"
true
>>115 -split 演算子は String.Split ではなく Regex.Split のラッパー
[Regex]::Split("a`r`nb","`r`n" )
>>116 "1 2 3" という文字列を渡してるのにばらけるわけなかろう
$a=1,10,20 という配列を作った後、分配演算子@を使って
& { $args.Count; $args } @a というふうに渡すことはできる
119 :
名無し~3.EXE :2010/04/14(水) 11:44:05 ID:rEUM1djO
PS> function f { $args.length; $args } PS> f - 1 - PS> f -- 0 PS> f --- 1 --- PS> f "--" 1 -- hmm...
regular syntax command [-options...] [--] [arguments...]
-- は渡してくれないのね 自前でオプション解析しようと思ったら - 以外を使わんといかんな
S
124 :
名無し~3.EXE :2010/04/14(水) 22:30:43 ID:TkMKnc/G
諸先輩方に変数の展開について質問です 例えばスクリプト内で以下のようにコマンドを実行させたいのですが > java -version このようにするとうまくいきません > $str = "sion" > java -ver$str こうするとうまくいくのですが > $str = "version" > java -$str なぜでしょうか? こんな面倒なことをわざわざしたいのではなく スクリプトの中で変数を多用しているため 結果的にそうなったということなのですが・・・
>>124 「-$str」の「-」は演算子として解釈されるからだ。
PS> $c = 2
PS> -$c
-2
文字列には「-」で行える演算がない。「-」を文字として扱いたいならば、次のようにやればいい。
PS> $str = "version"
PS> java "-$str"
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)
>>125 ありがとうございます
> $str = "sion"
> java "-ver$str"
で解決しました.
PSは高級なバッチファイルとして使っていたいたのですが
この仕様はちょっと不便というかなんというか
バッチファイル代わりに使うことが
そもそも間違っているのかもしれないですが
basicではストリング変数ってa$と、$が変数名の後ろにあったはずだが、 秀丸マクロの真似したのかね?
awkだろ
ふつうにshからだろ
sh変数代入で$使わない
あれ、PowerShell ISEでもchcpコマンド有効なんだ PS > chcp 現在のコード ページ: 932 PS > [Text.Encoding]::UTF8.GetBytes("テスト:UTF8 ON POWERSHELL")| sc -enc Byte r:\utf8.txt PS > cmd /c 'type R:\utf8.txt' 繝・せ繝茨シ夲シオ・エ・ヲ・・・ッ・ョ ・ー・ッ・キ・・・イ・ウ・ィ・・・ャ・ャ PS > chcp 65001 Active code page: 65001 PS > cmd /c 'type R:\utf8.txt' テスト:UTF8 ON POWERSHELL これだとcmd.exeみたいに表示だけじゃなく日本語入力も普通にできる
v2で話題のpowershell面白いな wsusを管理するコード、他言語に移植する方法が分からんし これで行くわ 勉強不足が身にしみるこのごろ
135 :
名無し~3.EXE :2010/04/21(水) 01:01:38 ID:1lMH3tjx
PowerShell面白いよな。 それからCMD.EXEしかしらないバカどもを早く一掃してほしい。
command.comしかわかりません><
ほんとは、追加インストールが発生しない vbscriptの方がいいに決まってる(ような気がするが) リモート機能も強化されたし、試してみるわ
cmdから移行中なんだけど ps1ファイルをコマンドラインから実行するのってどうやるの? mycmd.ps1があって >mycmd と打つだけで実行できるようにしたい。 とりあえずpathextには追加したけどあとがよく分からない。
F#ってどうよ
PowerShellはかなりいい出来だよな。 2.0になってリモートコールもできるしサーバ管理は楽になったんじゃないの もうちょっとコマンドレットが覚えやすいといいんだけどね。 マクロの記憶じゃないけど、GUIから操作した結果をコマンドレットを取得できるような仕組みがあると良い
Exchangeとかのサーバー製品はそんな感じだね
Exchangeあたりのコマンドレットはオプションありすぎで、やや扱いにくい。 まぁしょうがないかもだけど
慣れの問題だよ
う〜ん、単純に↓を速度比較すると(cmd.exe起動終了のロスはあるにしても)完全に逆転してるなぁ・・・ .NET4.0おそロシア cmd /c "dir c:\ /s/b" [IO.Directory]::EnumerateFileSystemEntries("C:\", "*", "AllDirectories")
.NET4に対応したPowerShellてそのうちリリースされるん?
ps2って拡張子.ps2なの?
うんにゃ、ps1のままだよ
powershellってMacOSで言うターミナルみたいなもの? 「Windowsってコマンドプロンプトだろ?プププ」みたいなことをマカーに言われたけど、実はpsならターミナルよりすごい?
↑に追加 ターミナルってなんと言うかtelnetとかviとかMacPortsとかいろいろ使えて、ただのシェルスクリプト環境だけじゃない総合的なCUI環境というイメージ(あくまでも使ったこと無いのでイメージ)だけど、それに匹敵するもの? それともpowershellってシェルスクリプト部分だけがすごいの? 無知ですまんが教えてください
キャラクタベースなんて時代遅れ。 psはオブジェクトベースです。 という建前。
>>147 のはPS以外の.NETプログラム(Paint.NETとかRadeonのコンパネとか)にも
強制的にCLR4.0を使わせる物。
PowerShellだけなんとか…と思ったらこんなのがあった。
HKLM\Software\Microsoft\PowerShell\1\PowerShellEngine
の RuntimeVersion を
v2.0.50727
から
v4.0.30319
に書き換えるとPowerShellがCLR4.0を使うようになる。
でもISEは2.0のまま。どこに設定あるんだ…。
>>152 ありがとう。
PS自体のバージョンに関係なく、言語仕様が大幅に変更され互換性が維持できなくなるまで1のままってことなのかな。
拡張子にバージョンにいれるのってあんまり意味ない気がするな。
エイリアスフォントが使えるようになって初めてISE使ってみよっかなって思った香具師の数 ノシ
これでFixedSysが使えればもう何も文句ないな
>>156 >>147 のところに併せて書いてある$psHome\powershell_ise.exe.configを作れって話で
<supportedRuntime version="v4.0.30319" />
にしたら動いたよ
>>154 何を言ってるのかわからんが、コマンドプロンプトでもtelnetもvim(自分で入れれば)も使えるよ
yumやMacPortsのようなパッケージシステムは基本的にない
対話型シェルとしては十分高機能
>>158 なんか手法がside-by-sideみたいなやっつけ仕事的で嫌だなぁw
>>160 試しに$psHome\powershell.exe.configを作って同じようにバージョン指定したら
powershell.exeもconfig側の設定に従うようになった
あくまでもPowerShellのデフォルトを設定するのがレジストリのPowerShellEngineなのかも、そうじゃないのかも
というかこの辺りは2,3年前に公式ブログで言っていたような気がするような、しないような
>>157 UNIXを少しでも使う人であれば
PSと言えばPostScriptを連想するはず
敵対(?)フォーマットを潰すべく
PostScriptに喧嘩を売っているような
でも実はそこまで勇気はなくて拡張子をps1としたような
なんか微妙・・・と思うのは俺だけ?
個人的には.psと紛らわしいのであんまり好きじゃない
163 :
名無し~3.EXE :2010/05/04(火) 00:05:36 ID:YTxCzC0Z
Windowsで、PostScriptつかってる輩はすくないとおもうが なんでPS1にしたんだろうね。
PSで思い浮かぶのはPlayStationとかPS/2端子とかじゃね PostScriptとか(TeX並みに)何年も聞いてないわ
.psh にしろよと思ったけど既に変なアプリで使われてるのか 拡張子もwell-knownポート並みに狭苦しい世界だな
.windowspowershellscriptfile でいいんじゃない?
んじゃwpsで…と思ったらMicrosoft Worksですか。 # Workplace Shellとか思い浮かべたらオッサン。
.ps1の1はバージョンを指してる訳じゃないのかもしれない
powershellでMS DHCPをコントロールする方法が見つからない フィルタをインポートするツールは落ちてるのに PSで実施する方法が出てない MSDNのどこかにありますか?
みるみるの(キリッかわいいよみるみるううう
あ、ごめん誤爆
Group-Objectってあらゆるオブジェクトに対する重複削除にも使えるな・・・やはりGroup-Objectは素晴らしい
GUIデバッガマダー
Windows2008r2に付いてきてるあれは? 使った事ないけど
Excelヘルプ並みのヘルプを付けてくれると普及すると思うんだが 開発系ツールだからダメなのか phpとか出た当初からヘルプ見やすかったのに
結構立派なヘルプ付いてるじゃん
前スレだかにget-helpを再帰的に呼んで行ってhtmlにするスクリプトあったね
v2からは普通にあるんだから別段作らんでもええがな
echo 日本語 | app.exe で日本語が???になるんだけど、どうすりゃいいの?
できました!
どうやってできたの?
cmd.exe /c "echo 日本語 | app.exe"
$OutputEncoding = [Console]::OutputEncoding としとくと素のままで使えると思うよ
>>181 Free for Desktop use の意味がよくわからんかったけど
ようするにPowerShellSSHServer.exeを起動させた時の
アカウント名とそのパスワードでしか認証接続できないってことみたいだな
それはともかく日本語表示の設定誰か分かったら教えて、ターミナルはなんでもいいから
基本的なことを教えてください Windows 7 に標準でインストールされるPSバージョンは2.0ということで、 じっさい $PSVersionTable でも2.0が確認できるのですが、 何でv1.0というシステムフォルダにインスコされてるのでしょーか? ずっとver1.0と思ってた・・・orz XPは同じフォルダで1.0しかインスコされないし。 ここらへんの経緯をどなたかご教示ください
拡張子の.ps1同様、フォルダ変えるほどの差がない ただの上書きバージョンアップ版って認識なんじゃねーの 知らんけど
元はps1 v1.0 ps2 v2.0と分ける予定だったんだけど方針変更したんだろ
>>188 俺もインストールに失敗してんじゃないかとか微妙に気になってた
64bitになってもsystem32なんだし、気にするな。
ところでpowershell.exe -argsはどう使う?どうやってもエラーになるが
>>193 ちゃんとPowerShellから実行してる?
powershell -Command { echo $args[0] $args[-1] } -args @(1..10)
でできたよ
さんきゅうです
コマンドプロンプトのbatファイルくらいしか分からないへたれユーザーなんですが、 業務の定型フロー(簡単なもの)を自動化してみたくてPSに興味が出てきました。 で、ちょっと触ってみたんですが、.NETフレームワークとかオブジェクト指向的考え方に不慣れで戸惑っております・・・ こんな初心者向けに良い教本とかサイトとかありますでしょうか?
197 :
名無し~3.EXE :2010/05/25(火) 23:55:32 ID:RqU7Sdwv
サイトは知らんがWindows PowerShell実践システム管理ガイドは良書だと思う。 個人的にはウェブサイトよりは、良書を1回ナナメ読みをオススメするけどね。 .
198 :
名無し~3.EXE :2010/05/26(水) 00:04:59 ID:RqU7Sdwv
ADとかExchangeなんかの構成を自動化するニーズはあるんだけど・・・ 現実にはまだPowerShellだけで十分ではないんだよね まだまだVBScriptのほうがネットに乗ってるのが多いし手軽いのかも。
ありがとうございます。 現時点ではサーバー管理用途が多いんでしょうか。 PSは将来性が凄くありそうなので、どうせ学ぶならという気持ちもあるんですが、 自分みたいな初心者には、情報の多いVBの方が今の段階では良いのかもですね。 ご紹介頂いた本も探しつつ、VBも検討してみます。どうもでした!
>>197 どういうところが良書なの?
上級者向けの良書だったら俺みたいのは
手が出ないから詳細を聞きたい
WINDOW 7 64で使おうとしてるんですが IE 32bit版を非表示起動させるにはどうしたら書けばいいでしょうか?
202 :
名無し~3.EXE :2010/05/28(金) 15:48:48 ID:K9v1827P
相談にのってけろ・・・ 文字コードがeucのファイルを一括置換したいんのだけど、 powershellだとリダイレクト出力時にunicodeになってしまう・・・ out-fileコマンドレットを使うと、-encoding defaultにすると うまく行きそうでしたけど、改行コードが\r\nに勝手に変換されてしまう・・ どうしたらいいんだろ、
ファイル名に中カッコ([or])を含む場合、どうやって指定したらいいのん? [Test].txtというファイルがあるとして、Test-Path "[Test].txt"だとFalseが返ってくる。 ""や''でくくってもダメだし、[]を含ませるにはどう記述したらいいんでしょう? (Get-ChildItemで返されてきた場合なんかも含む)
>>204 -Path ではなく、 -LiteralPath を使う。
>>205 記述の仕方じゃなく、オプションだったのか orz
教えてもらったオプションで、期待通りの動作をしてくれました。
どうもありがd
207 :
名無し~3.EXE :2010/06/04(金) 19:36:49 ID:3xu9Ih61
すいません
wikiの
PS> $rssUrl = "
http://blogs.msdn.com/powershell/rss.aspx "
PS> $blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
PS> $blog.rss.channel.item | select title -first 8
を実行すると2行目で
値 "
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
略
" を型 "System.Xml.XmlDocument" に変換できません。エラー: "リモート サーバーがエラーを返しました: (503) サーバーを使用
できません"
発生場所 行:1 文字:62
+ $blog = [xml](new-object System.Net.WebClient).DownloadString <<<< ($rssUrl)
+ CategoryInfo : NotSpecified: (:) []、RuntimeException
+ FullyQualifiedErrorId : RuntimeException
て出てくるんですけど。
xmlとかは良く解らないんですが、解決法は有りませんか
208 :
名無し~3.EXE :2010/06/04(金) 23:04:08 ID:3xu9Ih61
自分で $a =[xml]"<aaa>ssss</aaa>" てやったらキャスト出来たから 元のが悪いのかな??
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" とかがなんでxmlにキャストできるんだよ
210 :
名無し~3.EXE :2010/06/05(土) 03:10:02 ID:YmnKnoMR
取得してる文字列がそもそもXML(RSS)じゃないってこと (XHTMLでも構文エラーがなければXMLとしてパースできるかもしれないが) 実際にそのURIにアクセスしてみなよ リダイレクトしてRSSに飛ぶから
212 :
名無し~3.EXE :2010/06/05(土) 18:52:31 ID:YmnKnoMR
之でいけたけど
$enc = [System.Text.Encoding]::GetEncoding("utf-8")
$rssurl="
http://headlines.yahoo.co.jp/rss/jct_dom.xml "
( [xml]$enc.getstring((New-Object system.net.WebClient).DownloadData($rssurl)) ).rss.channel.item | select title -first 8
title
-----
20代女性の6割が「猫背」 「外反母趾」や「むくみ」と関連(J-CASTニュース)
菅次期首相週明けに組閣 「反小沢色」強まる(J-CASTニュース)
FM最長寿番組「ジェットストリーム」 JALが「1社単独提供」断念(J-CASTニュース)
「相談して決めること多い」 菅代表歯切れの悪い記者会見(J-CASTニュース)
物議を醸す「ザ・コーヴ」 配給会社は「上映続行したい」(J-CASTニュース)
鳩山氏「子分に裏金」疑惑 民主代表の座カネで買う?(J-CASTニュース)
「小幅入れ替え」菅新内閣 サプライズは蓮舫議員?(J-CASTニュース)
次期首相有力の菅副総理 「イラ菅」へ戻る?「無心の境地」?(J-CASTニュース)
手間掛けさせやがって、糞wikiがww
powershellは早々に消すわw
213 :
名無し~3.EXE :2010/06/10(木) 22:55:10 ID:Mm67oFQ6
PowerShellは来年ぐらいに流行るとみた。
214 :
名無し~3.EXE :2010/06/11(金) 09:56:41 ID:Ik/gYtIn
すごいねみんな、こんなわけのわからんもんよく使えるね。 俺なんてパワーシェルで使ったコマンドなんてipconfig, ping, mstscぐらいだよ。
俺はバッチファイル書ける人を尊敬する あれは俺には難しすぎた・・・
バッチファイルって 自信ではバージョンチェックとかの機構が無いのに forとかの制御構造が、OS毎に違った気がする 嫌になった
想定する最低レベルの環境に合わせて書けばいいだけのこと。
拡張機能使ったところで、インチキパイプ、クォートなどの致命的な欠点は残ったままだし。
212ですが >powershellは早々に消すわw は無しにしてください。 つい粋がって虚勢を張ってしまいました。 とり合えず今は、エロブログの画像ダウンローダーを作ってます。
起動のたびに nal more.com less.exe を打つのが面倒 署名をつけて自動実行させるのはもっと面倒
powershell -NoExit "好きなコマンド" ってしといたショートカット作ればいいんじゃね
>>221 なるほど
"好きなコマンド" のところで cat して iex することで
ファイル読み込ませることにしました
powershellはコマンドライン用というよりはそれでソフトウェア作る用なんじゃないか 書き捨てで書き殴るには複雑すぎる
ウィンドウの幅を変えるために $Host.UI.RawUI.WindowSize をいじってもうまくいかなかったから、 しばらく mode.com を使っていたけれども 単に値型の罠で動いていなかっただけだったわ
# [string]::Join("`n", @(cat C:\hoge\Init-PowerShell.ps1)) | iex sal more.com less.exe function width([int]$w=0){ if($w -le 0) { return $Host.UI.RawUI.WindowSize.Width; } $ws = $Host.UI.RawUI.WindowSize; $bs = $Host.UI.RawUI.BufferSize; $ws.Width = $w; $bs.Width = $w; if ( $w -gt $Host.UI.RawUI.BufferSize.Width) { $Host.UI.RawUI.BufferSize = $bs; $Host.UI.RawUI.WindowSize = $ws; } else { $Host.UI.RawUI.WindowSize = $ws; $Host.UI.RawUI.BufferSize = $bs; } } function height([int]$h=0){ if($h -le 0) { return $Host.UI.RawUI.WindowSize.Height; } $ws = $Host.UI.RawUI.WindowSize; $ws.Height = $h; $Host.UI.RawUI.WindowSize = $ws; } function title([string]$t="") { if($t -eq "") { return $Host.UI.RawUI.WindowTitle; } $Host.UI.RawUI.WindowTitle = $t; }
コマンドラインから改行がうまく渡す方法が分からないなあ とりあえず Environment.NewLine で逃げてみるか powershell.exe -NoExit -Command "[string]::Join([Environment]::NewLine, @(cat C:\hoge\Init-PowerShell.ps1)) | iex"
cat で頑張らなくても [System.IO.File]::ReadAllText なんてのがあるのね powershell.exe -NoExit -Command "iex $([System.IO.File]::ReadAllText('C:\hoge\Init-PowerShell.ps1'))" 最初は cat hoge.ps1 |% { iex $_ } でやっていたせいでそれに引きずられちゃった
少々質問よろしいでしょうか。 古いファイルを指定したフォルダと日付から検索するスクリプトをpowershellで組もうとして、 そこにエラーメッセージを入れようとするとうまくいかないのですが誰かわかるでしょうか。 今手元にファイルをもってなく、直接打ち込んでいるのでスクリプト誤字はご容赦ください。 function f ([Strings]$a, [datetime]$b) { Get-ChildItem $a | ? {$_.CreationTime -le $b} } こんなかんじで作ったのですが、これにif文をいれて、アドレスと日時が入力されていないときに エラーが出るようにしよう、としたのですが… .countを使って、 function 以下略{ if( ($a.count + $b.count) -eq 2 ) {前述のスクリプト}else{ エラーメッセージ} } のようにすると、 if( ($a.count + $b.count) -eq 2 )が間違いだと思うのですがエラーメッセージしか返って来ません。 function f ( $args ) if ( $args,count -eq 2) とする場合、 前述のスクリプトの{$_.CreationTime -le $b}を{$_.CreationTime -le [Datetime]$arg[1]} とでもすればいいのでしょうが、 こうするとdatetime形式に$arg[1]が変換できない、のようなエラーを吐かれてしまいます。 自分の腕の未熟さはわかりましたので別の条件でエラーメッセージを出すことにしたのですが、 if( ($a.count + $b.count) -eq 2 ) や [datetime]$arg[1]などはどうして間違いなのかを教えていただきたいです。
>>228 [String"s"] とか $arg"s" に対して $arg[1] だったりは
打ち込み直したから間違えただけなのか
原本でも間違えてるからエラーになってるのか分からない
function f ( $args ) はおそらく自動変数の $args を
使おうとしてるんだろうとは思うけど
自動変数だから引数で使おうとしちゃ駄目だよ
あと、その変数に .count プロパティが有るかないか
あるとしたらどんな値を返すか位は見ておかないと。
それが終わったら ISE からヘルプ開いて
about_Functions_Advanced と
about_Functions_Advanced_Parameters の Mandatory 属性のところを読むといいと思うよ
>>229 ありがとうございました。
参考にしてもらいます。
誰に?
>>228 function f([Strings]$a, [datetime]$b){
if(!$a -or !$b){return "パラメータを的確に入力せよ"}
Get-ChildItem $a | ? {$_.CreationTime -le $b}
}
$list = get-content -path list.txt $now = get-date $list += $now set-content -path list.txt $list ファイルからテキストデータを取得して 一行追加して保存するというコードを書いたところ 改行されず行の末尾にどんどんデータが追加されていってしまいます。 不思議なことにエディタを使って手動で改行してやると 次の追加からはちゃんと改行が挿入されます。 テキストファイルと文字列配列の相互変換というのはどうやるのが正しいんでしょうか。 add-contentを使うやり方はうまくいきましたが それとは別に一旦メモリにロードして書き戻す 正しいやり方が知りたいです。
>>234 Get-Dateの結果は「文字列」じゃないですよ。
Get-Date なんてあったのか UNIX と合わせて date のエイリアスを振っといてもらわんと存在に気付かんよ まったく [DateTime]::Now とかしていた俺って
date で呼び出せるがな実際
cmd.exe なら date があるけれども powershell に date ってある? gcm date としても GnuWin32 の date.exe しか出てこない
http://kazemati.blogspot.com/2008/10/powershellexcel.html ここを参考にして、
$sheet.Cells.Item(1,1).Text
の行を
for each ($i in (1...5) {$sheet.cells.Item($i,1).text}
と書き換えて
エクセルファイルのA1〜A5を表示させることに成功したのですが、
さらにここにifや?を組み込んで特定の文字列が含まれる場合のみ表示、としたいのですが
その場合はどうすればよいでしょうか?
.textがどういうものなのかも検索してもよくわからなく、どうすればよいのか…
>>238 date って打ち込んで試せば分かることですがな
前スレでも話題になってた気がする
PS> function get-bakeratta { "バケラッタ" }
PS> bakeratta
バケラッタ
>>239 何が分からないのか良く分からないけど
文字列の比較の仕方が分からないなら
ヘルプの about_Comparison_Operators 見るといいよ
>>240 date.exe が邪魔してるよおおおお
PS C:\> get-date; date
2010年6月24日 22:31:41
木 6 24 22:31:41 Tokyo Standard Time 2010
>>241 うちの環境では普通にget-dateとして機能するなあ
PowerShell 2.0 / Windows 7 x64
PS C:\> get-date; date; date -displayhint time; (date).AddHours(12)
2010年6月24日 22:58:40
2010年6月24日 22:58:41
22:58:41
2010年6月25日 10:58:41
>>242 >240のは動くんだけれどもPATHの通っているところに date.exe があるから
date を入力しても Get-Date にならずに date.exe になってしまうのよ。
PS C:\> function get-explorer{"explorer"}
PS C:\> explorer
とやると get-explorer 関数が呼ばれずに Explorer が起動しちゃう。
なるほど、
>>238 でいってるGnuWin32のdate.exeが入ってるからか
そうなるとPATHを一時的に消すか、エイリアス設定するしかないんじゃね
PS C:\Users\ise> function get-explorer{"エクスプローラー"}
PS C:\Users\ise> set-alias explorer get-explorer
PS C:\Users\ise> explorer
エクスプローラー
うお、ユーザー名orz
別に困ってるわけではなさそうだし今のままでいい悪寒 デフォルトの環境だと date は Get-Date として機能するっだけての話しだし
247 :
名無し~3.EXE :2010/06/25(金) 00:17:05 ID:Lav4+jgv
暇なんでaboutとコマンドレットをhtml化するのを作ってみますた。 index.htmlのおまけ付きです。 pspのブラウザーで見ながら出きるので便利です。 $dna ="about_html" $dnc ="Cmdlet_html" new-item -name $dna -type directory | out-null foreach ($a in (Get-ChildItem -path "$pshome/ja" | ? { $_.name -like "about*"})){ $base = ((Get-ChildItem "$pshome/ja/$a").OpenText()).Readtoend() $base = "<pre>" + (($base.Replace("<","<")).Replace(">",">")) + "</pre>" convertTo-Html -body $base -Title $a.name > ($dna+"/"+$a.name+".html") $ind = $ind + "<A href=`""+$a+".html"+"`" >"+$a.name+"</A><br>" } convertTo-Html -body $ind -Title "about_index" > ($dna+"/index.html") $base = "";$ind = "" new-item -name $dnc -type directory | out-null foreach ($a in (Get-Command -CommandType Cmdlet)){ $base = Get-Help $a.name -full | out-string $base = "<pre>" + (($base.Replace("<","<")).Replace(">",">")) + "</pre>" convertTo-Html -body $base -Title $a.name > ($dnc+"/"+$a.name+".html") $ind = $ind + "<A href=`""+$a+".html"+"`" >"+$a.name+"</A><br>" } convertTo-Html -body $ind -Title "Cmdlet_index" > ($dnc+"/index.html")
248 :
名無し~3.EXE :2010/06/25(金) 00:22:14 ID:Lav4+jgv
すいません $base.Replace("<","<")).Replace(">",">") ↑のリプレスの二番目の引数はそれぞれ <は&lt; >は&gt; です。 ごめんちゃい
iseさん…
PowerShell ISE さん さすがだ
Get-Location と [System.IO.Directory]::GetCurrentDirectory() は、 値違うんですね。 と言うか、PowerShellで Set-Location しても、 System.IO.Directory で管理しているカレントディレクトリは変更しない、 と言うべきかな。 IO.StreamWriter 調べていて気がついた、です。
>>252 リネームするために FileInfo#MoveTo 使ったら痛い目にあったことあり
VistaのWindows UpdateにPowershell 2.0が来てる
255 :
名無し~3.EXE :2010/07/06(火) 00:31:42 ID:kPA7wvIt
暇なんで、作ってみますた [void][Reflection.Assembly]::LoadWithPartialName("System.windows.forms") [void][Reflection.Assembly]::LoadWithPartialName("System.Runtime.InteropServices") function New-PType() { $assembly_name = New-Object Reflection.AssemblyName 'PInvokeAssembly' $dd_assembly = [AppDomain]::CurrentDomain.DefineDynamicAssembly($assembly_name, 'Run') $dd_module = $dd_assembly.DefineDynamicModule('PInvokeModule') return $dd_module.DefineType('PInvokeType', "Public,BeforeFieldInit") } function New-PMethod([string]$dllName, [Type]$returnType, [string]$methodName, [Type[]]$parameterTypes){ $ptype = New-PType $d_method = $ptype.DefineMethod($methodName, 'Public,HideBySig,Static,PinvokeImpl', $returnType, $parameterTypes) $constructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor([string]) $attrbute = New-Object Reflection.Emit.CustomAttributeBuilder $constructor, $dllName $d_method.SetCustomAttribute($attrbute) $type = $ptype.CreateType() $type = Add-Member -InputObject $type -MemberType NoteProperty -Name MethodName -Value $methodname -passthru $invoke = {return $this.InvokeMember($this.MethodName, 'Public,Static,InvokeMethod', $null, $null, $args[0])} Add-Member -InputObject $type -MemberType ScriptMethod -Name Invoke -Value $invoke return $type } $ptc = @' using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct POINT { public int x; public int y; } '@
256 :
名無し~3.EXE :2010/07/06(火) 00:32:35 ID:kPA7wvIt
続き Add-Type -TypeDefinition $ptc $WindowFromPoint = New-PMethod "user32.dll" ([Int32]) "WindowFromPoint" @([POINT]) $PostMessage = New-PMethod "user32.dll" ([Int32]) "PostMessage" @([Int32],[Int32],[Int32],[Int32]) $GetAncestor = New-PMethod "user32.dll" ([Int32]) "GetAncestor" @([Int32],[Int32]) $pt = New-Object POINT; $ptb = New-Object POINT while($true){ $pt.x= [System.Windows.Forms.Cursor]::Position.x $pt.y= [System.Windows.Forms.Cursor]::Position.y start-sleep -m 50 if(($pt.x -ne $ptb.x) -or ($pt.y -ne $ptb.y )){ $ptb.x=$pt.x; $ptb.y=$pt.y $hwd = $WindowFromPoint.Invoke([POINT]$ptb) $ohwd = $GetAncestor.Invoke(@([int32]$hwd ,[int32]3)) $t = Get-Process | ? { $_.MainWindowHandle -eq $ohwd} "x="+$ptb.x+":y="+$ptb.y+" ハンドル"+$hwd+" 親ハンドル"+$ohwd+": "+$t.MainWindowTitle #コントロールをクリック #$PostMessage.Invoke(@([int32]$hwd ,[int32]0x201,[int32]0,[int32]0)) | out-null #$PostMessage.Invoke(@([int32]$hwd ,[int32]0x202,[int32]0,[int32]0)) | out-null } }
テキストファイルの行数は.lengthで獲得できるけど
エクセルファイルで何列目の何行まで使っているか、はどうやれば獲得できるのかな
>>239 みてて思った
[Enum]::GetValues([IO.FileAttributes]) | select {$_},{[int]$_} は動くのに [Enum]::GetValues([IO.FileAttributes]) | select {$_},{[int]$_} | ogv が動かないのをなんとかしる select の引数をまじめに書く [Enum]::GetValues([IO.FileAttributes]) | select @{Name="Name";Expression={$_}},@{Name="Value";Expression={[int]$_}} | ogv は面倒だからやだ
$ie.document.parentWindow が null になるんだけどなんでだろう
>>258 Select-Object -Property の引数を PropertyPath の XAML 構文としてパースした場合エラーになるって言うのは
PowerShell の構文をどうにかしない限りどうしようも無いと思うが。
今回は↓で回避できるけど、Out-GridView 呼び出しまで含めてラッパ作っちゃった方が早いんじゃね。
[Enum]::GetValues([IO.FileAttributes]) | select {$_},{,([int]$_)} | ogv
>>260 エラーは出ないけれども ([int]$_) の値が表示されないよ
おお、表示できた 難易度高いわ
>難易度高いわ 難度高いわ
265 :
名無し~3.EXE :2010/07/16(金) 01:02:23 ID:nQrufqp5
>>86 とりあえず、はっときます
param($q)
[object[]]$url
if($q -eq $null){$q = "米 味噌"}
$ie = new-object -com internetexplorer.application
$ie.navigate("
http://google.co.jp ")
while($ie.busy){start-sleep -m 50}
while($ie.Document.readyState -ne "complete"){start-sleep -m 50}
$ied = $ie.document
@($ied.getElementsByName("q"))[0].value = $q
@($ied.getElementsByName("btnG"))[0].click()
while($ied.readyState -ne "complete"){start-sleep -m 50}
$doc = @(($ied.getElementById("res")).getElementsByTagName("OL"))[0].innerHTML
if( ($nav=$ied.getElementById("nav")) -ne $null){
$nav.getElementsByTagName("td") | % { if(($_.cellIndex -gt 1) `
-and ( $_.cellIndex -le (@($nav.getElementsByTagName("td")).length -2)) ){ $url += @($_.firstChild.href) }}
foreach($u in $url){
$ie.navigate($u)
while($ied.readyState -ne "complete"){start-sleep -m 50}
$doc = $doc + @(($ied.getElementById("res")).getElementsByTagName("OL"))[0].innerHTML
}
}
$doc = "<ol>"+$doc+"</ol>"
convertTo-Html -body $doc -Title "検索" > get2.html
$ied.write($doc)
$ie.visible = $true
266 :
名無し~3.EXE :2010/07/16(金) 01:05:45 ID:nQrufqp5
100件なら 検索おぷしょんで設定した方が早いような 藁
こっちは検索数バー所運
param($q)
#qcは検索数各自書き換えてください。
$qc = 50
if($q -eq $null){$q = "米 味噌"}
$ie = new-object -com internetexplorer.application
$ie.navigate("
http://google.co.jp ")
while($ie.busy){start-sleep -m 50}
while($ie.Document.readyState -ne "complete"){start-sleep -m 50}
$ied = $ie.document
@($ied.getElementsByName("q"))[0].value = $q
@($ied.getElementsByName("btnG"))[0].click()
while($ied.readyState -ne "complete"){start-sleep -m 50}
$qa = $ie.LocationURL
$doc = @(($ied.getElementById("res")).getElementsByTagName("OL"))[0].innerHTML
$iec = $ied.getElementById("nav")
$url = @($iec.getElementsByTagName("td"))[2].firstChild.href
if($qc -gt 10){
for($i=10;$i -lt $qc; $i += 10){
$ie.navigate($url.replace("start=10","start=$i"))
while($ied.readyState -ne "complete"){start-sleep -m 50}
$doc = $doc + @(($ied.getElementById("res")).getElementsByTagName("OL"))[0].innerHTML
}
}
$doc = "<ol>"+$doc+"</ol>"
convertTo-Html -body $doc -Title "検索" > get.html
$ied.write($doc)
$ie.visible = $true
タスクバーで点滅
268 :
名無し~3.EXE :2010/07/16(金) 19:58:08 ID:nQrufqp5
自分で対処してください
$ie.document.focus
"1" 個の引数を指定して "write" を呼び出し中に例外が発生しました: "種類が一致しません。"
>>271 前置きの文章の流れがつかみにくい・・・
「STAでは見えます。なので、MTAならSTAで起動し直します。」
程度に削っちゃった方が「以下のコードがそのサンプルですよ」ってことが分かりやすいんじゃないかと思う
最近日本語が不自由でプログラム言語でしかしゃべれない人が増えてるから仕方ない
日本語が相手にされてない
275 :
名無し~3.EXE :2010/07/23(金) 00:16:24 ID:1K/4j0hr
([System.AppDomain]::CurrentDomain.GetAssemblies())[2].gettypes()| ? {($_.namespace -like "*net*") -and ($_.basetype -like "*enum*") -and ($_.IsPublic -eq $true) } | %{@("##$_.name##")+([Enum]::GetValues((Invoke-Expression "[$_]")))} | select {$_},{,([int]$_)} | ogv なんか、ぱわーセルのパイプは面毒せーな〜
>>275 そんな丁寧に書かんでもいい気がするが、かえって見づらくない?
[AppDomain]::CurrentDomain.GetAssemblies()[2].gettypes() |
? { $_.namespace -like "*net*" -and $_.IsEnum -and $_.IsPublic } |
% { "##$_##"; $_.GetEnumValues()} | select {$_},{,([int]$_)} | ogv
()で括るのは、昔からの癖です
こんにちは、コマンドプロンプトでまともにUTF-8が利用できないため、 PowerShellに逃げてきたのですが、 同じような状態に陥っています。 UTF-8はやっぱり駄目ですかね やったこと ・PowerShellのプロンプトでchcp 65001 ・chcp 65001するとbatファイルが動かなくなる(Ruby win32のirbなどのbat経由のツールが動かない) 動かないというのはコマンドを入力して何も集力も入力もされずスルーされる感じです ・ruby -e "puts File.read('UTF-8.txt')" -Ku のようにUTF-8 BOMなし出力すると、 若干も化けで表示され以下のエラーが出る。こちらはRuby側の問題がありそう -e:1:in `write': Bad file descriptor (Errno::EBADF) from -e:1:in `puts' from -e:1 これらはPowerShellだから起こっているというより、cmd.exeでも全く同様なようです 挙動がコマンドプロンプトをかわらず残念な気持ちになっています。 対処法はありませんでしょうか?
>>278 perlだと内部的なunicodeに一度変換しないとダメだな
use Encode;
$umsg = Encode::decode('cp932',$_);
$omsg = Encode::encode('utf8',$umsg);
powershellからchcpしようが、cmd.exeが65001でファイル入力できないのは変わるはずがない
すみません 『PowerShell V2』ってどこからダウンロードできるのでしょうか?
>>281 今ならWindows Updateで入手できるだろ。
対話形式でないならISEでchcp実行して使うのが最善
UTF-8にすると、なにがよいのか? 嗜好?
286 :
名無し~3.EXE :2010/07/28(水) 22:55:46 ID:JFn2O9W3
2.0でなくて1.0が必要なんでないの?
再起動した?
powershellって流石にアプリケーション操作したり出来ないよね?
ファイルを読み込んで標準出力でバイナリダンプ表示するスクリプト教えてください。 1行16バイト、出来ればバイナリエディタみたいに16進とテキスト表示を両方出す。
DOMはIE以上に不完全なんだなぁ……frameworkの問題だけど
>>291 マルチバイト文字とかエラー処理とか全く考えないで適当に書くとこんな感じ
type hogehoge.txt -Encoding Byte -ReadCount 16 |
% { ( $_ | % { '{0:X2}' -f $_ } ) `
+ [Text.Encoding]::Default.GetString($_) -replace '\r|\n', '.'
-join " " }
294 :
291 :2010/08/24(火) 22:58:58 ID:Ofpa1iHQ
ありがとうございます。 これを元に改造していこうと思います。
295 :
名無し~3.EXE :2010/08/27(金) 01:08:41 ID:ibsmysIq
Win7 X64のアクセサリ内にあるPowerShellって x86ってついてる方がsyswow64のPowerShell.exeにリンクしてて、 何もない方がsystem32のPowerShell.exeにリンクしてるのはなぜ? 64ビットでもデフォは32bitはまだいいけどx86がなんで64bitの方にリンクしてんの?
>>295 syswow64 内のが 32 ビットで、system32 内のファイルは 64 ビット。
WOW64 のことを調べればわかる
>>275-276 のをいじくっていたら逆に長くなってしまった
([AppDomain]::CurrentDomain.GetAssemblies())[2].GetTypes()|
? {($_.Namespace -match "net") -and $_.IsEnum -and $_.IsPublic} |
% {[Enum]::GetValues($t) |
Add-Member NoteProperty xType $_ -PassThru |
Add-Member ScriptProperty xName {$this} -PassThru |
Add-Member ScriptProperty xValue {[int]$this} -PassThru} | select x* | ogv
なんで Add-Member にはエイリアスが設定されてないのかと
>>297 でなんか $t が残っていたので修正
([AppDomain]::CurrentDomain.GetAssemblies())[2].GetTypes()|
? {($_.Namespace -match "net") -and $_.IsEnum -and $_.IsPublic} |
% {[Enum]::GetValues($_) |
Add-Member NoteProperty xType $_ -PassThru |
Add-Member ScriptProperty xName {$this} -PassThru |
Add-Member ScriptProperty xValue {[int]$this} -PassThru} | select x* | ogv
Add-Member より New-Object のほうが楽かなあ
([AppDomain]::CurrentDomain.GetAssemblies())[2].GetTypes() |
? {($_.Namespace -match "net") -and $_.IsEnum -and $_.IsPublic} |
% {$t = $_; [Enum]::GetValues($t) |
% {New-Object PSObject -Property @{Type=$t;Name=$_;Value=([long]$_)}}
} | ogv
get-acl で以下のようなスクリプトを書きたいと思っています。 1.フォルダを巡回しながらACLを取得し、「親からの継承」を切っているフォルダや、新規に追加しているフォルダの、アクセス権一覧を出力 2.1のフォルダを出力したら、そのフォルダ以下は検索せず、次のフォルダへ 1のみであれば実現できそうなのですが、フォルダが膨大な数・階層なので、2のような条件を追加したいと思っています。get-childitem だと全部になってしまいますし・・・。 どなたかよい方法をおしえてください。
300 :
名無し~3.EXE :2010/09/01(水) 00:01:27 ID:HUjpQ/Im
アクセスコントロールの操作ってわかりずらいよなぁ
301 :
299 :2010/09/01(水) 20:31:55 ID:V5E+u7uh
>>299 自レスですが、
ttp://gallery.technet.microsoft.com/ScriptCenter/ja-jp/719bda46-6ce3-4783-b128-6224bd245467 を参考に、
「一つ上のフォルダとアクセス権が異なる場合、アクセス権を出力」
というのを考えて、以下のようにしてみました。
しかし、うまくいかず、全部のフォルダが表示されてしまいます。
なぜでしょうか?分かる方、教えてください。
$pattern_dir = $args;
$pat_sddl = (get-acl $pattern_dir).sddl
$root_dir = $args
$dirs = gci $root_dir -Recurse |? {$_.psiscontainer}
foreach ($dir in $dirs){
#一つ上のフォルダを取得
$pattern_dir = Split-Path $dir.fullname -Parent
$pat_sddl = (get-acl $pattern_dir).sddl
$dir_sddl = (Get-Acl $dir.fullname).sddl
if ($pat_sddl -ne $dir_sddl){
Get-Acl $dir.fullname |select-Object Path,AccessToString
}
}
302 :
名無し~3.EXE :2010/09/01(水) 22:00:20 ID:bz8iAwj0
すみません、New-Eventってスレッド(てかジョブですね)間通信に使えるんじゃね?と思って こんなソースを書いてみたんですがWait-Eventから帰ってきません。 なんかケアレスミスがあれば指摘頂きたいです。 それとも、イベントってスレッドローカルなんでしょうか。 Start-Job { Start-Sleep 5 New-Event "My.Command" } Wait-Event "My,Command" ls
>>302 Start-Job {
Start-Sleep 5
New-Event "My.Command"
}
Wait-Event "My.Command"
ls
おっとミスタイプ。状況は変わりませんでしたが。
304 :
名無し~3.EXE :2010/09/01(水) 22:22:03 ID:bjtJqVYt
イ`ヘ
/: :| ヽ
/ : :/ ヽ ___ _,,,:. .-: :´彡フ
_ノ\_∠: : : : : : : : :`: :-: :,:_:/彡 /
( : : : : : : : : : : : : : : `ゝ /
マ r::/: /: : | : : : : : : : : ::\ /
//: /: : : |: : | |: : |: _: : : :ヽ
ジ {/ 7|`\/i: /|:|/|´: : : : :|ヽ
〉 ,‐-‐、`|7 || |_::|,_|: : :|:::|: | 「Windows 7」が「Windows Vista」のシェアを抜く--7月のネット利用
で / r:oヽ` /.:oヽヽ: :|: | :|
http://japan.cnet.com/news/service/story/0,3800104747,20417818,00.htm { {o:::::::} {:::::0 }/: :|N
っ | ヾ:::ソ ヾ:::ソ /|: : |
!? ヽ::::ー-.. /ヽ ..ー-::: ヽ::| r--ッ
-tヽ/´|`::::::::::;/ `、 ::::::::::: /: i } >
::∧: : :|: |J \ / /::i: | /_ゝ
. \ヾ: |::|` - ,, ___`-´_ ,, - ´|: : :|:::|
ヽ: |::|\  ̄/ /| |: : :|: |
>>299 こんなんでどう?
----------------------
function isInherited([IO.DirectoryInfo]$directory)
{
((get-acl $directory.fullname).access | where { -not $_.IsInherited }) -eq $null
}
function getNotInheritedACLDirectory([IO.DirectoryInfo]$directory)
{
$inherited = @()
$notInherited = @()
$directory.GetDirectories() | foreach {
if (isInherited($_)) { $inherited += $_ } else { $notInherited += $_ }
$inherited | foreach { $notInherited += getNotInheritedACLDirectory($_) }
}
return $notInherited
}
getNotInheritedACLDirectory(".\foobar")
----------------------
306 :
299 :2010/09/02(木) 00:30:35 ID:d1TkZZlw
>>305 レスありがとうございました!
分からない部分がたくさありますが、継承しているかどうか見て、再帰呼び出ししている感じでしょうか。
とても参考になります。明日、さっそく試してみます。
ちなみに、継承を切らずに、アクセス権を新規追加している場合もこれでいけますかね?
307 :
291 :2010/09/02(木) 05:32:25 ID:xAgNkDGN
Powershell上から使えるファイラーってないですかね。 FDやFILMTNみたいなの。
>>303 結論。
バックグラウンドジョブは別プロセス空間?みたいですね。
手軽な双方向のプロセス間通信の手段が入れば嬉しいですね。
>>299 動かしてみたらバグってた
これが正しい
----------------------
function isInherited([IO.DirectoryInfo]$directory)
{
((get-acl $directory.fullname).access | where { -not $_.IsInherited }) -eq $null
}
function getNotInheritedACLDirectory([IO.DirectoryInfo]$directory)
{
$inherited = @()
$notInherited = @()
$directory.GetDirectories() | foreach {
if (isInherited($_)) { $inherited += $_ } else { $notInherited += $_ }
}
$inherited | foreach { $notInherited += getNotInheritedACLDirectory($_) }
return $notInherited
}
getNotInheritedACLDirectory(".\foobar")
----------------------
311 :
299 :2010/09/04(土) 16:46:17 ID:5kPJ6yEO
>>310 ありがとうございます!
実は試してみてうまくいかない部分があったので、悩んでました。
最初のforeach文の外に出しただけなんですね。それで何度も同じディレクトリが表示されていたのか!
再度トライしてみます。
継承していないのを見つけることを ファイルだけでなくレジストリでも 同一コードで動くようにしたらおもしろいかも
タスクトレイのアイコンを右クリック -> コンテキストメニューの項目を選択 上の操作を PowerShell で一括して実行するにはどうすれば良いのでしょうか
WASP使えば出来るかもね
315 :
313 :2010/09/19(日) 12:14:04 ID:bsJmLY3g
>>314 有り難う御座います
WASP を調べていたところ keybd_event() を使えば良いらしいということがわかりました
そこで以下のようなスクリプトを保存して実行したのですが
右クリック ( [Shift] + [F10] ) が実行される時点でのマウス位置で、コンテキストメニューが開いてしまいます
実際に以下のようなキー入力をすると上手くいくのですが、 PowerShell ではどうすれば同じキー操作が出来るのでしょうか
316 :
313 :2010/09/19(日) 12:16:13 ID:bsJmLY3g
# <
http://d.hatena.ne.jp/ps1/20080312/1205339720 > の New-PMethod 関数を使用
# Win32 API の keybd_event()
$keybd_event = New-PMethod 'user32.dll' ([Void]) 'keybd_event' @([Byte], [Byte], [UInt32], [Int64]); # [Int64]←ULONG_PTR(64bitOSの場合)
Set-Variable KEYEVENTF_EXTENDEDKEY -value 0x1 -option constant;
Set-Variable KEYEVENTF_KEYUP -value 0x2 -option constant;
Set-Variable VK_LSHIFT -value 0xA0 -option constant; # 左の [Shift]
Set-Variable VK_LWIN -value 0x5B -option constant; # 左の Windows キー
Set-Variable VK_F10 -value 0x79 -option constant; # [F10]
Set-Variable VK_RIGHT -value 0x27 -option constant; # [→]
Set-Variable B -value 0x42 -option constant; # [B]
Set-Variable E -value 0x45 -option constant; # [E]
# タスクトレイへ ( Windows キー + [B] )
$keybd_event.Invoke($VK_LWIN, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($B, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($B, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
$keybd_event.Invoke($VK_LWIN, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
# アイコンを選択 ( [→] )
$keybd_event.Invoke($VK_LSHIFT, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($VK_LSHIFT, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
# 右クリック ( [Shift] + [F10] )
$keybd_event.Invoke($VK_RIGHT, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($VK_F10, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($VK_RIGHT, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
$keybd_event.Invoke($VK_F10, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
# 項目を選択 ( [E] )
$keybd_event.Invoke($VK_LSHIFT, 0x45, $KEYEVENTF_EXTENDEDKEY, 0);
$keybd_event.Invoke($VK_LSHIFT, 0x45, ($KEYEVENTF_EXTENDEDKEY -bor $KEYEVENTF_KEYUP), 0);
unchecked のキャストってどうやるの? [uint32]0xFFFFFFFF を実行すると [uint32]::MaxValue と同じ値になるように
うぉ、確かにそいつはできなかった……
Windows7 64bitで以下のスクリプトを実行するとIE8 64bitが起動します。
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Navigate("
http://www.google.co.jp/ ")
$ie.Visible = $true
これをIE8 32bitで起動させたいのですが、どうすればいいでしょうか?
32bitのpowershellから実行
>>320 できました。
ありがとうございます。感謝です。
>>317 例外捕まえて自前で変換するしかないんじゃない?
$i = -1
try { [UInt32]$i } catch [System.Management.Automation.PSInvalidCastException] {
$s = [Convert]::ToString($i,16)
[Convert]::ToUInt32($s,16)
}
変換の仕方は色々あるだろうけども。
ついに Jeffrey が Windows Server の偉い人か・・・
値型もnullの状態で定義できたんだね
ttp://www.vistax64.com/powershell/93669-solved-nullable-types-powershell.html [System.Nullable``1[[System.Int32]]] $foo = $null
$foo = date
値 "2010/10/19 21:48:19" を型 "System.Int32" に変換できません。エラー: "'DateTime' から 'Int32' への無効なキャストです
。"
発生場所 行:1 文字:5
+ $foo <<<< = date
+ CategoryInfo : MetadataError: (:) []、ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
>>324 ああ、しかし、Null PropagationはPowershellでは使えない。
> [System.Nullable``1[[System.Int32]]] $foo = $null
> $foo + 1
1
Nullable型で値がnullな変数を含む計算はnullにならねばならんのに……
>>325 PowerShellの性質から言えば問題としては小さい方なんじゃないかな
引数の型がなんでもデフォルトで$nullに初期化されることに嵌る人はいそうだけど
PS > function a ($a) { $a }
PS > a -eq $null
True
PS > function a ([int]$a) { $a }
PS > a
0
>>325 PS > [int]$null
0
勝手にキャストされちゃってるよかん
>>326 int は構造体で null にはならないから 0 初期化
>>327 そだよ。だから if ($a -eq 0) { ... } なんてコードが入っていて
作者が$aは値を渡さない限り存在しないとか、$nullが入っていると期待すると嵌る。
Get-Content '.\foobar.txt' | .\example.exe 以上のパイプラインでは、読み込んだ文字列が Unicode で example.exe に渡されますが これを Shift_JIS で渡すにはどうすれば良いのでしょうか foobar.txt の文字コードは Shift_JIS です
シンボリックリンク(mklink)に相当するコマンドってありますか?
>>331 それ読むと余計に混乱すると思うがw
今回の場合は後者の説明だけ見とけばいい
>>330 ないアルよ
333 :
329 :2010/10/23(土) 14:07:28 ID:MPOjmpsa
>>331-332 どうも有り難う御座います。以下の文を付け足して上手くいきました
$OutputEncoding = [System.Text.Encoding]::GetEncoding('Shift_JIS');
334 :
330 :2010/10/23(土) 18:54:10 ID:QvURduIi
>>334 New-Itemか何かで一元化したいなら、
適当にラッパを書けばいいんじゃないかしら
2.0から$PSBoundParameterでそういうこと楽になったし
単に外部コマンド使いたくないってことなら理解しかねるけど
$PSBoundParametersを使った例は、例えばこんな感じ
function New-ItemEx {
[CmdletBinding(...)] # ***
param(...) # ***
if ( $ItemType -eq "Symboliclink" ) { mklink ... }
else { NewItem @PSBoundParameters }
}
*** の2行は、New-Itemの引数の定義をそっくりそのまま持って来るんだけど、↓で簡単に取得できる
$md = new-object System.Management.Automation.CommandMetadata (get-command New-Item)
[System.Management.Automation.ProxyCommand]::Create($md)
$PSBoundParameterはハッシュテーブル型の自動変数で、呼び出された時の関数の引数とその値がセットされる
@演算子はハッシュテーブル(を入れた変数)をコマンドの引数:値の形に展開してコマンドに渡す
詳しくは↓辺りを参考に
ttp://blogs.msdn.com/b/powershell/archive/2009/03/13/dir-a-d.aspx 引数のセットを簡単にパススルーできるから、コマンドレットの機能を拡張したい時に便利
ということは誰も聞いちゃいないよね
337 :
330 :2010/10/24(日) 07:53:06 ID:m2Laz9J2
家のPCで、チマチマした環境設定時にPowerShell使ってるレベルです。
やってるのはDosでも出来る内容ですが、PowerShellで出来た方が先々利用範囲も広かるカナ?・・と。
自分のレベルだと
>>336 を理解出来るまで10万年位掛かりそうですが、外部コマンドを気長に調べてみます。
>>335 様アリガトんです。
>>337 すでにmklinkがある状況でPowerShellでできるようにするメリットがあんまりね
>>336 はなるもんはなるって思っておけば大して難しくはないよ
>>330 じゃないんですが、シンボリックリンクやジャンクションを簡単に見分ける方法ないですか?
cmd.exeのdirだと<JUNCTION>とか出るんでgrepでもかければいいんですが、
Get-ChildItemだとでないよウワァアアアン!!!
>>337 俺も同じレベルでワロタww
Attributesプロパティで見れるだろ(ReparsePoint) シンボリックリンクとジャンクションの見分けは知らんが
スクリーンセーバー起動中なら何もせずに抜けたいんですが 判定方法教えてください。
>>341 試してないから動くかしらんが
tp://rararahp.cool.ne.jp/cgi-bin/lng/dotnet/dotnetlng.cgi?print+200609/06090013.txt
会社じゃOSに最初から入っている物しか使えないからwindows7が普及するまで使えないなー
うちの会社は俺が使用申請(というほどのものじゃないが)したらいつの間にか他のPCでも使えるようになってた 大変重宝させてもらっております
PowerShellってとにかく情報量が少なすぎる どこから手を付ければいいかわからない 丁寧な入門サイトでも作れば寝てても金入ってくるようになるだろうな
346 :
名無し~3.EXE :2010/10/30(土) 22:06:30 ID:QEBlTJh4
get-helpがあるじゃないの
入門的な情報ならそれこそヘルプファイル見ればいいだろって思うが せっかく2.0からchm形式でまとめられてるんだし
ヘルプってのはある程度分かっている人がちょっと確認するためのもの。 「○○するには」形式で自然とPowerShellの仕様を学んでいけるようなものがあるといいな。
○○の部分を英語にしてGet-CommandでOK
>>347 chmになってヘルプに関してはようやくまともになったね。
manとかget-helpなんて使う気になれない。
でもこれは入門書としては使えない。あくまでリファレンス。
改めてISEに付いてるヘルプ見返してみたけど
初めてやる人にこれ見ておぼえろってのは酷なものがある。
>>349 全然OKじゃない。
351 :
名無し~3.EXE :2010/10/31(日) 00:35:20 ID:Zwsqz6fj
get-help aboutとかやってみてよ。それでもわからんならしらんわ
チュートリアル的な部分は、現状で十分揃ってると思うけど(それこそ「○○するには系」の部分) 検索の仕方が悪いんじゃないか? 俺はコマンドプロンプトくらいしか使ってなかったけど、 1.0リリース当時でも「DirectX使ったゲームの作り方が何処にもねぇぞゴルァ」ってくらいだった そういう風にPowerShellのそもそもの用途を勘違いしてなければ、今なら情報少ないってこたない
C/C++より習得困難です 情報の質も量もありません
>>351 だから何度も言われているようにヘルプは入門書にはならないのよ。
こんなテキストだけの情報ずらずら出されて読む気になるわけ無い。
>>352 情報があるだけじゃだめ。
検索の仕方が悪いとかそういう言い訳しなきゃいけないってことは入門者には使えないって事。
文章を読みやすく、読む気にさせるには適度に図を入れるのが効果的だけど
所詮ヘルプだからそういうものもない。
きっちり学ぶなら書籍のインアクションがいいんだろうけどヘビーすぎる・・・
で?
俺はコマンドラインをほとんど使わなかったけど、 bashをちょっといじったらPowerShellも使えるようになったぞ。
>入門者 >bashをちょっといじったら 前提が違うから話がかみ合うわけがねーなw
よし、次期OSのWindows8からはDosは無くそう。 素人も玄人もPowerShellオンリーで!
>>359 プログラミング自体全く知らない人にはそれは難易度高すぎ。
プログラミングを多少かじったことある人向けの「Powershellの」入門ページだよそれは。
このレベルの入門ページならいくつもあるけど
「こういうことがしたい」をスラスラ実現できるレベルになれるページが無いんだよね。
>>360 PowerShellの想定ユーザー(プログラマ)層って、
主にサーバー管理者じゃないの?
初体験には向いていないんじゃないかな。
例えば、オブジェクトパイプは強力なので、
オブジェクトパイプ前提でプログラムしちゃうけど、
他の言語へは応用利かないし。
>>360 インストール方法しか書いてない記事の難易度高過ぎってのは、単にやる気がないだけ。
>「こういうことがしたい」をスラスラ実現できるレベルになれるページが無いんだよね。
具体例にどういうものを指しているの?
なんでも自分で試行錯誤しようとしない限り習得なんて無理だよ。
「〜したいとき、〜するには」集ってのは、それこそ単なるリファレンスに過ぎない。
>>361 言語仕様が複雑で初体験には向いていないと思う。
ただ
>>360 は
>>359 の記事が"プログラミング自体全く知らない人向け"って事への突っ込みだと思う。
本当の入門として見ると端折りすぎて使えない。
>>362 典型的な駄目人間。
やる気がないとか分からない方が悪いとか言って逃げるのは簡単。
分からない分からないと言うだけで、 何が分からないのかも言わない奴が人を駄目人間呼ばわりとは。
>分からない分からないと言うだけで、何が分からないのかも言わない これはこれで正しい。 それを引き出すのが役目なのに仕事放棄したら駄目人間って言われても仕方ない。
>>363 ,365
そりゃ受身の、自分から習得しようとする気のない人向けの入門なんて、義務教育以外ではそうそうないさ
(読んでるうちに意欲を持つようにメリットを伝えているものはあるかも知れんが)
そんなものをPowerShellやウェブ記事に求めるのはお門違い
# まあ仕事でそういう状況になった人の場合、それでも自分の分からないところを
# 相手(上司)に説明する義務があるから、大変だとは思うけどね
# やる気ないんだから何処が分からないのかも分からないだろうし
しかしつまらん流れだな
# ←使えない上司の見本
田中、こんなスレ見てないで仕事しろ
でも実際こんなの使って何やってるのか興味はあるね 2,3バッチ処理組んだらもうあまりやることがなくなるから勉強にならない
確かにWindowsのコマンドプロンプトやバッチファイル、 Unix系シェルやシェルスクリプトみたいなのに比べると チュートリアルや逆引きがイマイチな感はある
コマンドレットで用意されてないのは.NETフレームワークを直接使えるってところがポイントだから 逆引き的な物を求めると、PowerShell自体よりも.NETのライブラリの説明の方が多くなってしまう。 プログラマーの書いてるブログなんかだと、.NETフレームワークの知識は当たり前ってスタンスが多いから そこで引っかかる人はいるかもね。
Hello worldから始めるとかそういう説明がほしい
つ Google
>>375 変数とは箱ですよとか、そういうレベルの話?
>>375 でもHello worldなんて、
'Hello world'
だけじゃん。
ダイアログで表示してみそ
質問もネタがないなら無理して書き込まなくていいんだよ
'Hello world' | ogv
最近PowerShell 2.0を使い始めましたが、ちょっと困っています。
chmやmanコマンドは例文も載っているしすごく便利でさすがMicrosoftだといたく感銘をうけているのですが、
PowerShell ISEでのmanやchmの表示だとテキストが折り返されず、
近年稀に見る横方向へのスクロールを頻繁に要求されます。
なんとか折り返しする方法ないもんでしょうか?
>>381 初めて知ったすごい
将来的にcomspecがPSに置き換わるみたいな発言ってMSからされてる?
みてみたけどほんとだな 左ペイン非表示でちょうどになるような固定折り返し 開発者はどんだけ広いモニター使ってるんだw
>>384 公式だと見やすいですね・・・。
あとはインスタントな検索さえ何とかなれば
>>384-385 本当だ。chmはソース見たら一部にpre入ってますね。
preが入っている箇所があるせいでスクロールバーはあるけれど、折り返しされていない箇所もある。
構文と例やabout_がpreになっているみたいですね。
Microsoftのどこに報告したら直してもらえるんだろ。
コマンドラインだと折り返されるけど、ISEだと折り返されないので使い分けが入りますね。
unix使うことがあるせいかわからないときに、ふとmanしてしまうクセがあって
ISEだと折り返されてなくてがっかりみたいな状況でした
manしたら
>>384 に検索投げればいいのかな
> unix使うことがあるせいかわからないときに、ふとmanしてしまうクセがあって unix使うことがあるせいか、わからないときにふとmanしてしまうクセがあって 訂正
>>377 そういうレベルの話も必要な気がする
それ以前にまずシェルとして使う話のほうが要るか
>>371 俺は鯖缶ではないけれど、こういうことをやっている:
・株のシステムトレード
・WWWその他のネットワークの調査
・テキストファイルの検索
・ファイルの整理整頓
・XML→HTML変換
>>391 >・テキストファイルの検索
>・ファイルの整理整頓
>・XML→HTML変換
ここら辺ちょっとkwsk
>>392 テキストファイル検索は単にGet-Content、%を使って、各行が正規表現にマッチするかどうか
調べているだけ。マッチしている行を抜き出したり、マッチしない行を削除したりとかやる。
ファイルの整理整頓は、まぁ、(dir -r | sort lastwritetime)[0]を消したりとか。ただ、dir -rは
重すぎるので、今はいくつかのプロパティを端折ったIo.FileInfoの配列を取得するようにしてる。
XML変換は汎用性の高いものじゃなくて、CLIXMLファイルからオブジェクトを読み込んで、
文字列などを<table>タグと一緒に結合して、HTMLにするだけ。
394 :
名無し~3.EXE :2010/11/10(水) 23:47:25 ID:J6PGHoMb
MSはさっさとコマンドベースのエディタ標準でよういしろよ できればvi系統望むけどね
それはEDLINがあるじゃない
数式以外でも TeX っぽく使える Word を用意してくれよ ランポートもいるんだしさあ
>>396 オライリー本の原稿がasciidocで書かれてていてそこからdocbookに整形してあれこれやっていたりするし、
数式は外部プログラムと連携してなんとかするとして、レイアウトを割り切ればいけるんだけどねえ・・・
ふむ。
ちょ〜久しぶりにXPのWindows UpdateかけたらPowerShell 2.0が選択できるようになってた。 マジオススメ。
何を今更
402 :
名無し~3.EXE :2010/11/18(木) 22:10:43 ID:GgFULFC7
強制的にインストールしてほしい。無理か
#ffmpeg.exeを使って動画のフレームサイズを取得してみた。 param([string]$FilePath) if(!(Test-Path $FilePath)){return "Error"} $FrameSize = ((.\ffmpeg.exe -i $FilePath 2>&1)[1].tostring().split("`n") | ?{$_ -match "Stream.*Video\:"}).split(" ") | ?{$_ -match "\d+x\d+"} $FrameSize
404 :
名無し~3.EXE :2010/11/26(金) 01:22:18 ID:1QRnQp7f
パイプラインで Get-Child | &{process{$_}} みたいにスクリプトブロックを使おうとしたら(この処理自体に意味はない) ・$_はprocessブロック内で使う ・呼び出し演算子(&)が必要 なのに対し、 Get-Child | Join-Path C:\hoge -ChildPath {$_} のようにパラメーターにたいしてスクリプトブロックを使うと、 ・$_を使うのにprocessブロック必要なし ・呼び出し演算子は不要。 ・(-ChildPathはstirng型を受け取るけどなぜかスクリプトブロックを放り込める) といった違いがあるんですが、パラメーター用のスクリプトブロックと普通のでは 扱いが異なるんでしょうか?そこらへんの解説が見当たらなくてモヤモヤしてます。
get-content a.txt|set-content a.txt で空にならないようにするには?
古典的な方法だが、一旦別のファイルに退避 Windowsが持ってるtempフォルダ辺りなら、どうせ後々ディスククリーンアップで消されるし問題ないかな、と思う
>>405 カレントドライブがC:\だとして、
${C:a.txt} = cat a.txt
という書き方はできる
(PowerShellの場合ドライブ名の後の\を省略するとカレントドライブ上のカレントディレクトリを指す)
>>407 scriptblock型以外を受け取るパラメーターにスクリプトブロックを与えると、
実行した戻り値をパラメーターに与えてくれる動作のようですね。
当初不思議に感じましたが、このほうが便利だとは思います。
iseのhelpだけ直接開けない?
>>410 Process Explorerで調べたが別プロセスじゃないなこれ
2.0対応の連載記事マダー
import-csvの入力csvにheaderは必須なのか
ruby -x "%~0" goto :eof #!ruby puts "hello" みたいにバッチとpsを混在させる技ってないですか? -commandだといろいろしんどい。
powershell2cmd
おーいー、今度こそin Action SE発売かと思ったらまた2月に延期かよwwww
@more +1 %0 | powershell -command - & goto :eof
powershell -file .\hoge.ps1 はerrorlevel変えるが、 powershell -command .\hoge.ps1 はerrorlevel 1固定? なんで?
基本スクリプト内のexitはスクリプトを終了させるだけなので、 終了コードを受け取るのは呼び出したpowershell自身 だから -command の場合は明示的に exit $LASTEXITCODE と付け加えないと powershell.exeを呼び出した側には終了コードが渡らない -File の場合は指定したスクリプトしか実行しないから、 直接powershell.exeを呼び出した側に終了コードを渡すようにしたんだと思う その方が都合がいいとは思うけど、内部でどういう仕組みなのかは知らね powershell -command "iex (type.\hoge.ps1)" の糖衣構文だとでも思っておけばいいんでないか
v1のexitにexitcodeがなくて-commandにもなかった v2で追加して、追加の-fileで使った んじゃね
んなこたーない びっくりしてv1入れて確認しちゃったじゃないか
わざわざ0以外を丸めて1にしてるみたいだにゃ
ほんとだ、-command で最後に実行したスクリプトの終了コードに反応してはいるみたい
空のディレクトリを調べたいのですが、
Windows PowerShell Tip: Finding All the Empty Folders in a Directory Tree
http://technet.microsoft.com/en-us/library/ff730953.aspx このページのMicrosoftのTechNetのページのTipsの方法では
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
のGetFiles()がディレクトリを含めないため、ディレクトリのみを含むディレクトリも空とみなされてしまいます。
(gci C:\Scripts -r -fo | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0 -and $_.GetDirectories().Count } | select FullName
このようにディレクトリ数も数えたところ今のところ上手く行っているようなのですが
TechNetの記述がおかしいのはともかく、もっと簡単に空かどうか調べられる方法があれば、と思った次第です。
該当のクラスはSystem.IO.DirectoryInfoのようですが、
意図的にはGetFilesはFileInfoのみの列挙、GetDirectoriesはDirectoryInfoのみの列挙なのだろうとは思いますが・・・
DirectoryInfo Class (System.IO)
http://msdn.microsoft.com/en-us/library/8s2fzb02 (v=VS.85).aspx
>>424 gci C:\Scripts -r -fo|?{$_.PSIsContainer}|?{!(gci $_)}
とか?
>>425 ファイルシステムの制限を超えたことはできないよ。
428 :
名無し~3.EXE :2010/12/15(水) 20:11:34 ID:4HSayuWm
スクリプトファイルをiseで実行して閉じるってどうやる?
429 :
424 :2010/12/16(木) 01:18:26 ID:TEM/+BiA
ありがとうございます。
>>424 のselect FullNameですが、画面に出したりテキストに出力するなどすると途切れてしまうようなので、
| % { $_.FullName } でフルに出力するといけるようでした。
selectにフル表示のオプションがあるのかも知れないですが、
エラーも出ないので気づかないとこちらもはまりますね。
それよりももっと長いパスでは
>>425 のエラーがどうしてもでるので、
どうにも試して上手くいかなかったためcygwinでfindで処理したらパスが長くてもあっさりいけてしまいました、、、
find 'D:/' -type d -empty
この後の処理もできれば(cygpath -w などでWindowsのパスに変換して)PowerShellでやりたかったのですが、
長いパスが処理できないようなのでcygwin上で処理しました。
PowerShell自身はオブジェクトのままパイプ通したり扱えるし、スクリプト言語のようにも使えるし
使えると思っていたのですが、いざというときにちょっとした制約があるものですね。
使い分けが肝心ということで、、
>>428 良く意味がわからん。
スクリプトファイルの実行が終了したら、そのファイルが開かれたままってことはないだろう。というか、
実行前にファイルは全部読みこまれるので、実行前に既にファイルは閉じられている。
うむ。
多分 powershell.exe の -File オプションのようなものはないかってことを聞きたかったんだと思うよ
434 :
名無し~3.EXE :2010/12/30(木) 19:56:05 ID:OrIrurlj
ExcelのVBAを廃止してExcel PowerShellにしてほしい。
PowerShell良いんだけど スクリプトファイルの実行に、管理者権限で設定変更必須なのがちょっとなあ。 会社のPCが、WinServer2008R2 (リモートデスクトップ) になったんだけど Set-ExecutionPolicyが許可されないから、結局WSH使ってるorz
ps1の実行には必要でもps1を読んで実行する分には必要ない
そりゃそうなんだが、タスクスケジューラに登録して色々やりたい時とかはちょっと。
ファイルの中身を読んで iex するためのコマンドを powershell.exe の引数に設定するんだ
>>434 そんなもん要らんからとっとと.NETに統合して欲しいわ
〜すれば出来るとかじゃなく 自分で書いて自分で実行するときくらいは デフォルトでさくっとやらせろよというのはもっともな意見だな VistaのUACも7で改善されたようにちょっとは緩めてもいいんじゃないかね
悪意の有るスクリプトファイルを実行してしまう事が無い様に、って配慮は理解出来なくも無いんだが 結局.jsや.vbsはそのまま実行されてしまうので、何だかなあという感じはする。 WSHを廃止する訳でも無いし、.ps1だけ防いでもなー。
WSHは将来廃止するんでしょ。 とはいっても結構WSH使ってるところ多そうだよな
JScriptやVBScriptどころか、未だにバッチファイルも使えるからなあ
446 :
sage :2011/01/11(火) 12:11:27 ID:AySeXxV9
outlookで特定のフォルダ(自作した)って、どうやって取得すればいい?
>>442 意図しないスクリプトが動くのはUACでは防げないからね
Windows自身が重要だと思っているところを変更しようとするものは防げるみたいだけど
Google Chromeなんて、ユーザーの領域にインストールするじゃないか
その用途なら統合的なAntiVirusソフトについてくるHIPSのようなものが必要だろう
ただ、あの類は日常的にスクリプト組んで他のスクリプトや実行ファイルと連携しようとする人間には
猛烈に面倒だがなw
コマンドラインに 1..3 | % { "abc" } と入力すると abc が3行表示されるけど、パーセントはどういう役割をしているの?
>>448 ForEach-Objec のエイリアス
う。「自己解決しますた」と書きにきたら、先にレスがw ありがとう 書き込みは過疎ってるけど読んでる人は多いのか
ネイティブでサポートされてる以外のプロバイダって、何がある? SQL Server 2008 だけかね
そんなことナイアルヨ
おお、In action SEが予約できるようになっとるでよ・・・
それ、良い本なの? きのう密林でクックブックをポチったところなのに
いい本だよ。全て読み終える頃にはきっと君もアメリカンジョークの達人になっているはずだ。
あ、あれ・・・?なんでこの期に及んで6月まで延期なんだSE
PC買い換えたらようやくPowerShellが実用的な起動、実行速度になったぜ
ウチの職場で、PowerShellの話をしたら 全員揃って「何それ?」だった これでもIT系の部門なんだぜ…嫌になるわ
全員揃っておまいを嫌いになるわ
PowerShellを知らないようでは、秀丸とかLinuxとかも知らなそうだな。
秀丸 → 使ってるけど金は払っていない Linux → 知ってるけど使った事は無い WinVista/Win7 → アクティベーションせずに試用期間のまま使う、試用期間(30日*3)切れたらバックアップから復元する 有名大企業の地方子会社でもこんなもん。 「これはおかしいんじゃないでしょうか」って上司に言っても、「こういうルールだから」とか言いやがる。
まぁPowerShellはずいぶん前からあるけど、 Win7が普及してくると、それなりに使われだすんじゃないかな
Win7でもだいたいコマンドで出来ちゃう
" とか入力して改行した後に複数行のテキスト貼り付けて、矩形選択コピーとか 何もインストールされて無い状態では結構重宝する CLI使わないって人でもこういうのは便利だと思う まあcmd.exeでできるからpowershellでもできるってだけだが
465 :
名無し~3.EXE :2011/02/14(月) 17:39:54 ID:7wTobONj
PowerShell初心者です。 WiimoteLib.dllをPowerShellで使って これをPowerShellにしたいのですが どうすればよいでしょうか C#のソースらしいですが Dim btclient As New InTheHand.Net.Sockets.BluetoothClient Dim btdevs() as InTheHand.Net.Sockets.BluetoothDeviceInfo btdevs = btclient.DiscoverDevices For Each btdev In btdevs If btdev.DeviceName.Contains("Nintendo") Then InTheHand.Net.Bluetooth.BluetoothSecurity.RemoveDevice(btdev.DeviceAddress) btdev.SetServiceState(InTheHand.Net.Bluetooth.BluetoothService.HumanInterfaceDevice,False) btdev.SetServiceState(InTheHand.Net.Bluetooth.BluetoothService.HumanInterfaceDevice,True) End If Next btdev
>C#のソースらしいですが どう見てもVBじゃね…?
クレクレ厨か
powershell load dllでググったらDLLをロードするサンプルが出てくるな
あとは
>>468 でなんとかなるだろう
毒蛾ります。
471 :
名無し~3.EXE :2011/02/19(土) 15:06:01 ID:GT9DeNZI
バッチに限らず、複数のスクリプトが同時に走るとディスクアクセスが集中してうれしくない場合、 簡単にキューイング、排他制御する方法ってないですか。 各スクリプトはスケジューラだったりExplorerからSendToされたりコマンドラインから実行されたりいろいろです。 今はウィンドウタイトルに★があったら1秒待機、 なかったらウィンドウタイトルに★を付けて実行というおまぬけなことをやってますw あとはテキストにコマンドを追記していってそれを読み取って連続実行するコマンドでも作るくらいですかね。
それこそlockとれば?
Vista で PowerShell が重要な更新に入ったらしいけど、XP でも入ってるのかな?
474 :
名無し~3.EXE :2011/03/10(木) 23:06:42.43 ID:KvHq7ulM
行のはじめに、"・ソ" とでてしまうのですが、 削除する方法はありますか。
cat hogehoge.txt -Encodin UTF8 ってしてあげればいいと思うよ
476 :
名無し~3.EXE :2011/03/10(木) 23:51:28.36 ID:KvHq7ulM
書き込み、助言、ありがとうございます。 説明が足らず、すみません。-encoding ではだめなのです。 PS C:\> cat C:\test1.csv 2011031023 PS C:\> cat C:\test1.csv -encoding UTF8 2011031023 なのですが、エクセルで開くと、 "・ソ2011031023" となっていて読み込みに失敗してしまいます。
477 :
名無し~3.EXE :2011/03/11(金) 00:02:19.83 ID:KvHq7ulM
474です。 もともと、エンコードはUTF8なのですが、もしかしたらBOM付きが原因なのでしょうか。 BOMはずすコマンドをご存知なら教えていただきたく、よろしくお願いします。
Import-Csv test1.csv | Export-Csv hoge.csv -Encoding ASCII
479 :
名無し~3.EXE :2011/03/11(金) 00:17:06.92 ID:CFYbV0Sz
474です。 UTF-8N というのに変えたいのですが・・・。 どなたか、ご存知の方がいれば、ご教示ください。 PSで処理したいので、エディターで開いてやればよい、というのは、抜きでお願いします。
480 :
名無し~3.EXE :2011/03/11(金) 00:21:45.60 ID:CFYbV0Sz
474です。 478さん、ありがとうございます。 試してみました。が、見事に消えてなくなりました。 Export-Csv hoge.csvは、残念ながら、何も出力されませんでした。 お力添えには、感謝いたします。
481 :
名無し~3.EXE :2011/03/11(金) 00:36:50.98 ID:CFYbV0Sz
474です。
get-contentでうまくいきました。UTF-8Nではないですが、私のケースはASCII
で問題は解決できました。
478さん、感謝いたします。
get-content C:\test1.csv| out-file C:\test2.csv -encoding ASCII
PSではないですが、文頭に「繝サ・ソ」という文字が勝手に挿入されているという下記のリンクページが
私のケースににていました。ご参考までに。
ttp://oshiete.goo.ne.jp/qa/6511455.html
Excel2003,2007はBOM関係なくUTF-8のCSVを開くと文字化けするらしいよ 2010では大丈夫らしいけど ASCIIで出力した場合は日本語文字がないならいいけど、 そうじゃないならdefault(Shift_JIS)のほうがよくね? Unicode文字があるならunicodeのほうがいいかも
483 :
名無し~3.EXE :2011/03/11(金) 13:56:25.21 ID:9/79SQiT
484 :
名無し~3.EXE :2011/03/15(火) 22:19:30.25 ID:3J0P2gTc
数百行以上のCSVファイルの最後の十行に含まれる、文字のバイト数を数える方法を ご存知の方、お知恵をお借りしたいのですが。
最後の行の文字数のことか?
486 :
名無し~3.EXE :2011/03/16(水) 22:34:07.23 ID:bDBA47t2
説明不足ですみません。 可変長のCSVファイルの最後から数えて十行目から最後までの文字のバイト数です。 例えばですが、以下の例ですと、10234行目から10243行目のバイト数が知りたいのですが、 1. aaa,bbbbbbbb,cccc,d 2. eee,ffffff,gggg,hh ・ ・ ・ 10234. dfdf,ghghghgh,ekekekeke,t 10235. rerere,hwhwhwhwhwhw,aaa,bbbbb 10236. mnmnmnmnmnmnmnm,hh,bvbvb,wqwqwqwqwqwqwq 10237. he,g,bb,h 10238. awawaw,gigigigi,h,kkkkkkk 10239. fgf,rururururururuururururuururu,g,ppp 10240. n,qwqwqwqwqwq,zxzxz,ee 10241. cdc,d,tytytyty,eo 10242. nhnhnhnhnhnhnhnhnhnn,h,ww,qoqoqoqo 10243. zh,rererere,hshshs,e
最後の10行ってのは Select-Object -Last 10 すればよいけど、 バイト数ってのがね。 元のテキストファイルそのままの漢字コードでのバイト数を算出したいんだよね?
こんな感じ? [System.Text.Encoding]::Default.GetByteCount($(gc foo.csv | select -last 10))
489 :
名無し~3.EXE :2011/03/18(金) 17:33:35.86 ID:crr9Lo3L
484です。487さん、レス、ありがとうございます。 488さん、完璧です。解決しました。 [System.Text.Encoding]::Default.GetByteCount($(gc foo.csv | select -last 10)) で出た数値に改行コード分11バイトを足して、 $TextFilePath = 'foo.csv' $BytesToRead = 280 $fs = [System.IO.File]::OpenRead($TextFilePath) $fs.Position = $fs.Length - $BytesToRead $sr = New-Object System.IO.StreamReader($fs) $text = $sr.ReadToEnd() $fs.Close() $text で最後の10行をきちんと切り出せました。
490 :
名無し~3.EXE :2011/03/18(金) 17:37:11.15 ID:crr9Lo3L
おっと、$sr.Close() を忘れてました。 とにかく、488さん、ありがとうございました。
管理者権限で実行しているかいないかで分岐させたいのですが、どのように記述すれば良いでしょうか
IsUserAnAdmin
493 :
491 :2011/04/06(水) 08:39:52.14 ID:89JOY3lf
ありがとうございます 管理者権限の有無を取得できました Add-Type -Language VisualBasic @' Public Class Shell32 Declare Function IsUserAnAdmin Lib "shell32.dll" () As Integer End Class '@; [Shell32]::IsUserAnAdmin();
わざわざ何か呼び出さなくても、管理者で実行すれば ウインドウタイトルが「管理者: Windows PowerShell」ってなってない?
わざわざ何か呼び出さないと ウインドウタイトルが「管理者: Windows PowerShell」ってなってないかわからんだろ?
>>491 は$host.UI.RawUI.WindowTitleで判別できるってことでは?
逆にめんどいだろそれ…
498 :
491 :2011/04/08(金) 10:14:46.83 ID:/A/kzZqw
ありがとうございます タイトルバーから取得するのには気付きませんでした。申し訳ありません $isUserAnAdmin = $host.UI.RawUI.WindowTitle -like '管理者*';
title 管理者: Windows PowerShell ってやってたら?
管理者になれる?
>>499 自分の環境で動けばいいスクリプトは性善説が俺のジャスティス
ジャスティス って?w
ためらわないことさ
ジャスティスにそんな意味ないだろ
まあ元々それ自体に意味のある言葉じゃないからな
なにそれ?あーとかうーとかじゃねーよばか
他人から見ればそう見えることもあろう
それでも言うべきことは言う それが俺のジャスティス
それはお前の無学 それも言うならジャッジメントだろw
511 :
名無し~3.EXE :2011/04/14(木) 01:09:00.56 ID:3k7zk3vE
おまいら細かいこといいだろう。ジャスティス=正義っていみで それ以外は邪道意味だよ。
お前の頭では正義の反対が邪道なのか?
Remove-Item ジャスティス
$Justice = $true
まさかここまでジャスティスがツボに嵌ってくれるとは思わなかった、今は満足している
英語のレベルも知性のレベルもその程度w
かゆいところに手が届くナイスなスクリプトが完成すると気持いいな。 このスクリプトを他人に渡したところで、パワーシェル設定してない 一般人には使えないって点で、魔法使いが独自の魔法を生み出すって 気分だな。童貞的な意味も含めて。
PowerShell実行速度上がらねーの? 内部的にキャッシュでコンパイルしてくれれば、いいんだけど
ngen使えば起動は早くなるけど、スクリプト自体は無理
だってそれC#のコードだし PowerShellから呼ぶdllのソースだよそれ
>>520 念のため言っておくけど、その記事の最後に貼ってあるのは
C#で書かれたPowerShell用アドオンのソースコードだよ
あらら被った
このスレは過疎ってるけどこの技術自体は将来性あると思うんだな 法人でWin2Kが退場してWin7がメインになる頃には
ウチは全社的にServer2008R2になった。 デフォでPowerShell入ってるのは良いんだが、誰も活用しようとしない。
新しいやり方が出てきても、古いやり方が使えなくなったりしない限り、 それを使い続けようとする事なかれ主義者が多いからな。 古いやり方は早めにサポートを打ち切っていかないと。 PowerShellに限った話ではなくて、 IE6やIPv4から乗り換えようとしない奴とか、 1つ前のバージョンのWindowsの方が良かったと言い出す奴らとかも全部一緒。
シェルの外見変えられないのかな。 形から入るタイプなのでオサレにしたいんだ。
ISEなら多少はマシかも
CLIプログラムの外見って、FontFaceの話かな?ならコマンドプロンプト同様に、タイトルアイコン->プロパティで変えられる。 それ以外の話をしてるんだったらパス。
>>530 ありがとうございます。
透過使ったりできて、なかなか素敵です。
ソースの中身を理解して自分でコンパイルすれば問題なしジャン
WASP を使いたいのですが、どのように設定すれば Select-Window 等を利用できるようになるのでしょうか
>>532 の面白いねー、ソースもあるので ps だけで実装できないかねえ。
AutoItは詳しく知らないのだけど、依存性の高いコードでもなさそうな気がした。
Win32API を呼べてフックもできればいい PS では厳しいが .NET なら余裕だな
539 :
535 :2011/05/09(月) 12:11:20.74 ID:v5BEZYth
>>536 モジュール呼び出しでつまずいていました
ありがとうございます
なんとなくRubyのinjectメソッドを実装してみた
(参考)
http://d.hatena.ne.jp/kenkitii/20090114/ruby_inject function inject {
param ( $varname, $init, $sb )
begin { New-Variable $varname $init }
process { iex "`$$varname = & { $sb } " }
end { iex "`$$varname" }
}
sal %% inject
1..10 | %% sum 0 { $sum + $_ }
0..10 | %% fib (1,1) { $fib + ($fib[$_] + $fib[$_+1]) }
":A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E" -split ", " | %% h @{} { $h[$_] +=1; $h }
便利なよーな、そうでもないよーな
Enubranle.Aggregate が PowerShell から簡単に使えればいいのにね
542 :
名無し~3.EXE :2011/05/19(木) 01:10:25.61 ID:OI4oJ9e1
PowerShellってVistaHomePremiumでは使えないの? Windows6.0-KB968930-x86だと「お使いのシステムには適用されません」って出るんだけど?
ServicePackは?
vistaなら既にはいってないかい? [全てのプログラム]->[アクセサリ]->[Windows PowerShell]
asa
>>544 デフォで入る様になったのは、Win7からだぜ。
XP SP2以降でインスコできる ただし.NET Framework 2.0が必要
548 :
542 :2011/05/19(木) 22:53:10.90 ID:OI4oJ9e1
環境はVistaHomePremium ServicePak2 いまプログラム見たらNetFramework2.0だけ入ってなかったけど これが原因か? NetFrameworkって下位互換じゃなかったっけ?
1.0、1.1、4は独立 3.5は3.0と2.0を含む
550 :
542 :2011/05/20(金) 00:12:43.81 ID:rXFR5CyP
PS1.0がインストールされてました。 全てのプログラムにもインストール済の更新プログラムにも表示されず、 レジストリも本体も削除できないぜ。 削除する方法ありません?
コマンドプロンプトでの ~>python test.py < data.txt ってPowerShellではどうやるんですか? PS > python test.py < data.txt 演算子 '<' は、今後の使用のために予約されています。 発生場所 行:1 文字:17 + python test.py < <<<< data.txt + CategoryInfo : ParserError: (<:OperatorToken) []、ParentConta insErrorRecordException + FullyQualifiedErrorId : RedirectionNotSupported
標準入力のリダイレクトはサポートされていない cat data.txt | python test.py で動くかも
>>553 そうなんですか…とりあえずその方法で動きました。ありがとうございます
とりあえず?
せっかくエイリアスでunix系っぽく使えるから 他のやり方も同じだと楽なのになあと思って
バイナリーデータをパイプ使って渡したいときは、 pipebuf.exe を試してみる。
558 :
542 :2011/05/22(日) 21:46:15.78 ID:D1aZiR20
2.0インストールできました。 原因はWindowsUpdateで2.0がインストールされていたのに気付かず 1.0をアンインストールしていたためでした。 WindowsUpdateで2.0をインストールしようとして失敗し気付きました。 お騒がせいたしまして申し訳ありません。 C#でプログラミング経験はありますが、PowerShellはこれが初めてです。 お騒がせ次いでと言っては何ですが、これからPowerShellを始めるにあたり おすすめの参考書などがあれば教えてください。
Import-Csvしたときに、 そのカラム名を順序通り取得したいのですが、どうすれば良いのでしょう? いったん Get-Content | Select-Object -First 1 して、カンマ分割すれば 取り出せないこと無いのですが、エレガントじゃないし...。
ヘッダーをスクリプト側に持たせとけばいいんじゃね
諸々のcsvからINSERT文、またはMERGE文を作成するプログラムなので、 ヘッダをスクリプト内に持たせるわけにはいかないのです。
$a = Import-Csv data.csv $a.PSObject.Properties みたいな感じかねぇ
あ、
>>562 は正確には
$a | % { $_.PSObject.Properties }
とかしないとだめだった
全角のシングルクォーテーションを変数に代入したいのですが、 $X = '’' とするとエラーになります(parseエラー)。ダブルクォテーションで囲んで $X = "’" だとうまくいくようなのですが、なんで半角シングルクォーテーションで囲むとエラーになるのでしょうか?
それから、 全角のダブルクォーテーションにも同じようなことがあって "”" のように半角ダブルクォーテーションで囲むとparseエラーになってしまいます。 なんでか理解できないのですが、 "`”" ↑のように`でエスケープすると正常に動くんです。例えば $x -replace "`”", "`"" ダブルクォートの全角→半角変換のような場合に随分悩んだんですが、 なんでこれで動くのか理解できません
Powershellでは全角のクォーテーションも文字列リテラルを表す記号だから $x=”test” $x とかやってみ?
ありがとうございました。 全角が予約語(?)・・・あちゃー!ちょっとびっくりです。
あんまり使わない
なんとなしにNew-Itemのヘルプ読んでたら、-Pathってワイルドカード使えることに気付いた mkdir (1..3) 1..3 | % { mkdir -path ? -name $_} 1..3 | % { mkdir -path ?\? -name $_} 1..3 | % { mkdir -path ?\?\? -name $_} なにこれこわい・・・
>>568 あんまり使わないし、思ってもないからはまるんだろ
ドラッグ&ドロップで処理しようと思って下のサイト見ながらレジストリいじったんですが、、、
http://blogs.wankuma.com/mutaguchi/archive/2006/06/23/31196.aspx 半角でスプリットされた配列を半角スペースで連結して、最後に余計な半角を除去して
$oldpath2 = ''
foreach($x in $oldpath){
$oldpath2 += $x + ' ';
}
$oldpath2 = $oldpath2 -replace " $"
このoldpath2をtest-pathしてもFailになってしまう。で調べていくうちファイル名に"[]"が使われると失敗することがわかりました。
結局、
$oldpath2 = $oldpath2 -replace "\[", "``["
$oldpath2 = $oldpath2 -replace "\]", "``]"
を入れてやるとうまく動作するんですが、\とか`とか使うのはparseのときだけじゃなく、
OSから渡されたファイルパスの文字列であっても、[]に対しては`[, `]としないといけないんでしょーか?
注 ちなみに上のサイトのレジストリ @="\"C:\\Program Files\\Windows PowerShell\\v1.0\\powershell.exe\" -NoLogo \"%1\" %*" は最後ミスってるようです。 %x\" で正常に動くようになりました。 あと、そのサイトのPSスクリプトはスプリットされた文字列を半角スペースでつなぐか、何もせず終了するかで test-pathを使ってますので、[]を含むパスの場合、常に最後に余計な半角スペースを追加してしまうはずです。
誤 %x\" 正 %*\" でした
-literalPath パス名 ではダメ?
test-pathというのは比較的明確だと思ったので書きましたが他のコマンド(ren-itemとか)でも軒並み駄目です。 ただ、renなんかだと第2引数のdestinationは`[,`]に変換しなくともOKです。変換すると`[ `] の入ったファイルができてしまいます。 あと、[]に関してはまだ引数としてPowerShellに手渡せてるのですが、パスに()が入ると、$argsにすら展開されてないようで、 コマンドラインの処理に移る前に落ちてしまいます。
ちょっと紛らわしいので、、、 例えばファイル名[aaa]を[bbb]に変換したい場合 ren-item `[aaa`] [bbb] で正しく変換できるってことです。 ren-item `[aaa`] `[bbb`] とすると、`[bbb`]というファイルができあがってしまうんです
>パスに()が入ると、$argsにすら展開されてないようで、 >コマンドラインの処理に移る前に落ちてしまいます。 親ディレクトリを abc(Memories) ファイル名 xyz.jpg をドロップしたときのエラーです。尚、レジストリは @="\"C:\\Program Files\\Windows PowerShell\\v1.0\\powershell.exe\" -NoExit -NoLogo \"%1\" %*"\ として、終了しないようにしています。 用語 'Memories' は、コマンドレット、関数、スクリプト ファイル、または操作可能な プログラムの名前として認識されません。名前が正しく記述されていることを確認し、 パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください 。 発生場所 行:1 文字:80 + E:\Users\nanashi3.exe\Documents\WindowsPowerShell\test.ps1 J:\Pics\abc(Memori es <<<< )\xyz.jpg + CategoryInfo : ObjectNotFound: (Memories:String) []、CommandNotF oundException + FullyQualifiedErrorId : CommandNotFoundException
ID:hlsr0Yqwです。
自己レスです。
>>575 と
>>577 に書いた()や”がパス名にあるとD&Dでうまくパスが渡せない件は
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -file "%1" "%*"
とすることで解決しました -file が必要だったようです。
>>574 レスありがとうございます
確かに-LiteralPathを指定すると正しく認識してくれました。
ren-itemにはこのスイッチがないんですね。仕方がないので同じスイッチのあるmove-itemを使うことにしました。
レジストリのpowershell.exe 起動の-file追加と、test-path, move-item に-LiteralPath追加で解決しました。
ren-itemは・・・
いや別に>>,578に書いてるので間違いない。 別に引き渡しファイル名をダブルクォートで囲んでも問題ないし, =の右辺すべてをダブルクォートで囲む必要もない
誤>=の右辺すべてをダブルクォートで囲む必要もない regファイルのときはすべてダブルクォートで囲まなきゃだめだな。
どっちにしてもこのやり方だと複数ファイルのD&Dはできないんじゃないかな? 複数ファイルのD&Dのやり方知ってる人いる?
>>9-14 辺りで試した頃の記憶が正しければ普通に出来たはずー
角括弧が含まれてるフォルダ上で rm *.txt とかやってもファイルは消えないしエラーも出ないけど回避方法ありますか。
587 :
名無し~3.EXE :2011/06/21(火) 16:12:31.68 ID:VjDaDgfH
>>585 "%*"で問題ないつっとるだろうがこのカタワ野郎
複数ファイルをドロップして困るだろぼけ
ダブルクォートがなければ複数ファイルのDD処理のパス引き渡しと、繰り返し起動がオートでできるとでも思ってんのか。 ダブルクォートの有無に関わらず複数ファイルは全て$argsに引き渡される。 そのパスの分離等はユーザ側で記述する必要がある。
$args.lengthが違うだろぼけ
591 :
名無し~3.EXE :2011/06/23(木) 01:56:21.16 ID:gT9D7z4L
>>590 いつまでアホ晒してんだお前。ええ加減死ねや。邪魔なんだようじ虫が
なに吠えてんのかね あほ犬ほど吠えるつうからな
593 :
名無し~3.EXE :2011/06/23(木) 22:48:12.36 ID:KbFVjKDS
PowerShell便利だよな、でもDOS窓とWSH廃止してくれないとズルズル移行できない
どんなことに使ってるの?
バッチやWSHでできないことに
たとえば?
597 :
595 :2011/06/25(土) 18:48:57.09 ID:6QoB7Yy1
文字色を緑にしてマトリックスごっこ
そんなことに使ってるだけなの?
全員そうだよ
全員ばかなんだ
> new-item "`[abcd`].txt" -type file とやると、カレントディレクトリに [abcd].txt が作成されるのに dir > "`[abcd`].txt" だと [abcd].txtがファイルに認識されず。エラー吐いて死ぬのは何故? リダイレクトで[]の含まれるファイルをワイルドカード抑制するのはどーすればいいの?
わからん。out-file に -literalpath がないのが困る とりあえず以下で代用? dir | out-string | set-content -literalpath [abcd].txt -encoding unicode
man ni > -Name <string> > Accept wildcard characters? false ni [abcd].txt -type file > [abcd].txt gi '.\`[abcd`].txt' > [abcd].txt dir > '.\`[abcd`].txt' dir > '.\``[abcd``].txt' dir > '.\[[]abcd].txt' dir > ".\````[abcd````].txt" dir > ".\[[]abcd].txt"
-------------------------------------------------------------------- rm '.\`[abcd`].txt' dir > '.\`[abcd`].txt'; ls > `[abcd`].txt dir > '.\``[abcd``].txt' > wildcard path .\``[abcd``].txt did not resolve to a file. dir > '.\[[]abcd].txt' > wildcard path .\[[]abcd].txt did not resolve to a file. dir > ".\````[abcd````].txt" > wildcard path .\``[abcd``].txt did ... dir > ".\[[]abcd].txt" > ... did not ... .. orz
一応8.3形式で指定すればなんとかならないことはないけど、根本的な解決にはなっとらんね # ls > [].txt<Ctrl>[<Tab> function TabExpansion ($line, $lastWord) { if ( [char]$lastWord[-1] -eq 27 ) { $path = ($line -split '>\s*' )[-1].TrimEnd(27) } $path = (Resolve-Path -LiteralPath $path).Path (New-Object -ComObject Scripting.FileSystemObject).GetFile($path).ShortPath }
ようわからんけど [abcd].txt がある時に ls > '``[abcd``].txt' とか ls > "````[abcd````].txt"は成功するっぽい ない時はエラーになる
デフォでワイルドカード展開は考えもんだな。 コマンドオプションで対応するのかと思ってたら、-LiteralPathがないコマンドもあるし。 []の取り扱いは正直困ってる。なんとかしてくれ ぱっと見、いい仕様だなーと思うんだけど、やってみるとなかなか思い通りに動いてくれないんだな awkやPerlの書式そのまま輸入してもいいのにってものが、独自の書式だったり。 ゲイツもいなくなったんだし、そろそろunix文化を素直に認めてくれよ。 エスケープ文字とかなんでわざわざ`にしちゃうのよ。正規表現使うときは相変わらず\だし。混乱するんだな。 chop;とかどー書くの? これも正規表現で置換削除? メイン環境をFreeBSDからwin7にしたので、なんとしても習熟しないと・・・焦
どっちかというと、UNIXの標準環境で Get-ChildItem '/Program Files/' とかできるようにして欲しいところだ。
>>601 1)そもそもリダイレクトの「>」は使わない。
2)『ワイルドカード抑制』はファイル名をいったん変数に代入してから使う。
611 :
名無し~3.EXE :2011/07/02(土) 10:45:22.20 ID:upaPXTz8
>>609 >1)そもそもリダイレクトの「>」は使わない。
ハァ?寝ぼけてんのか?
>2)『ワイルドカード抑制』はファイル名をいったん変数に代入してから使う。
で、リダイレクト時のファイル名のリテラル指定は?
代入してもワイルドカード抑制などと全く関係ないわけだが、
仮にそれで解決したとして出来るだけ少ないキー操作で、
処理実行したいシェルスクリプト操作でいちいち変数に代入しなきゃならないような設計思想そのものが大間違いだ。
>>607 PowerShellインアクションって本を読むべし
>>611 ls | sc -l '[abcd].txt'
でいーじゃん。
「ls > abcd.txt」だとコンソールに出る表示がテキストファイルに出る(最後の空行はなし)が 「ls | sc -l '[abcd].txt'」だとファイル名だけになっちゃうよ 「ls | out-string | sc -l '[abcd].txt'」だとコンソールの表示になるが文字コードが違う(&最後の空行が3行) 「ls | out-string | sc -l '[abcd].txt' -encoding unicode」にすると文字コードも合うけど最後の空行が3行 「ls | out-file abcd.txt」はリダイレクトと同じかと思いきや最後の空行が2行 これってうちの環境だけ?
>>614 PowerShellのパイプってオブジェクトパイプだから、
そういうものさね。
でもGet-ChildItemの結果をテキストで受け取りたい、ってニーズはよく分からない。
オブジェクトのままの方が融通利いてよくね?
PSでしか通用しないオブジェクトをそのまま他の環境に持って行って都合がいいって?
いろいろ試してて気になっただけだから別にそうしたいわけじゃないけど 記録を残す意味でログに出したいとかはあるんじゃないかな? export-clixml とかで XML にしたほうが戻せるしいいかもしれないけど、そこまでする必要はないことも多いだろうし (export-clixml も -literalpath がないから [] の問題が解決しないが)
>>615 コマンドの出力やエラーをリダイレクトでファイルに落とすなんてのは、
人類が2本足歩行する前から行われていた自然な流儀だ。
>>601 のレス内容はあくまでもリダイレクトファイルのワイルドカードの話であってdirは一例にすぎんだろ。Get-ChildItemのオブジェクト出力云々ってお前の読解力はガキ以下だな。
> ファイル名
で済むところを、
>>602 が言うように、
| out-string | set-content -literalpath ファイル名 -encoding unicode
とタイプしないといけないのはユーザからすると迷惑千万な話だろ。
コマンドラインアプリを作成する際にも、ファイルオープン云々の余計な手続きを省略して手っ取り早く記録したいからリダイレクトを使うのに無駄にタイプ数増やしてどーするよ。
いい方法思いついたぜ cmd /c "dir >[abcd].txt"
虚しすぎる。
>>603 間違えてた
x man ni
o man -ful ni
でした。 横道だけど、
> -Path <string[]>
> Specifies the path to the location of the new item. Wildcards are permitted.
> Accept wildcard characters? false
Wildcards are permitted なのに、false ?
PS D:\Temp> mkdir emptydir ; cd emptydir ; mkdir a,b ; ni -name [xy].txt -path [ab] -type file ; echo `n$?
Directory: D:\Temp
d---- 07/02/2011 16:48 emptydir
Directory: D:\Temp\emptydir
d---- 07/02/2011 16:48 a
d---- 07/02/2011 16:48 b
Directory: D:\Temp\emptydir\a
-a--- 07/02/2011 16:48 0 [xy].txt
Directory: D:\Temp\emptydir\b
-a--- 07/02/2011 16:48 0 [xy].txt
True
-------------------------------------------------------------------- PS D:\Temp\emptydir> ni -name [xy].txt -path nonexistdir -type file ; echo `n$? New-Item : Could not find a part of the path 'D:\Temp\emptydir\nonexistdir\[xy].txt'. False -------------------------------------------------------------------- PS D:\Temp\emptydir> ni -name [xy].txt -path [ab]nonexistdir -type file ; echo `n$? True !? !? .. orz
>>623 一つ目は存在しないフォルダにファイルを作成しようとしてエラーが出てるだけ
ルークばりに-force使え
二つ目は何もないフォルダで ls * ってやってもエラーにならないのと同じ
-Nameと-Pathを同時に使う場合-Pathはワイルドカードを展開する
適合するパスがあればちゃんとそこに[xy].txtを作成してくれる
>>618 Get-ChildItem の出力をファイルに落としたい、と言うことならば、
Get-ChildItem | Export-Csv hoge.csv
した方が、正確に落とせるよ。
Import-Csvすれば再現できるし。オブジェクトとして利用もできる。
もっとも-LiteralPathないけどね。
確かに-LiteralPathオプション無いのは不便だよね。
パイプラインを流れるのがオブジェクトであって困るのは、バイナリデータを受け渡したいときくらいだ。 大丈夫、すぐに慣れるさ。その気があれば。
>>624 どもです。
やっぱり、ワイルドカード評価してるよね。
「ワイルドカードの使用を認めよう。だが断る」
と書かれてるようで気になってしまった。
> ルークばりに-force使え
普段はksh使ってるので、さながらアナキンばりに暗黒面に溺れてみます。
>>627 -path にファイル名まで指定する時(-Nameを使わない時)はワイルドカードは評価されない
ヘルプは-Nameを使うか使わないかで挙動が変わることを説明してないから、非常に分かりにくいけど
>>625 テメエは何度言っても文章理解できないのか。
Get-ChildItem の出力が問題なんじゃなくて、
一般のコマンド出力、エラーのてっとりばややい記録方法であるリダイレクト出力が
簡単にできないことが問題だといっとるだろうがこの文盲が。
>>629 だから、
一般のコマンド出力の結果は、オブジェクトなので、Export-CSVとかしないと、正確に記録できませんよ。
と言うことを言っています。
画面上に出てくる情報はコマンド出力の一形態でしかないです。
ログならば、より生に近い形で記録するか、あるいは手間かけて必要最小限の情報を整形して記録しないと、
帯に短し、たすきに長しの中途半端な情報になってしまうと思います。
※でもExport-Csvでもすべての情報が残るわけじゃないけど。
特にGet-ChildItemの場合、パイプで別コマンドに渡したときと、渡さず画面出力したときでは結果が明確に異なります。
さて、以上なのですが、
やりたい事は、コマンドの出力を残すと言うよりも script コマンド的な機能を必要としているって事ですよね。
> 一般のコマンド出力、エラーのてっとりばややい記録方法であるリダイレクト出力が
> 簡単にできないことが問題だといっとるだろうがこの文盲が。
見えたままそのままがパイプラインを流れるわけではないので。
トレードオフとして、ある程度は割り切るしかない、と思っています。
お前、他の言語使ったことないのかい。 PowerShllはシェルでもあるわけだ。 他言語出作った.exeはエラーログ、出力をオグジェクトなんか出力しない printfでテキストを出力すんだよ。 シェルはアプリと人の目との間に介在する立場でもある そーいうことを考えてないのかお前は。
>>631 > 他言語出作った.exeはエラーログ、出力をオグジェクトなんか出力しない
そうですよ。
でもそれってPowerShellがオブジェクトをパイプに渡していけない理由になってないかと。
オブジェクトをパイプに渡すのはPowerShellの大きな特徴のひとつでしょう。
パイプでつないでプログラミングするのはUNIX由来と思いますが、
無編集(無加工)のバイナリーデータを渡すだけだったのが、
一歩踏み込んでオブジェクトを渡すことにしたのはひとつの英断でしょう。
失われるものもあるわけですが、メリットの方が多いんでないかい?
できないことを嘆くよりも、できる事を活用したほうが効率的なのでは、と考えるわけです。
> シェルはアプリと人の目との間に介在する立場でもある
ゆえに
Get-ChildItem が画面に出力する内容はオブジェクトそのままではなく、見やすいように編集されているのでは?
> お前、他の言語使ったことないのかい。
スクリプト系で言うと、Perlとかbourne shellなら多少。
最大でも数k程度ですが。
>スクリプト系で言うと、Perlとかbourne shellなら多少。 すっこんでろ
[ を含むファイルが既に存在する時は、エスケープで対応できるようだ
単純に新規ファイルにリダイレクトする時に [ を使わないようにすればいいんでなかろうか
完全性を求めるなら別だけど、そんな気にならんし
ぶっちゃけ
>>601 で話題になるまで5年間、誰も義憤に駆られてなかったろ
いや、
>>601 本人は[]付きの新規ファイルにリダイレクトする必要性があるのかもしれんが
厄介なのは、シングルクォートで括ってもリテラルにならないこと。 さらにバックティックでエスケープしてるかと思いきや、 dir > '`[nonexist`].txt' > `[nonexist`].txt なので、も少し把握しやすい振る舞いをして欲しい気はしますね。 てことで次期バージョンに期待。
一時ファイルにリダイレクトしておいて Rename-Item で変えるとかの小技はできそうだが…
まぁ PowerShell は専用環境と割り切って、
>>631 のような用途では真面目に
>>619 がベストな気がする
そもそもリダイレクトの文字コードが UTF-16 なのは他プログラムからすると扱いやすいとはいえないし
>>630 正確に記録するなら Export-Clixml のほうがいいのでは。あえて Export-CSV を選ぶ理由はなくない?
>>635 たぶん問題は、受け側のOut-Fileの-FilePathオプションが、
-LiteralPath ではなく、-Path オプション相当であること、ですかね。
出力先ファイルをワイルドカード展開、って狙いが分からない。
>>636 はい、Export-Clixml の方が正確です。手馴れていたもので...。
で、
Import-Clixmlするとdirしたときをほぼ正確に再現できるのね。これは素晴らしい。
やっぱ開いてから実行されるまでが遅いな
>>563 ありがとう。
おかげさまで、メンバーの定義順どおり読めました。
って亀レス失礼。
まぁゴールデンのドラマで主役張るってのは女優としての資質・ビジュアル どっちも求められるからなぁ クラスで10番目の子を〜云々言ってるようならなかなか難しいだろうね
2.0に対応した日本語の書籍って今のところなさそうなんだけど 予定すらないのかな
インアクションにしろクックブックにしろ原書はは2.0に対応してるんだけど 大幅にページが増えてなかなか手を出しにくいしろものになってる むしろその前の版でコアになる知識を理解する方が効率が良い気がする
C#とかはVIsual Studioにwordで500頁を超える言語仕様書がついてたけど、 PowerShellにはこーいうのないのか
嘘だろ? Visual Basicのスペックならついてるけど
いやVisual Studioについてるかの話じゃないぞ?
おお! 解説本じゃなくて正規の言語仕様書が欲しかったんだわ。 THX 感謝します C#はいち早く日本語翻訳されてるのにPSは後回しなんだな
たすけてくだしあ 画像の整理してて、そういえばpowershellってのがあったから 使ってみようと思い立ったのですがこのザマです あるディレクトリ(含サブディレクトリ)にjpgがあります それらjpgを全部ひっくるめて別のディレクトリにコピーしようとしています すると問題になるのが、ファイル名が重複している複数のファイルをどうするかということです copy-itemではコピー先に同じファイル名があったときどちらか一方しか残しませんよね? そこで事前にget-childitemで重複ファイルを探してリネームしようとしたのですがうまくいきません $imgList=Get-ChildItem 'somewhere' -Recurse -Include *.jpg for([int]$i=0; $i -lt $imgList.Length; $i++){ [int]$pos = $imgList.Length-1 if($imgList[($i+1)..$pos] -contains $imgList[$i]){ //当該ファイルと同じファイル名があれば Rename-Item $imgList[$i] -NewName "rn"+$imgList[$i].Name //←ここらへん曖昧(ファイル名の頭にrnとか付けたい) } } あと一歩な感じだと自分では思ってるのですが、どうすればいいでしょうか? また、「こんな事しなくても目的は果たせるよ!」てなことならそちらの方法を教えて下さい 手近にPSがあったから使ってみようって感じなので,別にPSでなくても構いません(スレチになってしまいますが・・) お願いします
ファイル1個分のコピーだけど、こんな感じかな。 rnをつけてもなお重複したときのために連番をつけてみた。 $file = Get-Item "U:\Work\Source\TestImage.jpg" $targetFolder = "U:\Work\Dest" $index=0 $filename=$file.Name do { $target = $targetFolder+"\"+$filename $filename = "rn{0:d3}_{1}" -f $index,$file.Name $index++ } while(Test-Path $target) Copy-Item $file.Fullname $target
やるとしたら Group-Object でまとめちゃうかな $dest = "C:\hoge" ls -Recurse | group name | % { $_.group[0] | % { copy $_.fullname -destination $dest } $_.group[1..($_.group.Count-1)] | % {$i=0} { copy $_.fullname -destination ('{0}\{1}_{2:D3}{3}' -f $dest, $_.BaseName, $i++, $_.Extension ) } }
Perlなんかのchop;はどー書いたらいいすか?正規表現で検索して削除?
>>654 それか.NET FrameworkのString.TrimEndで削除
656 :
名無し~3.EXE :2011/08/24(水) 18:24:33.41 ID:STSwycRN
PowerShellどころかプログラミング自体まったくの初心者が 勉強するのにおすすめの本とかサイトがあったら教えてください。
>>655 THX
ここやさしい人多いな。
こんなのでも応えてくれてありがと
コンソールウィンドウを開かずに、スクリプトを自動実行するにはどうしたらいい?
>>661 powershell.exe -WindowStyle Hidden
それは一瞬開くだろ
Vista/2008以降ならタスクスケジューラで「ログオンしてない時でも実行」の オプションつけておけば窓開かないよ XP/2003ならWSHのWshShell.Runを併用してpowershell.exeをウィンドウ非表示で実行するとか
>>664 >Vista/2008以降ならタスクスケジューラで「ログオンしてない時でも実行」の
オプションつけておけば窓開かないよ
お、そうなんだ!
dir | ft fullname, length というふうにmemberを選択して表示することはできますが、 出力にユーザ所望の文字列を追加したい場合にはどーしたらいいんですか? 例えば出力の頭に、インデックスを付与したいとか、 001 filename1 002 filename2 … dir出力がテキストでなく、オブジェクトなのでちょっと整形するにも困っています
あっと自己解決しました。
670 :
667 :2011/09/03(土) 11:50:24.14 ID:ePWnVDLh
こんな簡単なプログラムなのに丸1日かかっちまった。自己嫌悪 orz 結局、dirはパイプで出力するときはオブジェクト、 単独で使うと、オブジェクトメンバーをデフォで選択して、フォーマッタ入ってるってことなんよね。 なんかしっくりこないと思ってたらここか。。。 get-member でオブジェクトのメンバーを常に確認しながら処理しないと、 画面で見えるコマンド出力結果だけを表面的に加工しようとしても駄目なんだね。
単独で実行しようが、後ろにパイプをつけようが出力するのはオブジェクトだ。 Get-ChildItem(dir)に限らず、オブジェクトの行き場がないとき (変数に入ったり他のコマンドに渡されたりしないとき)に、 適当な書式で画面に出力される。
こんなのでどうですか dir | % {$i=0}{$_ | add-member -name No -value ("{0:000}" -f $i++) -membertype NoteProperty -PassThru} |select No,FullName,Length
>>672 わざわざAdd-Member使わなくても
ls | % {$i=0} { "{0:000}`t{1}" -f $i++, $_.name }
だけでいいのでは。
>>673 そういう割り切りもあるけど、
オブジェクトじゃなくなっちゃうのが、惜しい気がする。
今後二次加工、三次加工するかもしれないし。
>670 コマンドから返ってくるのは、オブジェクト これに慣れてくると、楽しくなってくると思う get-itemとかget-childitemの表示は、cmd.exeのdirの表示とソックリにする為に、かなり加工してるので、紛らわしいけど、仕組みを調べると、楽しくなってくるはず!
時間かかる外部プログラムを複数起動させたいのだけど、start-processで実行プログラム 名のスペースはダブルクオートで囲んでOKなんだけど、実行プログラムに渡すパラメータに スペースが含まれているとうまく動きません。 なお、& "プログラム名" "パラメータ" も試しましたが、こちらは起動はするものの逐次 実行となり複数同時起動になりませんでした。 例) start-process "C:\Program Files(x86)\optipng.exe" "C:\Program Files(x86)/*.png" 例のごとく引数がスペースでぶった切られて渡されているようです。 いいアイデアありませんか?
(Resolve-Path "C:\Program Files(x86)/*.png") ってこと?
678 :
676 :2011/09/04(日) 21:37:32.73 ID:xJYYE5/c
Resolve-Pathは*を展開した配列を返しますよね。ここではoptipng.exeに対して ワイルドカードを含んだ文字列そのものを渡したいのです。 もっとも私のエラーの原因はワイルドカードではなく空白のようです。
start-process "C:\Program Files(x86)\optipng.exe" """C:\Program Files(x86)/*.png"""
680 :
676 :2011/09/04(日) 22:16:46.94 ID:xJYYE5/c
>>679 おおお、なんだか全く意味がわかりませんが、動作しました。ありがとう。
よろしければ今後のためにダブルクオーテーションを3つも重ねる意味を
教えて頂けませんか。
インストール終了後に自動でシャットダウンするようなスクリプトってできるんでしょうか?
インストールソフトのプロセスが死んだらとか 何秒間以上使用率が閾値以下だったらとか そういうレベルでよければできると思うよ
>>680 ""に囲まれた中では、
""は"になる。
それはそれとして、
別解として、
パラメータは -ArgumentList で渡すというのもありですよ。
$arg_list = @();
$arg_list += ( 'avs2yuv.exe',$avsFullName,'-raw','-',':' );
...以下略...
みたいにじっくり渡せるから、メンテしやすいと思います。
684 :
679 :2011/09/04(日) 23:40:48.51 ID:sqLryO3r
>>680 ダブルクォート中でダブルクォートをエスケープするために2つ重ねてる
echo "a "" b" とかやれば分かるかな
もっとも、PowerShell 的にはバッククォートで `" とエスケープするのが正道なはずだが Start-Process では使えなかった
ヘルプによると .NET Framework の System.Diagnostics.Process.Start メソッドを使ってるらしいのでそのせいか
>>683 それだけだと結局スペースで分割されてしまわんか (System.Diagnostics.Process.Start の仕様で)
>>683 で、
Start-Process って空白が入っている場合に""で囲まなくてはいけないのが分かりづらいと思う。
$paramFileName= '"{0}"' -f ( $videoFile -replace '"','""' ); # ← ""で囲む必要あり
$paramLogFile = '--LogFile={0}' -f $MEDIAINFO_LOG;
Start-Process -FilePath MediaInfo.exe -ArgumentList ($paramLogFile,$paramFileName) -Wait -WindowStyle Hidden;
みたいな感じ。
最初ぜんぜんわからなかったよ。
686 :
676 :2011/09/05(月) 00:15:41.49 ID:14RqIq9G
>>679 , 683
解説ありがとう。参考になりました。
そうなんですよ、バッククォートは試したけどダメだったんです。
しかしスペースのエスケープが死ぬほどややこしいのはコマンドプロンプトバッチ
の時代から変わっていないのですね...
Linuxのシェルスクリプトもスペースを区切りに使うはずだけどエスケープで悩んだ
記憶無いんですけどね。
\だけでもじゃまくさかったのに ' が加わって鬱陶しさ倍増なんだな。
PowerShell使ってて\で躓いたことはないわ []なら何度も何度も何度も何度もてこずったけど
特殊文字のエスケープは、正規表現はこれまで通り\でそれ以外は`ってところで間違えたりしない? []に関してはファイル名に使われてて、それを正規表現で処理しようとすると 誤動作されて大弱り([0-9]のような範囲指定マッチ検索と誤動作された。ファイル名に実際使われてるだけなのに、 範囲指定指定として動作するってどーいうこと?)。
正規表現に出てくるエスケープ記号と関係があるようには思えないな。
Windowsのパス区切り文字が\なんだから、エスケープ文字を\にするわけにはいかなかったんだろ cd C:\\Windows\\System32 とかしたくないしな []のワイルドカード展開はたしかに邪魔くさいけどな
ファイル名には [] () {} ' みたいな危ない文字は普通使わないもんじゃないの
新しいフォルダ(2)とかimage[1].jpgとか、アプリケーションがデフォルトで付けてくるファイル名に そんなのが多い気がする そしてそんなファイル名を修正するのにPowerShellを使おうとして苦労することも多い気がする
[]に関しては仕様以外にバグ含んでるからな
このスレの600あたりから読み返せや
さて今日からのBUILDでPowerShellも新Verの話があるらしいからwktkしよう
PowerShell辞めますとか? なんかPowerShellの方向性とは正反対のような・・・
ISEにインテリセンスが付くようでなにより。 *-Jsonとか流行のテキストデータ形式制覇する気かねぇ
PowerShell V3だって
703 :
名無し~3.EXE :2011/09/16(金) 02:19:55.11 ID:L7rTnv3g
ほう、V3でるのか。 V2の時点でかなり完成度高いけど、ちょっとリーチしてみるか
[]のバグはとれたんかな?
ちょっと入れて弄ってみた workflowという特殊な関数を作るキーワードが追加されてる これで定義された関数はリモート操作系のコマンドに必要な処理の雛形を抱き合わせた状態になってる 例えば-ComputerNameとか-PSCredentialみたいなパラメータが自動で定義される 要するに、Invoke-Commandとスクリプトブロックでやっていたことに名前を付けて扱えるようになる機能ぽい
DOSコマンドから独立してPowerShellコマンドとして使えるコマンドは増えてる? 2.0はDOSコマンドしかとしちゃ使えないし。 エマージェンシーやら、Winインストール途中とか、ここぞってときにPowerShellで使いたいよ。
710 :
709 :2011/09/18(日) 14:00:25.69 ID:R/YjQfFz
誤>2.0はDOSコマンドしかとしちゃ使えないし。 何かいてるんだおれは 訂正> 2.0はDOSコマンドと併用しないと使えないし。
dosレベルでは動かないと思う .netが要るし
DOSコマンドとどうやって併用するんだ?
dosからpowershel.exe呼ぶのかな 普通のpowershell環境が現れる exitでdosに戻る もしくは、powershell.exe の引数に スクリプトファイルとか、スクリプトブロックを設定出来るから、それでかな
>>712 そーいう意味じゃねーんだよ。PowerShellはコマンドとして機能不足、数も不足しすぎで、
DOSコマンドとして用意されたモノを使わざるを得ない場面が多々あるってこった。
copy /b すらできないだろ。ディスクパーティションだってPowerShell単独では切れないだろ。
パーティションは無理だろうけどコピーなら[IO.File]::Copy(string,string)使えばよくね。
それDOSコマンドじゃなくてWindowsコマンドだけど?
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよッ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
結局、車輪の再発明なんだよな 日本語環境Win環境でちゃんと動くbash+Perlでいいんだよな なんでM$ってunix文化を頭ごなしに否定すんの? ユーザとしてはOSネイティブのシェルは無視するわけにいかんし。 C++がグダグダ状態なのでC#の必要性はわかるが今更PowerShellなんて新たに作らなくても。 M$って人余ってんのか?
C#で作ったソフトをシームレスに利用できるよう、PowerShellを作ったっていうものすごく自然な話 新しいシェルの重要度はWindows Serverの方が高くて、MSのサーバ製品はほとんどが.NETだから。 COMが全盛ならVBShellが出てたかもしれない
unix文化を否定って、何の話だよ。 UnixがWindowsに合わせればいいだけの話だろ。
郷に入りては郷に従え、と言ってだな
cp /b ってやったらどうなんの /bなかったら?
Active DirectoryユーザーオブジェクトのACL一括変更はできますか? もしできるようならご助言いただけないでしょうか。
*-Contentに追加された-Streamパラメータ、何かと思ったら代替ストリームを指定するものだった Set-Content filename -Stream hoge で書き込んだり Get-Item filename -Stream * で全てのストリームを取得できる 18年越しのストリーム操作標準対応かー
-StreamなんてFileSystemプロバイダ専用じゃないか 設計的に残念だな
ストリーム名に列挙はできるの?
>>725 いやいや、元々動的パラメータだから
>>726 上の方法で列挙できるよ
Microsost.PowerShell.Commands.AlternateStreamData型の配列が出力される
>>725 ファイルシステム以外で代替データストリーム使えるのってどれ?
>>728 ファイルシステムでしか使えないから専用なんじゃないか
ファイルシステムなら使えるてなもんじゃないだろ 使えないファイルシステムだってあるだろ
731 :
名無し~3.EXE :2011/09/21(水) 20:15:24.16 ID:pBfj7QwJ
Win8でたら新しいPC買うわ
3.0 CTP 入れれた?
なんだ日本語版win7に入れれない
意味がなんだか分かれれない
おでかけですか〜 れれれのれ〜
>>733 確かに英語版以外には入れられないみたい。
Home Premiumではロケールや地域を変えてみてもはねられた。
このソフトって何をするためのものなの?エクスプローラーの代わりに使うような代替シェル?
暗号をクラックするためのソフトだよ
んなわけねえだろボケ
>>737 名目上はWindowsシステム管理用のコマンドシェルで、コマンドプロンプトの後継だけども、
好きな様に使えばいいんじゃないかな
>>737 いや、Emacs Lispに変わるLispの実行環境だよ
>>741 なぜそこでEmacsが出てくるの?ホントにLisp処理系が使えるんならkwsk
いや、Prologの実行環境だよ
Cygwinの新バージョンだと思ってた
いやいや、WPFの実行環境だよ
人工知能シェルにするってゲイシが生前言ってた
http://www.atmarkit.co.jp/fwin2k/productreview/win802/win802_01.html Windows 8 DPではこのPowerShellのコマンド(cmdlet)が強化されて、
システムのさまざまなコンポーネントを制御できるようになっている。
例えばWindows Server 2008/R2では230個ほどしかなかったcmdletが、
Windows Server 8のDP版では2400個以上になっているそうである。
また、例えば従来のようにnetshコマンドを使おうとすると、次のようなメッセージが表示され、
今後はPowerShellで操作を行うのが望ましい、などと表示される。
今後のWindowsのコマンド/スクリプト処理はPowerShellでのみ行われるようになるのかもしれない。
とうとう管理者は、バッチ・コマンド(やWshも?)に見切りをつけて(別に捨てる必要はないのだが)、
PowerShellに移行するべき時期が来たのかもしれない。
※netshコマンドでinterfaceサブコマンドを実行したところ
C:\>netsh
netsh>interface
In future versions of Windows, Microsoft might remove the Netsh functionality for TCPIPNetworking.
If you currently use Netsh interface to configure and manage TCPIPNetworking,
Microsoft recommends that you transition to Windows PowerShell.
To view a list of PowerShell commands for TCPIPNetworking management,
type Get-Command -Module TCPIPNetworking at the Windows PowerShell prompt.
Additional information about Windows PowerShell commands for TCPIPNetworking is available at
http://go.microsoft.com/fwlink/?LinkId=217627 netsh interface>
ボリュームやミュートはどうするの?NETを使うの?
749 :
名無し~3.EXE :2011/11/23(水) 06:53:15.68 ID:nwtiGPYP
電波テロ装置の戦争(始) 魂は幾何学、コピー出来る公安はサリンオウム信者の子供を40歳まで社会から隔離している オウム信者が地方で現在も潜伏している それは新興宗教を配下とする公安(慶應卒T)の仕事だ発案で盗聴器を開発したら霊魂が寄って呼ぶ来た <電波憑依> スピリチャル全否定なら江原三輪氏、高橋佳子大川隆法氏は、幻聴で強制入院矛盾する日本宗教と精神科 <コードレス盗聴> 2004既に国民20%被害250〜700台数中国工作員3〜7000万円2005ソウルコピー2010ソウルイン医者アカギ絡む<盗聴証拠> 今年5月に日本の警視庁防課は被害者SDカード15分を保持した有る国民に出せ!!<創価幹部> キタオカ1962年東北生は二十代で2人の女性をレイプ殺害して入信した創価本尊はこれだけで潰せる<<<韓国工作員鸛<<<創価公明党 <テロ装置>>東芝部品)>>ヤクザ<宗教<同和<<公安<<魂複<<官憲>日本終Googl検索
IEの制御でproxy設定を変えたいんだけどググって見た限りでは出来なさそう。 やっぱり難しい?
PowerShellって便利なんだけど可読性低くない? perlほどじゃないにしろ昔自分で書いたのがよく見直さないと分からんかったわ
難読化必要ない?
それはpowershellでやることじゃないだろ
なんでやること?
コードを解析されたくない場合や、他に流用されたくない場合で 且つ、コードをクライアント側に渡さなければ機能しない場合 代表はJavaScriptじゃね?
bash と同様に . によって同じコンテキストで ps1 ファイルを読み込めるけど これのヘルプってどこに載ってる?
powershell dot site:microsoft.com
man about_??? でどこに載ってるって意味で
普通にabout_Operatorsに載ってるじゃん
NetCmdletsの無料ライセンス届いてたひゃほーい
パワーシェルが標準でついてて、従来のGUIをオプション装備にすればよかったのにな。
標準でついてるが?
GUIがオプションのWindowsなんてありえないだろ
>>765 Windows Server ならそれが良い。
Server以外なら駄目だろ。
Win鯖からGUIなくしたんじゃUnixでいいしな
そうなると製品名もWindowsとは名乗れなくなるな。 ConsoleとかTerminalとか? これだとちょっとニュアンスが違うな…
Midoriとか
どちらかというと Win+R に素でPowerShellのコマンド実行できるようにしてほしい
いらねえ
cat の -Encoding オプションってヘルプのどこに載ってる?
「Windows PowerShell プロバイダーのヘルプ トピック」の「FileSystem Provider」の動的パラメータ欄
PS> man about_providers で > For a list of the dynamic parameters that a provider supports, see the > Help file for the provider. Type: > get-help <provider-name> と言われたので PS> man filesystemprovider も見てみても書いてないから困ったなあと思ったら ジャンプリストから出せるHTMLヘルプの中に書いてあったわ。 ジャンプリスト以外で HTML ヘルプを開く方法も判らんし、 man では読めなさそうだし。
781 :
名無し~3.EXE :2012/02/11(土) 12:08:06.24 ID:MW/Nl2M4
ファイルの更新日時を修正するのって、どう書くのでしょうか?
>>781 PS> ls .\a.txt
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2012/02/11 13:25 12 a.txt
PS > (ls .\a.txt).LastWriteTime = New-Object DateTime 2012,1,2,3,4,5
PS > ls .\a.txt
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2012/01/02 3:04 12 a.txt
783 :
781 :2012/02/11(土) 17:20:05.36 ID:MW/Nl2M4
有難う御座います
>>782 LastWriteTimeを一旦変数に入れるのもおk?
>>783 DateTime は構造体なので変数に入れたりしてもいいし
別のファイルの日付を設定してもいい。
むしろいったん変数とかに入れないと更新できない。
(ls .\a.txt).LastWriteTime.AddYears(1) とかやっても効果なし。
一度変数に入れても入れなくても更新は可能。
>>782 では変数に入れてないよな。
>>784 の最後の例が更新されないのは、
そもそもLastWriteTimeの値を変更していないから。
そんなことやった検事が今服役中です
誤爆かと思った。
Select-Objectの-Skipオプションて、指定行数スキップするだけじゃなくて、空データもスキップするよね? これは過剰な動き、なんじゃないかな。
>>789 今一つ状況がつかめない。
具体的にどんな感じの場合?
791 :
789 :2012/02/24(金) 02:21:14.74 ID:8cwt8idB
>>790 $a = @( 1, $null,2,$null, 3);
として、
-Skip挟むと$nullまで読み飛ばされてしまう。
$a | Select-Object -Skip 1 | % -Begin { $c=0 } -Process { "[{0}]:{1}:" -f $c,$_; $c++ }
単に$nullだから次のパイプラインに送られてないだけだよ、Skipとか関係なしに
>>792 お前、
>>791 を試してないだろ。Select-Objectの部分だけ削除してやってみろよ。
>>793 -Skip「だけ」外して試してみ?
そりゃー、Foreach-Objectに直接渡せばそうなるわな
>>794 次のパイプラインって%のことを言ってたのか。
「$nullだから次のパイプラインに送られてない」はおかしいと思って言ったんだが。
>>795 Select-Objectの-Skipの話をしているわけだし
それはそうと、普通配列の一部をくり抜きたいなら
$a[3..($a.Length-1)] とかそういうふうにするんじゃなかろうか
797 :
790 :2012/02/24(金) 13:04:14.32 ID:41XNSvVO
なるほどそういうことね。 おそらく-skip 導入の目的がそこにはなかったということだと思いますよ。 基本的には一連の文字列や数値列ということでなく、配列に入るものが オブジェクトと想定しての仕様だと思ってます。
798 :
790 :2012/02/24(金) 13:07:09.47 ID:41XNSvVO
PowerShellのコマンドリファレンス的な本て意外とないね。 誰か書いてくれねぇかな。
>>796 ごめん、いろいろ勘違いしてた。Select-Object自体が$nullを出力しないってことか。
俺はどっちかっていうと、
配列の先頭を除外するときにSelect-Object -skipを使って、
$nullを読み飛ばしたいならSelect-Objectの前に ?{ $_ -ne $null }を入れる
……の方がしっくりくる気がする。実際そうならなかったから仕方ないんだけど。
クリップボードに入っているコマンドをキーボードで 貼り付けたいときはどうすればいいの? 右クリックするのは面倒だし。
802 :
791 :2012/02/26(日) 16:56:59.30 ID:ecC/FfGv
>>796 それが、そもそもこれをやりたい配列は、
Excelの$sheet.Range(範囲).Value2
したもので、どうやら二次元配列になってるらしいことまでは突き止めたけど、インデックスがどのように構成されているか分からない、という体たらくで...。
[]で参照することはあきらめた次第。
AutoHotKey
powershellで初めてファイル処理のスクリプトを書いているものですが、 > ls "E:\hogehoge\[]ttt" だとディレクトリの中身が帰ってこなくて > ls "E:\hogehoge\ttt" だとディレクトリの中身が帰ってくるのは何故でしょうか? シングルクォートも試しましたがダメでした。 []が予約されているという情報が見つかりません。
806 :
805 :2012/02/26(日) 18:36:58.15 ID:/soVplsI
ゴメンナサイ。見つかりました。 -LiteralPathオプションつかえばいいんですね。
PowerShellの仕様のうち、この3つは大きな失敗だと思う。 ・Get-ChildItemなどで結果の項目が1つだと配列にならない。 ・[]がワイルドカード ・不等号を使わずに -gt -lt
>>802 ワークシートのRange()使ってるなら、単に範囲指定するときに
差し引きたい先頭行の数だけ数字を大きくすればいいんでは?
>>807 演算子については、結果的に後付で新しい演算子を追加しやすい仕様になったのが
むしろ良かったんじゃないかと思う(2.0の-joinや-split、3.0の-in然り)
1..10 < 5
これで1..4のコレクションが変えるのは違和感バリバリだけど
1..10 -lt 5
こっちだとすんなり飲み込めるし(これは個人差が非常に大きいとは思うけどね)
810 :
790 :2012/02/26(日) 22:14:17.28 ID:QQsiqV/U
>>802 Excelのオブジェクト操作は普段やってないんだけど
$a=$sheet.Range(範囲).Value2
で値をとったのだったら、その範囲の左上を[1,1]として
$a[行,列] セルの値とれるようだけど。
811 :
790 :2012/02/26(日) 22:17:16.95 ID:QQsiqV/U
たとえば次のようなコーディングをすると、 1列目のデータを最終行まで出力し、2列目以降同様に繰り返す $ac=$Excel.ActiveSheet.Range("A1:C10").Columns.Count $ar=$Excel.ActiveSheet.Range("A1:C10").Rows.Count for($col=1;$col -le $ac;$col++){ for($row=1;$row -le $ar;$row++){ $a[$row,$col] } }
812 :
790 :2012/02/26(日) 22:19:50.00 ID:QQsiqV/U
あ、上の例と合わせると $Excel.ActiveSheet.Range のところは $sheet.Range ですね
813 :
790 :2012/02/26(日) 22:24:07.07 ID:QQsiqV/U
ちなみに、範囲が1列または1行だけなら、行数列数取らなくても $a|foreach{$_ } だけで同じことできますね。
814 :
名無し~3.EXE :2012/02/26(日) 22:24:44.27 ID:aPYquo3t
自作カーは相変わらず頭とろいなー。
815 :
名無し~3.EXE :2012/02/26(日) 22:30:45.92 ID:QQsiqV/U
>>807 >・Get-ChildItemなどで結果の項目が1つだと配列にならない。
常に配列にしたい場合は、@()を利用する。
たとえば
$items=@(get-childitem c:\folder1)
>>807 結果が1つなら、むしろ配列にならないほうが自然だし、配列にしたければ、
$a = Get-ChildItem "hoge"
$a = @() + $a
とすればいいから、大した問題ではない。
"["と"]"をエスケープしなければならないのは面倒だが、どうせ何かをエスケープしなければならない。"["と"]"を頻繁に ファイル名に使うのはP2Pファイル共有アプリの利用者くらいではないか? Replace-Shits.ps1みたいな名前のスクリプトでも書いて、中身をこんな感じにすればいい。 param($Recurse = $true) $a = dir foreach($i in $a){ if($i){ attrib -r $i.fullname $nn = $i.name.replace("`[", "{").replace("`]","}") $i | move -dest $nn } } if(!$Recurse){return} $a = dir | ?{$_.mode[0] -eq "d"} $cd = gi . foreach($i in $a){ if($i){ cd $i Replace-Shits.ps1 cd $cd } } return
>>815 それは知ってる。配列を返したりFileInfoを返したりする仕様が不自然だから書いた。
819 :
805 :2012/02/27(月) 02:21:40.98 ID:H8kv1y4S
色々試行錯誤したのですが、 ls -literalpath E:\hoge[] はしょうがないとして、 $dir = get-item -literalpath E:\hoge[] ls $dir もダメなんですね。 個人的な感覚だと、 1行目でエスケープしたString型のパスを引数にファイルorディレクトリオブジェクトを作成して$dirに代入したら、 lsやcdがファイルorディレクトリオブジェクトを直接引数に取れて、以降エスケープもliteralpathも必要ない、 って方が自然です。素人考えですけど・・・。 それともlsやcdとかremove-itemとかファイル操作系のcomandletに 直接オブジェクトを引数にさせる方法あるんでしょうか・・・。
>>819 lsは基本的に、
Get-ChildItem [[-Path] <string[]>]
となっているので、文字列の代わりにDirectoryInfoを渡すと、DirectoryInfo.Nameにキャストされるのだろう。
ややこしくなるのは、
E:\[]\[]
のようなディレクトリを作った場合で、
E:\[]の中で
PS> cd -literalpath "[]"
Set-Location : 指定されたパス E:\`[`]\[] のオブジェクトは存在しませ
ん。
発生場所 行:1 文字:3
+ cd <<<< -LiteralPath "[]"
+ CategoryInfo : InvalidArgument: (:) [Set-Location]、PSArgumentEx
ception
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.SetLocati
onCommand
という問題が起こってしまう。
821 :
805 :2012/02/27(月) 14:06:21.83 ID:H8kv1y4S
>>820 仰せの通りで、
$dir = get-item -literalpath E:\hoge
ls $dir
は自動キャストでなまじ動いてしまうので、早とちりして、最初は混乱をしてました。
私時々ファイルフォルダ名に[]使っちゃってるので、しんどいです。
シングルクオートでブラケット無視とか、comandletがパス文字列だけじゃなくて
そのDirectoryInfo型を直接引数にとるとか、変わってくれると助かるんですけどね。
シングルクオートでくくると[]を普通の文字として扱うってのは無理だろうな。 コマンドレットを呼び出した時点で、""と''のどっちでくくったか区別つかなくなってるし。 Set-WildCardを使うとそのセッション(?)の間は変更できる……なんてのがほしい。
>>821 >comandletがパス文字列だけじゃなくて
>そのDirectoryInfo型を直接引数にとるとか、変わってくれると助かるんですけどね。
希望としては、どんな感じに?
>>823 まああまり「私の考えた理想の〜」を議論してもしょうがないのですが、
だいたい
>>819 に書いた動作です。
Do-hogehoge <string>だけじゃなくてDo-hogehoge <Dir/FileInfo>
とか、そのほか高次のオブジェクトのまま引数にとる形も追加で欲しいなと。
これならブラケットを気にする必要があるのは、
Get-item等で最初パス文字列からオブジェクト変数を取得する時だけです。
PowerShellがオブジェクト指向と聞いて、こういう動作を期待するのって、
そんなにおかしくないと思うんですけどね。
825 :
名無し~3.EXE :2012/02/28(火) 09:09:34.68 ID:eO1r1jeU
>>824 どうも理解力が乏しいもので、まだよくわかってないんだけど
get-item系自体が、system.ioかきてるので、できんじゃないだろか。
$d=get-item c:\
$d2=d.getDirectories()
d2|foreach{$_.GetDirectories()}
とかやれるので・・・
まるきり的外れ?
>>825 的外れではないです。ありがとうございます。
C#互換だからそこまでたどれば、当然そういう動作を期待できるのですね。
そのとおりの動作が
$dir = get-item -literalpath E:\hoge
ls $dir
ぐらいの直感的な記述で実現することを期待していたんですけど。
でも、案外シェルの範疇ではやっぱりString型でやりとりするくらいが適当なのかもしれません。
827 :
名無し~3.EXE :2012/02/29(水) 22:45:41.00 ID:Ze7p+BfF
>>826 あーやっと分かりました。
違うところは、$dirが配列なので、$dir[0]、$dir[1]などが
それぞれdirectoryinfoだから、
$dir =get-childitem c:\
$dir | foreach{ get-childitem $_.fullname }
というコーディングですね。
828 :
名無し~3.EXE :2012/02/29(水) 22:58:49.96 ID:ML+HInvr
夢のまた夢だなぁ…
829 :
名無し~3.EXE :2012/02/29(水) 23:01:04.54 ID:3xGFcoB+
PowerShell でMTP(Media Player Protocol)デバイス (デジカメとかMP3プレイヤーとか) のフォルダやファイルにアクセスするには どうすればいいの?
830 :
名無し~3.EXE :2012/03/01(木) 09:42:00.03 ID:224S89rR
>>817 >"["と"]"を頻繁にファイル名に使うのはP2Pファイル共有アプリの利用者くらいではないか?
ふざけんな。P2Pでなくともオーディオやビデオファイルの名分類に{}は頻繁に使うわ。
アホが勝手な憶測で邪推すんな糞野郎
>>830 うん、"{"と"}"を使っているんだよね。なら、"["と"]"についての推測はお前と関係ないだろう。
833 :
名無し~3.EXE :2012/03/10(土) 10:39:45.72 ID:5nI0+QXu
.nomedia 以外全部空になったフォルダを子孫まで消すスクリプト書いてみた
引数で渡すのがFileInfoオブジェクトでなくてパス文字列なのがなんとなくダサイ気がするのと
-LiteralPathの使い方が難しいな
なんとなく[]入りのパス消せるのは確認したけど完全かどうかまだ自信ない
$dest = '消したいフォルダ'
function Delete-EmptyFolder($arg)
{
dir -force -LiteralPath $arg | ?{ $_.Attributes -eq "Directory" } | %{ Delete-EmptyFolder $_.FullName }
if( -not $(dir -force -exclude ".nomedia" -Path $arg) ){
dir -force -filter ".nomedia" -LiteralPath $arg | %{ del -force -LiteralPath $(Join-Path $arg $_) }
del -LiteralPath $arg -force
}
}
dir -force $dest | ?{$_.Attributes -eq "Directory"} | %{ Delete-EmptyFolder $_.FullName }
ところで
>>829 の方法本当に誰もわかんないの?
マイクロSDをAndroidから抜き差しするのいい加減めどいんだが、、、
834 :
名無し~3.EXE :2012/03/14(水) 01:40:16.28 ID:sv73bJik
EXCELを新規作成したり文字を入力するのは出来るんだけど 指定のセルに罫線を付けるのはどうやったらいい?
835 :
Himagine :2012/03/14(水) 19:07:05.75 ID:CAgqpqgi
文字が入力できてるってことだから、 部分的な例だけで大丈夫そうですね。 たとえば、A10:D15 の範囲のセルを罫線で囲むのは、 $Worksheet.Range("A10:D15").BorderAround(1,3,5) BorderAroundの中は、(線の種類,線の幅,色)
>>827 いまさらながら、[]がある場合
get-childitem -LiteralPath c:\ | foreach{ get-childitem -LiteralPath $_.fullname }
じゃなくて
get-childitem -LiteralPath c:\ | foreach{ get-childitem $_.fullname }
って書けたらいいよね、って話じゃね・・・
get-childitem -LiteralPath c:\ | foreach{ get-childitem $_.} だった。
>>835 こんなに簡単に出来るんですね。
ありがとうございました。
psスクリプト?内で実行したプログラムの標準出力を取得して表示させたいのですがどうすればいいのでしょうか?
>>839 $x = whoami.exe
>>840 [Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces()[0].GetIPProperties().UnicastAddresses
>>841 いえ、IPでは無くスクリプト内で起動したプログラムの標準出力を取得したいのです
どなたかお願いします
$x = echo "前半も読めよ"
だから起動した実行ファイルの標準出力を取得したいんです… ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
あ、進捗状況等で時間のかかる出力をリアルタイムで取得したいと言った方がいいのかな? このやり方 $x = hoge.exe だと何故か取得出来ない…
標準エラー出力に出てるんじゃないか? hoge.exe 2>&1 | Set-Variable -Name x リアルタイムってのが何を言ってるのかわからんが コンソールにも出して尚且つ変数にも入れたいなら tee 使っとけ。
>>847 ようやく分かった。こういうことをやりたいのか?
$process = New-Object Diagnostics.Process
$process.StartInfo.FileName = "ping"
$process.StartInfo.Arguments = "-t 127.0.0.1"
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.UseShellExecute = $false
$process.StartInfo.RedirectStandardOutput = $true
$process.Start()
while($true){$process.StandardOutput.ReadLine()}
これより手っ取り早いやり方があるかもしれないけど俺は知らん。
今回の場合なら
Start-Process C:\WINDOWS\system32\ipconfig.exe -ArgumentList 0.0.0.0 -NoNewWindow -Wait
でいいと思う
出力あった時にイベント処理がしたい場合は、
>>849 みたいなやり方しかない
あ、ごめん勘違い、代入した言って話か・・・じゃあ
>>849 しかないな
852 :
名無し~3.EXE :2012/03/24(土) 16:17:00.95 ID:ztKxBc2J
excelの表示倍率をPowershellで変更する方法ってありますかね?
853 :
Himajin :2012/03/25(日) 23:25:51.63 ID:1V151LTe
>>852 $xl = new-object -comobject excel.application
のように$xlにインスタンスが割り当てられているなら
$xl.ActiveWindow.Zoom=150
ってな感じ
特定フォルダのサイズを求めたいです。以下のようにしたできたのですが、 Get-ChildItem -Path "c:\Documents and Settings" -Recurse -Force | ForEach-Object -Begin { $Len = 0 } -Process { $Len = $Len + $_.Length } -End { $Len } ここで他のホストのフォルダを指定するにはどうしたらよいでしょうか。
windowsのショートカットで powershell c:\foo\hoge.ps1 としてpowershellスクリプトを実行するようにしています. マウスでクリックするぶんには良いのですが cmd.exeから.lnkを実行しようとしてもリンク先のファイルをクリックしたのと 同じあつかいになるみたいでノートパッドで開かれるだけです. .lnkをクリックした時と同じように動作させるにはどうしたらよいでしょう?
解決しました.すみません。
> hoge.lnk
フォルダ名だけ与えるとそのフォルダ内の全エクセルファイルのシート名を全て表示する。 これをなるべく短いコマンドでやることって難しいでしょうか? 書いてみたけどうまく動きません・・・ gci c:\tmp -include *.xls -recurse | % {$e.Workbooks.Open($_.fullname,$null,$true) | % ($s in $e.worksheets){$s.name}}
862 :
861 :2012/05/03(木) 15:47:32.35 ID:6zZnPu7R
最初の1行が抜けてました。 $e = New-Object -ComObject Excel.Application
>>861 最後Foreach-Objectとforeach構文がごっちゃになってる
foreach構文はパイプラインの中では使えない
ls 省略
| % { $e.Workbooks.Open( $_.fullname ,$null,$true).worksheets } | % { $_.name }
V3だったら最後こう書けるけど、それくらい
| % { $e.Workbooks.Open( $_.fullname ,$null,$true).worksheets.name }
>>863 うまくいきました。ありがとうございます!
ちなみに最後に
$e.Quit()
[void][System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($e)
ってやるんですが、タスクマネージャから消えてくれません・・・
普通これで消えるんですよね?
バージョンが古い(EXCEL2000)からかも・・・
865 :
Himagine :2012/05/03(木) 20:30:43.90 ID:bmFSyBqH
>>864 こんな感じかな。変数のRemoveが必要でしょうね。
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($e)
Remove-Variable e
866 :
Himagine :2012/05/03(木) 22:00:05.38 ID:bmFSyBqH
ごめん、Remove無くても消えるね。 ってことは、やはりバージョンだろか?
$e.ExecuteExcel4Macro('CALL("Kernel32","ExitProcess","JJ",999)')
>>866 レスサンクスです。
家のPCはWinXP-Homeのすごく古いもので、実際にこのスクリプトを使うのは
会社のWin7機(EXCEL2010)なので問題なく消えるような気がしてきました。
わざわざ試して頂いてありがとうございます。
>>867 あっ、ありがとうございます。
「リモートプロシージャコールに失敗しました」みたいなメッセージは出ましたが、一発で消えました・・・
これで自宅でもこのスクリプトが使えます。ありがとうございました。
とりあえずExcelとファイルとファイルの中のシート開くのに使った変数.Close() して変数自体を$null 最後に[GC]::Collect()しとけばだいたいあってる
「Sheet2が選択された状態でEXCELファイルを開く」ということをしたくて以下のコードを書いたのですがうまく動きません・・・ エラーにはならないのですが、どこが悪いのか教えて下さい。 $file="C:\aaa.xls" $app = New-Object -ComObject Excel.Application $app.visible = $true $wb = $app.Workbooks.Open($file,$null,$true) $wb.worksheets.Sheet2.select
872 :
871 :2012/05/19(土) 23:56:56.94 ID:z0tuVkey
自己レスです。 最後の行を↓にしたら出来ました。お騒がせしました。 $wb.worksheets.item("sheet2").select() ただ新たな問題が出てきました。 これをやったあと画面に表示されたEXCELを画面右上の「×」ボタンで終了させるとEXCEL.EXEというプロセスが残ってしまいます。 taskkillとかするしかないんでしょうか?できればEXCEL終了と同時にプロセスも消えて欲しいのですが・・・
powershell側からの参照はすべて解放してるのか?
874 :
名無し~3.EXE :2012/05/21(月) 07:23:50.52 ID:XpNJnbsM
>>872 消えないのが普通じゃないかな。
>>865 に例があるように
Comオブジェクトを解放しないといけないんだと思う。
エクセルのある1セルをコピーしてtmp.txtにペーストして保存したとして、 エクセルでの改行(Alt+Enter)を普通の改行に変換した状態でこのtmp.txtの内容を表示させることはできますか?
>> 875 Office がインストールされているPC上なら可です。
877 :
名無し~3.EXE :2012/06/05(火) 17:06:19.94 ID:rXquLUol
> C:\Users\user1> class > このバージョンの言語では、'class' キーワードがサポートされていません。 これはそのうちオブジェクト指向対応ってことで期待していいのですね?
ファイルを作って、そのファイルを圧縮する方法を教えてください。
>>879 new-item "hoge" -type file
compact "hoge" /c
>>800 ありがとうございます。
そのプログラムの説明をしてくれたらありがたいです。
度々申し訳ないです。
>>800 すいません。自己解決しました。
ありがとうございます。
「全てのウインドウを最小化してタスクバーにしまう」は「Windowsキー+M」で出来ますが、Powershellで「タスクバー内の全てのウインドウを元に戻す」は出来ますでしょうか? 「Windowsキー+Shift+M」だと「Windowsキー+M」で最小化したウインドウのみが元に戻るだけでした。
スクリプトを使って違うディレクトリからファイル名が数字のファイルを取り出しそのファイルを圧縮する方法を教えてください。
違うディレクトリからGet-childitemして正規表現つかってファイル選別して圧縮するクラス呼んべ
3.0でやっとタブ補完が自分で作ったのと同じくらいましになってくれた・・・ でもやっぱ普通のコンソールでもタブ補完でコピペ機能を標準で付けてほしいな
>>883 windowを列挙してsendmessageすれ
PowerShellで「Get-ChildItem "C:\Windows" -Recurse」とか実行すると ちょうどコマンドプロンプトで「dir /s "C:\Windows"」ってやった時みたいにフォルダ毎に別れた表示になるけど、 これを「dir /s /b "C:\Windows"」ってやった時みたいにファイル名をフルパスでの表示にすることは難しいですか?
ls -r | % {$_.fullname}
>>890 出来ました!即レスサンキューです!
で、ついでと言っては申し訳ないのですが、ファイル名の前に更新日時を出すにはどうしたらいいですか?
以下のように書いてみたのですがエラーになってしまいます。
たびたびすいません…
ls "c:\windows" -r | % {$_.LastWriteTime + ' ' + $_.fullname}
>>891 {'' + $_.LastWriteTime.ToString() + ' ' + $_.FullName}
または
{$_.LastWriteTime.ToString() + ' ' + $_.FullName}
PowerShell 的には
| select LastWriteTime,FullName
を推奨
1行目は ToString() が余分だったな
>>893 望む結果を得ることが出来ました!
しかし「''+」をつけることで「.ToString()」が不要になるんですね。こちらの方が打ち込むキー数が少ないので助かります。
しかも「''+」と「.ToString()」では年月日の順序が変わったり時の位が1桁の時にゼロ補完が行われたりなどの違いがありますね。奥が深いです…
ともかくありがとうございました!
>>894 例えば、$cにあるファイルの情報が入っているとする。
PS> $c.LastWriteTime
2011年9月25日 15:04:56
この「2011年9月25日 15:04:56」で表示されているLastWriteTimeの型を調べると、
PS> $c.LastWriteTime.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DateTime System.ValueType
DateTime型だということがわかる。
一方、Nameのほうは
PS> $c.Name.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
String型になる。
空文字列''にDateTimeを足そうとすると、DateTimeはStringに変換される。
DateTimeにStringを足そうとしても、StringはDateTimeに変換されず、エラーが出る。
"Get-Process | Select-Object Name,Id"ってやるとNameが画面左端、Idが右端に表示されるがこれって詰めて表示できんのかね? 見づらくてしょうがないんだが?
format-table -autosize に渡してやると良いかも
>>897 うまくいったよありがと。
エイリアス使うと"ft -a"でいいんだな、こりゃいい。
cmdからカレントディレクトリのスクリプト呼び出す場合 powershell hello.ps1 powershell .\hello.ps1 は駄目で powershell %cd%\hello.ps1 はうまく言ったんですが常にフルパスを指定しないと駄目なんですか?
>>899 普通に .\hello.ps1 でできたよ?
powershell_ise.exe で echo hoge > hage.txt とかしてデバッグしても ファイル出力されませんがなんとかならんでしょうか? あとコマンドのヘルプってなにかのショートカットキーで見れませんか?
あとなんか,例えば copy -? すると <string[]> とかいうのが書かれているんですが, これって文字列をいくつかって意味に見えたので a.txt ./hogedir/a.txt b.txt ./hogedir/b.txt みたくすればいいのかと思ったのですが動きません。。。 なんなんでしょう?
解決しますた。すいません。
904 :
901 :2012/07/23(月) 17:17:14.84 ID:Smkw0z4b
powershell_ise.exeのほうはよくわかりません(T_T)。 どうにかならんですか
>>904 C:\windows\system32に書き込もうとして権限無くてこけてるだけじゃねーの?
あとヘルプはF1
powershellで直前にやった操作を元に戻す方法ってありますか? 具体的には \a\フォルダ \b\フォルダ \c\フォルダ ・・・ の中にあるファイルをそれぞれ1階層上に移動しようと思っていたのですが、 間違えてひとつのフォルダに移動してしまいました
トランザクションがFileSystemプロバイダでも使えたらねえ・・・
ぎゃくにどこでトランザクションなんて使えるの?
トランザクションを調べてみました いまいちまだ理解できていないのですが、Move-Itemはトランザクションをサポートしていないという事でしょうか?
ちなみに間違えて打ったコマンドはこれです Get-ChildItem A\B\?????? -Include *.txt -Recurse | Move-Item -Destination ../
>>908 トランザクションがサポートされているのはRegistryプロバイダのみ
>>909 コマンドレットがサポートしてないんじゃなくて、プロバイダがサポートしてない
どっちみちstart-transactionしてから各コマンドレット利用時に-UseTransactionを指定しないと
トランザクションは有効にならない
諦めて再移動すべし
あきらめて再移動します 質問に答えてくださった方々ありがとうございました
913 :
名無し~3.EXE :2012/07/28(土) 15:10:21.92 ID:MsKu4N7f
replaceを使って、最初の"X"のみを"Y"にしたいんですが、 "abcXdefXghi" → "abcYdefXghi" "abcXdefXghi" -replace "^.*?X","Y" だと結果は YdefXghi になってしまいます。 どのように書けばよいものでしょうか? ただし、"abcX"は"bcdX"もあれば"cX"なんかもあったり します。 よろしくお願いします。
>>913 2行になっちゃうけど
"abcXdefXghi" -match "^(.*?)X"
"abcXdefXghi" -replace "^(.*?)X","$($Matches[1])Y"
"abcXdefXghi" -replace '(^.*)X(.*$)', '$1Y$2' とかでいいんではなかろうか
916 :
名無し~3.EXE :2012/07/28(土) 18:50:51.43 ID:MsKu4N7f
913です。
>>914 さん。
>>915 さん
有り難うございます。なるほどですね。
"()"でグループ化(分離)させといて要素でアクセスですか。
なかなか"abcX"をどうやって分離するのかがわからなくて。
本当に有り難うございました。
PowerShell経由でIEのオートメーションする時に
$ie = New-Object -com "InternetExplorer.Application"
$ie.navigate("
http://www.hogehoge.com/ ")
$ie.visible = $true
$doc = $ie.document
$doc.getElementById("ID")
最後のgetElementByIdが、一部の環境で正常に動作しない
(getElementByIdに、引数を1個指定可能なオーバーロードが無い…とエラーメッセージが返ってくる)
OK … 自宅のVista、勤務先の2008R2
NG … 勤務先のVista、勤務先のWin7
これって何で…?
IEのバージョンも書かんとわからんがな…(´・ω・`)
全環境、IE9 + PowerShell2.0
a.txtの内容が aaa" bbb" ccc" で、各行の最後の「"」を削除したくて↓みたいなスクリプト書いたんですが削除出来ない。 ヒントでもよいので誰か原因わかりませんか? ちなみに最終行の「"」は削除出来なくて構いません。 $s = [io.file]::ReadAllText('a.txt', [System.Text.Encoding]::DEFAULT) $s -replace "`"`r`n","`r`n" > b.txt
↑ですが、「"」は行末以外にもある可能性があるので $s -replace "`"","" > b.txt とかじゃダメなんです。よろしくお願いします。
>>920 普通に削除できるが?
a.txtの改行コードがCRLFになってないだけじゃ?
>>922 ありがとうございます。
確かに
$s -replace "`"`r","`r" > b.txt
にしたらうまくいきました。
すみません見直して見ます…
すみません、再度質問です。 エクセルのA1セルに「AAA」、A2セルに「BBB」を入力し、この2セルの内容をメモ帳にコピペした場合、 1行目と2行目の間にあるのはCRLFではないのでしょうか? スレチなのですがそのテキストファイルをPowerShellで加工する必要があるのでどうかお願いします。 (ちなみにメモ帳の文字コードは「ANSI」となっています。)
すみません、スクリプトがミスってました。 結論から言うとちゃんとCRLFでした。 お騒がせしました…
むしろわざわざコピペしないでなぜExcelの中で操作しない .netから直接読むなりCOMで読むなりすればいいじゃん
powershell初です 便利ですね でもスクリプトは過去にいたずら等あってセキュリティがガチガチなんですが 人に配って使ってもらう簡単なツールなどの場合は署名とるしかないんでしょか? 説明してあれこれするにはめんどくさいw
Execなんとかポリシーをリモートなんたらに設定してもらえば大丈夫なはず
powershellを管理者権限で起動してSet-ExecutionPolicy RemoteSignedですよね・・ もうこの時点で厳しそう XP時代に甘い管理で飼いならしちゃったので厳しい・・・
>>929 起動オプションで実行ポリシー指定する場合は管理者権限いらない
powershellのスクリプトを実行するバッチファイルを一緒にくっつければOK
セキュリティ回避させてOKとかwwww
>>931 そりゃまぁバッチが実行できるような状態でセキュリティ云々言ってもしょうがないからねぇ
そこではMSも利便性を優先させたわけさ
実行ポリシーは内部犯を防ぐことは考慮されてないってこと
じゃあDLしたバッチがZoneIDでブロックされてなくて、
それがPowerShell呼び出したらアウトじゃんってなるんだけど
いやもうまったくもってその通りです
正規表現で複数行の範囲を取り出したいんですがうまくいかないのでおかしいところを教えてください hoge.txtの中に下記のようなG00で始まりA99,,,,で終わるデータがならんでます G00,1,hoge,, Z00,座標データ,,, A00,,,, -25578.2378 -10551.4829 A01,1,hoge1 -25577.7598 -10550.6659 A01,2,hoge2 -25574.8438 -10541.3919 A01,3,hoge3 A99,,,, $text = Get-Content .\hoge.txt $text -match '(?mx:^G00.*?A99,,,,$)' $matches
>>933 Get-Content の出力は配列になってるから(3.0なら-Rawオプションがあるが)、
-match演算子使うと各行ごとにマッチするやつだけ返そうとしてどれもマッチしないからうまくいかない
あと-match演算子はパターン最初にマッチしたところで終わるから全部をマッチさせることはできない
やるとすれば[Regex]::Matchesメソッドとかを使うのがいいんじゃないか
>>935 ありがとうございます
get-help get-contentしたら配列表記でてるのを見落としてました
結局マッチを楽にするのにまず正規表現で不要な記号とか削ってから[Regex]::Matchesで解決できました
PS3の連載記事はよ
A.ps1 $Test = Get-ChildItem powershell -Command .\B.ps1 "Test" $Test B.ps1 param($value, $Test) Write-Host $Test とするとBの$Testには配列で格納されません。 配列を他のファイルに渡すにはどうすればいいですか?
試してないけど ' か {} で全体囲めばいいんじゃね powershell -Command '.\B.ps1 "Test" $Test' そもそもPowerShell上でスクリプト呼ぶなら、わざわざもう一度PowerShell呼び出さなくてもいいと思うけど
って、すまん別プロセス立ち上げてるんだから変数のまま渡せるわけないな やるなら単純に .\B.ps1 "Test" $Test か、 どうしても別プロセスでやるならClixmlに変換してから渡すくらいかね
test.ps1 ----- while ($true) { start-sleep -milliseconds 100 write-host "." $array = [management.automation.host.choicedescription[]]( (new-object management.automation.host.choicedescription "&Yes","Yes"), (new-object management.automation.host.choicedescription "&No","No") ) if ($host.ui.promptforchoice("", "続行しますか?", $array, $array.count - 1) -ne 0) { break } } ---- Powershell3にてこのスクリプトを実行した際、コンソールウィンドウ右上の×をクリックして終了させると ウィンドウが閉じるまでやたら時間がかかるんだけど原因分かりますか? powershell.exe -version 2 -command ".\test.ps1" って実行させた際や、Ctrl+Cで終了させる場合はすぐに閉じるんですが・・・ OSはWin7sp1x64です。
942 :
名無し~3.EXE :2012/09/26(水) 23:44:13.61 ID:IqWSIyvi
PowerShellってVBSみたいに難読化できる? 配布すること考えるとVBSかやっぱ
VBSみたいに難読化? ご冗談でしょ
944 :
942 :2012/09/27(木) 23:33:51.81 ID:joGXkFTw
VBSの難読化ってどうやるんだろ? まあ、おれがプログラム組むといつも難読だけど。
VBSに埋め込めばできるでしょう。。。
難読したもの貼ってみろよ1行で解読できるから
encodeだろdecode1行
>ただし、コード内に2bytesが含まれている場合には、その部分だけはエンコードされないので、注意すること ダメじゃねーか1!!
>>950 コードに2バイト入れるなよ・・・
VBAか
何どす化?
Out-File -Encoding UTF8 だと BOM 付きの UTF-8 になっちゃうけど BOM なしにするにはどうすればいい
[Text.Encoding]::GetBytes() 使うか、どっかから nkf コマンド拾ってくるか、Connect で要望出して採用されるの待つか、その辺で。
>>953 $utf8=New-Object System.Text.UTF8Encoding $false
$writer=New-Object System.IO.StreamWriter "C:\text.txt",$false,$utf8
$writer.Write("あああ")
$writer.Close()
956 :
名無し~3.EXE :2012/10/05(金) 14:23:31.75 ID:xVBx1poh
957 :
名無し~3.EXE :2012/10/13(土) 21:55:43.01 ID:NoKCNVgA
ACCESSに接続してレコードを読み込んだり書き込んだりしたいんだけど、 上手くいきません。 参考ソースか解り易いサイトありませんか?
958 :
957 :2012/10/14(日) 21:14:33.89 ID:lPlYHEKJ
すいません、ACCESSに接続してレコードを読み込むことは出来ました。 しかし、INSERT分を使用してデータの追記が上手くいきません。 --------------------------------------------------------------------------- #接続文字列を準備する $connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dataSource;" #データソースに接続し開く $connection = New-Object System.Data.OleDb.OleDbConnection $connectionString $connection.Open() $command = New-Object System.Data.OleDb.OleDbCommand $sqlCommand,$connection $command.ExecuteNonQuery() $connection.Close() ---------------------------------------------------------------------------- $sqlcommandには実行時に"INSERT INTO テーブル名 (列名1,列名2) VALUES (値1,値2)" を引数で渡しています。 発生するエラー内容ですが、 "0"個の引数を指定して"ExecuteNonQuery"の呼び出し中に例外エラーが発生しました: "INSERT INTO ステートメントの構文エラーです。" と表示されます。 試しにACCESSのクエリから上記のINSERT分を実行しましたが問題なくデータは入りました。 プログラム自体の問題と思いますがご教授願えませんでしょうか?
実行中のアプリケーションが、自分を起動したのがPowerShellなのかcmd.exe なのか判定する方法ってあるの?
親プロセスを見れば?
%ComSpec% みたいに手軽なのがいいのだが、無理か
調べたけど無理っぽいね。残念。
あほっぽいね。あほか。残念。
-Confirm:$falseに対応していないコマンドレットで 確認メッセージを表示させないようにしたいのですが、 方法はないでしょうか
>>964 -Forceで確認でなくなるコマンドレットありますよ
PSオブジェクトのプロパティについて教えてください ・psbase ←元となったオブジェクト? ・psobject.ImmediateBaseObject ←アダプタしたオブジェクト? ・psobject.BaseObject ←アダプタしたオブジェクト? ImmediateBaseObjectと何が違うの?
969 :
優しい名無しさん :2012/12/10(月) 04:23:25.73 ID:r/g+qGG1
独自の運命を取るがゆえに…
970 :
名無し~3.EXE :2012/12/10(月) 09:37:54.58 ID:sWDv6Ofi
∧∧ ( ・ω・) _| ⊃/(___ / └-(____/  ̄ ̄ ̄ ̄ ̄ ̄ ̄ <⌒/ヽ-、___ /<_/____/
971 :
名無し~3.EXE :2012/12/10(月) 12:28:48.34 ID:sWDv6Ofi
ラ ジ オ の D J が 考 え た
972 :
名無し~3.EXE :2012/12/10(月) 12:30:46.89 ID:sWDv6Ofi
妹を精神病院に入院させる手続きが抜けてた。すまん
973 :
名無し~3.EXE :2012/12/10(月) 15:39:56.69 ID:sWDv6Ofi
| | |( ゚Д゚) 冫、)∧_∧ | | || | ` / ( ・∀・) / ̄ ̄ ̄  ̄\ | | | ̄ ̄ ̄ /|_∧⊂ ./////ヘ \ | | | / /| ∀`) | ⌒ ̄⌒ ̄ ̄ヘ | / ̄ ̄ ̄ ̄ ̄ | /\ | /|/|/| _-;) | (・) (・) \ | < そこのラジオのDJ逃さないわよ! | / / |// / /|⊂| | へ 9) / \______ | / / |_|/|/|/|/| ∪ 彡| ___ |ミ | / / |文|/ // / \ ヘ_/U ./ヘミ |/ /. _.| ̄|/|/|/ \____/ /|\/ / / |/ / / \ | | ̄| | |ヽ/l ⊂ ( ( つ | | |/| |__|/ /⌒ _) | |/| |/ { ノヘ | | |/ し `J Ξ≡3
ただ単に ls とやるとLengthとうファイルサイズを表す列が表示されますが、 ls | Export-Csv a.csv とやると出力されたa.csvにはLengthという列がありません。 Lengthも出力したい場合はどうすればよいのでしょうか?
ls | select-object Name,Length | export-csv a.csv
>>975 ありがとうございます。ファイルサイズを出力させることが出来ました。
それにしても↓のようにしてもなぜLengthが出ないんだろう?謎だ…
ls | select-object * | export-csv a.csv
>>976 ls の出力にディレクトリがなければ Length が出力されたよ
978 :
啓 :2012/12/23(日) 22:42:27.64 ID:rlbzwsZi
推薦expert
PowerShellを使ってGUIツールの自動化テストを行いたいのですが、 参考になるページなどあったら教えてください。
diffコマンドを、 diff $(gc "c:\aaa.txt") $(gc "c:\bbb.txt") -inc のように使っているのですが、行番号が出ないので非常に不便です。 何か書き方が悪いのでしょうか?それとも元々出ない? 行番号を出す方法はあるのでしょうか?
>>980 やるとすればSelect-Stringで全行ヒットするようなパターンを与えて行番号出すくらいかねぇ
compare (grep ^ a.txt) (grep ^ b.txt)
あと一行コマンドの場合括弧の前の$はいらんよ
この板自動で落ちるのって980からだっけ
>>980 ごめんSelect-Stringの出力にパス情報が入ってるの忘れてた
$a = grep ^ .\a.log | % { $_.Path = ""; $_ }
$b = grep ^ .\b.log | % { $_.Path = ""; $_ }
compare $a $b
みたいな感じでならうまくいくよ
983 :
980 :2013/01/29(火) 01:32:57.70 ID:yPH+ac3a
984 :
980 :2013/01/29(火) 23:36:12.56 ID:yPH+ac3a
>>982 今日使ってみましたが、バッチリうまく行きました!
どうもありがとうございます。
ところでこれは文字コードがUNICODEのファイルでやると問題なかったんですが、
SJISのファイルでやると日本語が文字化けしてしまいました。
これはPowerShellの仕様なのでしょうか???
-Encoding オプション付けとけ