• 締切済み

powershellでプロセスIDの変数化

powershellで特定のプロセスのプロセスIDを変数化したいと思っています。 例えばexploreのプロセスなら「Get-Process explorer」で Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 931 80 35804 76272 286 12.23 2632 explorer みたいに出力できるのはわかりますが、このときのプロセスIDである2632だけを 抽出するには、「Get-Process explorer」のあとにパイプで何を入力すれば良いのでしょうか?

みんなの回答

回答No.1

パイプせずに下記のようにすればIDがとれます。 $(Get-Process explorer).id ---------------------------------------------------- PS C:\Users> $(Get-Process explorer).id 2364 PS C:\Users> Get-Process explorer Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1485 109 64092 82064 364 7.41 2364 explorer

関連するQ&A

  • Powershell プロセス二重起動

    PowerShell初心者です。 自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。 現在コマンドラインで確認しているのですがどうもうまくいきません。 やろうとしている操作は以下です。 (1)ファイルにプロセス情報を出力。 PS C:\> $tempfile = "C:\pswork\servicemon\temp.log" PS C:\> Get-WmiObject win32_process ` | select Name, ProcessId, CommandLine ` | sort Name ` | Format-Table -AutoSize ` | Out-File -FilePath $tempfile -width 1000 (2)自分のPID以外のプロセス情報を取得 PS C:\> $mypid = $PID PS C:\> $killpidtmp = Get-Content $tempfile | Select-String -Pattern ".*powershell.exe.*svmon131_loop.*" |Select-String -NotMatch -Pattern "\s$mypid\s" PS C:\> echo $killpidtmp powershell.exe 2024 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command C:\pswork\servicemon\svmon131_loop.ps1 (3)splitでプロセス番号のみを取得。 PS C:\> $killpid = echo $killpidtmp |% {$($_-split(" "))[1]} PS C:\> echo $killpid ★ここがうまく取得できません。空白しか取得できていません。 (4)最終的には取得したPIDでプロセスを終了。 PS C:\pswork\servicemon> Stop-Process -ID $killpid Bシェルで同様のスクリプトがあったので、それを参考にPowerShellで書こうとしているので、 そもそも無理があるのかもしれないかと考えています。 上記の方法でなくてもよいので、二重起動のチェックと該当プロセスの停止で参考となる情報があれば教えて頂きたいです。

  • powershell でパラメータ的な変数 $_ の下の項目を扱うには

    powershell でパラメータ的な変数 $_ の下の項目を扱うには? $aaa = Get-ChildItem -Path "c:¥Program Files" この場合の $aaa を1レコードづつ回して、特定項目を抜き出す方法を教えてください。 $aaaを見てみると、 Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2010/06/30 12:00 Adobe d---- 2010/06/30 12:00 Hidemaru d---- 2010/06/30 12:00 Java d---- 2010/06/30 12:00 Lhaplus d---- 2010/06/30 12:00 Microsoft Office な感じです。 ここから、1レコード毎に個別に、またModeやNameの1項目毎に取り扱いたいです。 例えば あああ d---- Adobe あああ d---- Hidemaru あああ d---- Java あああ d---- Lhaplus あああ d---- Microsoft Office と出力したいとして、 ForEach-Object -InputObject $aaa -Process { echo "あああ"; echo ($_.Mode + " " + $_.Name) } というコマンドを打ってみましたが、うまく行きません。 一旦、シンプルに ForEach-Object -InputObject $aaa -Process { echo $_ } とすると、 Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2010/06/30 12:00 Adobe d---- 2010/06/30 12:00 Hidemaru d---- 2010/06/30 12:00 Java d---- 2010/06/30 12:00 Lhaplus d---- 2010/06/30 12:00 Microsoft Office と出力されました。 しかし、これは1件づつループしたのではなく、$aaaの塊が1回ドンと出てループはしていません。 ForEach-Object -InputObject $aaa -Process { echo "あああ"; echo $_ } と書いても、結果は あああ d---- 2010/06/30 12:00 Adobe あああ d---- 2010/06/30 12:00 Hidemaru あああ d---- 2010/06/30 12:00 Java あああ d---- 2010/06/30 12:00 Lhaplus あああ d---- 2010/06/30 12:00 Microsoft Office ではなく あああ d---- 2010/06/30 12:00 Adobe d---- 2010/06/30 12:00 Hidemaru d---- 2010/06/30 12:00 Java d---- 2010/06/30 12:00 Lhaplus d---- 2010/06/30 12:00 Microsoft Office です。 この場合の $aaa を1レコードづつ回して、特定項目を抜き出す方法を教えてください。

  • コマンド実行結果を変数に代入できない(shell)

    Kシェルを作成しており、以下のコマンドを変数に代入することができません。 DIR1=`ls ${SOURCE_FILE_PATH} | grep ${INTERFACE_ID} > /dev/null 2>&1` やりたいことは単純で、 ${SOURCE_FILE_PATH} に ${INTERFACE_ID}フォルダが存在するかを確認するために、実行結果をDIR1に格納したいだけです。 しかし、sh - xでデバッグすると、仮にフォルダがあったとしても、何も代入されず終わってしまいます。 パイプ処理やgrepを使用したコマンドを変数に代入する方法をご存知の方いらっしゃいましたらご教授願います。

  • select-stringについて

    robocopyとselect-stringについて robocopyの結果は、LOGオプションで確認できますが、 なんせ大量に出力され、コピーができなかったファイルやアクセスできなかった ファイルなどをlogの中から目視で特定するのは大変ですよね。 そこで、robocopyのログからコピーできなかったファイルだけを Powershellの文字列検索コマンド( Select-String)で抽出してみたのですが、 PowerShellの構文やselect-stringの使い方合っていますか? -pathとか良くわからない状態ですが、しっかりと、"エラー" プロセスはファイルにアクセスできません。別のプロセスが使用中です。" という箇所の行だけ出力されたファイルができあがりましたが、 本当に使い方など正しいのか・・・自身無しです。 select-stringではなく、コマンドプロンプトのfindではできないですかね? <実行> まず、コマンドプロンプトよりrobocopyを実施。 admin>robocopy C:\windows D:\bk /MIR /R:1 /W:3 /TEE /LOG:roblog.txt そして、PowerShellでコピーできなかったファイルだけを吐き出す。 get-content C:\user\administrator\robolog.txt | Select-String "エラー","プロセスはファイルにアクセスできません。別のプロセスが使用中です。" > erro.txt どなたかご教授下さい。

  • PowershellでCSVをexcelに書き込む

    Powershellを使いCSVファイルをexcelの任意のセル位置から書き込むためにQueryTablesを使わない方法として下記コードをとあるサイトを見て継ぎ接ぎで作りましたがデータ量が多くなると処理時間を要します。 「QueryTablesよりStreamReaderのほうが 大容量(100MB以上)のテキストファイルを処理する場合、Get-ContentやImport-Csvなどのコマンドレットではなく、StreamReaderを使用することが推奨されています。なぜなら、PowerShellのパイプ処理は遅く、大量のメモリを消費するため、効率的な処理ができないからです。 StreamReaderは.NET Frameworkのオブジェクトを生成して使用するため、コードの記述量が増えるかもしれませんが、大容量ファイルの読み込みには最適な手法です。」 とありより良い方法と思いましたが私のコードのの書き方かどうか分かりませんが期待外れでした。因みに2列、1,000,001行でもQueryTablesなら15秒ぐらいですがこれだと10,001行で50秒位掛かりる状況でした。 # 通常のCSVファイルをExcelにインポートするスクリプト $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $book = $excel.Workbooks.Add() $sheet = $excel.Worksheets.Item(1) $csvPath = "D:\test\pp004.csv" # CSV ファイルのエンコーディングを指定する $enc = [System.Text.Encoding]::UTF8 # CSV ファイルをオープンする $streamReader = New-Object -TypeName System.IO.StreamReader $csvPath, $enc # 変数を初期化する・・書き出し位置の指定 $i = 2 $j = 3 # 1行ずつ最終レコードまで読み込む While (($line = $streamReader.ReadLine()) -ne $null) { # カンマで文字列を分割し配列に格納する $fields = $line.Split(",") # 配列を順番に処理する foreach ($field in $fields) { # セルの書式を「文字列」にする #$sheet.Cells.Item($i, $j).NumberFormat = "@" # セルに値を設定する $sheet.Cells.Item($i, $j).Value = $field # 列を1つ進める $j++ } # 行を1つ進める $i++ # 変数初期化 $j = 3 } # CSV ファイルを閉じる $streamReader.Close() # COM 参照を解放する [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($sheet) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($book) [void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) [GC]::Collect() もしこのコードに問題があればお教えください。 よろしくお願いします。

  • powershellの変数の扱い方

    cmdshell(bat)からpowershell(ps1)に移行しようと勉強しているものです。 ごく初歩的なことだと思うのですが、わからないので質問します。 環境はWindows8.1、PowerShell ISEを使用しています。 下記のように引数を実行ファイルに渡すと、渡したファイルが操作されます。 ------------------------------- D:\...\abc.exe $Args ------------------------------- これであれば正常に機能するのですが、 ------------------------------- $abc = "D:\...\abc.exe" $abc $Args ------------------------------- とするとエラーになってしまいます。 これは一体なぜなのでしょうか。 解決方法をご教授願いたいと思います。よろしくお願いします。

  • Powershell Start-Process

    Start-Process http://technet.microsoft.com/ja-jp/library/dd347667.aspx の-Verbの解説に "プロセスで使用できる動詞を検索するには、オブジェクトの Verbs プロパティを使用します。" とありますが、プロセスで使用できる動詞を検索(又は一覧)するには具体的にどのようにすればいいのでしょうか?

  • ロードアベレージが高いのですが、CPUもディスクIOも低く、これはどう

    ロードアベレージが高いのですが、CPUもディスクIOも低く、これはどういったことが原因なんだろうと悩んでいます。 topやsar等の結果は以下の感じです。 VPSサーバーでapache mysql phpが動いていて、mysqlはほとんど使っていなくて、apacheが原因ということはわかっています。 apacheのプロセスがたくさん作られています。PV等からもうスペック不足だなとは思っていて近々サーバーを引っ越すのですが、 これの原因をつきとめてすっきりさせたいところです。http.confをいじれば解決する問題なのでしょうか? 本やブログなどを読んでもロードアベレージの原因はCPUかディスクIOであると書かれていてそう思っていたんですが、この状態だと納得できません。よろしくお願いします。 load average: 10.78, 18.97, 20.37 Cpu(s): 2.9%us, 1.8%sy, 0.0%ni, 95.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1572864k total, 587936k used, 984928k free, 0k buffers 06:20:01 PM CPU %user %nice %system %iowait %steal %idle 06:30:01 PM all  5.53 0.00 3.37 0.01   0.00 91.10 06:40:01 PM all   3.40 0.00 2.12 0.00   0.00 94.48 03:20:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad 06:40:01 PM 776820 796044    50.61 0    0   0    0    0.00    0 06:50:01 PM 709144 863720    54.91 0    0   0    0    0.00    0 07:00:01 PM 914668 658196   41.85 0   0    0   0    0.00    0

  • powershell で-processの中に複数

    powershell で-processの中に複数行書きたいが長くなる foreach-object の -process{}の中に複数のコマンドを書きたいのですが、長くなります。 foreach-object -process{command1; command2; command3; command4; command10 } foreach-object -process{ command1; command2; command3; command4; command10 } なんか適当に折り返して書く方法ありませんか? `で出来ると書いているサイトがありましたが、このケースでは無理でした。

  • アプリケーションエラーについて

    今年に入って、XPパソコンが壊れて修理に出し、ビスタを購入しました。XPは、なおると使える状態だったし、ビスタのベイシックのほうを選びました。  IEを使用している時なのですが、あるページに来ると、 「Intemet Explorer セキュリティー、 Webサイトでこのコンテンツを使ってWebコンテンツをひらこうとしています。このプログラムは保護モードの外で開かれます。Intemet Explorer mの保護モードは、お使いのコンピューターを保護するのに役立ちます。このwebサイトを信頼していない場合は、このプログラムを開かないでください。  名前 Microsoft.NETErerr Reporting Shim 発行元  Microsoft Windows」と出てきます。はいでもいいえでも どっちをクリックしても、今度は 「explore.exe アプリケーションエラー」が出ます。「アプリケーションでハンドル出来ない例外が発生しました。処理ID=k0x14bc(5308), スレッド ID=0x14e0(5344)アプリケーションを終了するには、OKをクリックしてください。アプリケーションをデバックするにはキャンセルをくりっくしてください。」という内容です。 結局IEは、終了し、一番初めに出てきたIEは、固まってしまいます。 ダブルクリックすると出るような気もします。 どうにか できないでしょうか?

専門家に質問してみよう