Closed38

PowerShell でプロセスを再起動したい

ピン留めされたアイテム
wintwint

一旦やりたかったこと

一旦は、やりたかったことを実現できた。

Get-Process LogiOptionsMgr | foreach { Stop-Process $_; Start-Process $_.Path }
Get-Process LogiOptionsMgr | foreach { kill $_; start $_.Path }
ピン留めされたアイテム
wintwint

Done

$regex = '^"([^"]+)"(?: (.*))?$'
Get-Process LogiOptionsMgr | foreach { $_.CommandLine -match $regex >$null; $path,$args=$Matches[1..2]; Stop-Process $_; Start-Process -FilePath $path -Args $args }
Get-Process LogiOptionsMgr | foreach { $_.CommandLine -match '^"([^"]+)"(?: (.*))?$' >$null; $path,$args=$Matches[1..2]; Stop-Process $_; Start-Process -FilePath $path -Args $args }

Get-Process LogiOptionsMgr | foreach { kill $_; $_.CommandLine -match '^"([^"]+)"(?: (.*))?$' >$null; $path,$args=$Matches[1..2]; start -FilePath $path -Args $args }

結局スクリプトは使わなかった

wintwint

ダウンロードしたスクリプトファイルのインターネット経由属性を消すだけで大丈夫そう。

もちろん中身は読んでおく。

→ 結局動かない模様

wintwint

とりあえず停止まで

notepad
Get-Process notepad | Stop-Process
wintwint
> Get-Help %

NAME
    ForEach-Object

SYNTAX
    ForEach-Object [-Process] <scriptblock[]> [-InputObject <psobject>] [-Begin <scriptblock>] [-End <scriptblock>] [-R
    emainingScripts <scriptblock[]>] [-WhatIf] [-Confirm] [<CommonParameters>]

    ForEach-Object [-MemberName] <string> [-InputObject <psobject>] [-ArgumentList <Object[]>] [-WhatIf] [-Confirm] [<C
    ommonParameters>]

    ForEach-Object -Parallel <scriptblock> [-InputObject <psobject>] [-ThrottleLimit <int>] [-TimeoutSeconds <int>] [-A
    sJob] [-UseNewRunspace] [-WhatIf] [-Confirm] [<CommonParameters>]


ALIASES
    foreach
    %


REMARKS
    Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.
        -- To download and install Help files for the module that includes this cmdlet, use Update-Help.
        -- To view the Help topic for this cmdlet online, type: "Get-Help ForEach-Object -Online" or
           go to https://go.microsoft.com/fwlink/?LinkID=2096867.

https://docs.microsoft.com/ja-jp/powershell/scripting/samples/repeating-a-task-for-multiple-objects--foreach-object-?view=powershell-7.1

https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-7.1

https://docs.microsoft.com/ja-jp/powershell/scripting/learn/ps101/06-flow-control?view=powershell-7.1

wintwint

起動はできたけど、多重起動はエラーになる

notepad
Get-Process notepad | foreach { Start-Process $_.CommandLine }
Get-Process notepad | foreach { Start-Process $_.CommandLine } # ここからエラー

Start-Process: This command cannot be run due to the error: 指定されたファイルが見つかりません。

wintwint

return each object after a loop

Get-Process notepad | % { $_ }
wintwint

多分ファイルシステムレベルで競合してる。

wintwint

パスはあるようだが…?

Get-Process notepad | foreach { Test-Path $_.Path }
True
True
True
True
wintwint

.CommandLine じゃなきゃ問題なかった

Get-Process notepad | foreach -Parallel { Start-Process $_.Path }
wintwint

CommandLine はパスじゃない。

Get-Process notepad | foreach -Parallel { Test-Path $_.CommandLine; $_ }
wintwint

args がなかったらパースは省略できる。

wintwint

分割するだけだから、ほとんどパースじゃない

Get-Process chrome | foreach { $_.CommandLine.Split(" ") }

" エスケープの考慮が必要

wintwint

とりあえず " で分割

Get-Process notepad | foreach { $_.CommandLine.Split('"')[1] }
wintwint

args

Get-Process chrome | foreach { $args = $_.CommandLine.Split('"')[2].Remove(0, 1).Split(' '); $args.Length }
wintwint

parsing

Get-Process chrome | foreach { $path,$rest = $_.CommandLine.Remove(0, 1).Split('" '); $args = $rest.Remove(0, 1).Split(' '); @($path,$args) }
wintwint

regex

^"([^"]+)"(.*)$
^"([^"]+)"(?: (.*))?$

test

https://regex101.com/

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --type=crashpad-handler "--user-data-dir=C:\Users\Yuya\AppData\Local\Google\Chrome\User Data" /prefetch:7 --monitor-self-annotation=ptype=crashpad-handler "--database=C:\Users\Yuya\AppData\Local\Google\Chrome\User Data\Crashpad" "--metrics-dir=C:\Users\Yuya\AppData\Local\Google\Chrome\User Data" --url=https://clients2.google.com/cr/report --annotation=channel= --annotation=plat=Win64 --annotation=prod=Chrome --annotation=ver=87.0.4280.88 --initial-client-data=0xec,0xf0,0xf4,0xc8,0xf8,0x7fff34a70eb0,0x7fff34a70ec0,0x7fff34a70ed0
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --type=renderer --field-trial-handle=1652,5262761652845492949,10964363532269785807,131072 --enable-features=PasswordImport --lang=ja --extension-process --device-scale-factor=1 --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=6 --no-v8-untrusted-code-mitigations --mojo-platform-channel-handle=4124 /prefetch:1
"C:\Windows\system32\notepad.exe"
Get-Process chrome | foreach { $_.CommandLine -match '^"([^"]+)"(?: (.*))?$'; $Matches }
wintwint

WIP

parser is done.

Get-Process notepad | foreach { $_.CommandLine -match '^"([^"]+)"(?: (.*))?$' >$null; $path,$args=$Matches[1..2]; $path,$args }
Get-Process chrome | foreach { $_.CommandLine -match '^"([^"]+)"(?: (.*))?$' >$null; $path,$args=$Matches[1..2]; $path,$args }

Get-Process chrome | foreach { $_.CommandLine -match '^"([^"]+)"(?: (.*))?$' >$null; $path,$args=$Matches[1..2]; @($path,($args -split ' ')) }
wintwint

PowerShell、タブ補完が効きやすいから使いやすかった

このスクラップは2021/08/26にクローズされました