Closed38
PowerShell でプロセスを再起動したい
ピン留めされたアイテム
一旦やりたかったこと
一旦は、やりたかったことを実現できた。
Get-Process LogiOptionsMgr | foreach { Stop-Process $_; Start-Process $_.Path }
Get-Process LogiOptionsMgr | foreach { kill $_; start $_.Path }
ピン留めされたアイテム
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 }
結局スクリプトは使わなかった
PowerShell まじめにやるの初めて
参考スクリプト
archive:
仕様
パス取得
Get-Process -Id $id | Select-Object -Property CommandLine
スクリプト化するにあたって、自己署名証明書を使いたい
ダウンロードしたスクリプトファイルのインターネット経由属性を消すだけで大丈夫そう。
もちろん中身は読んでおく。
→ 結局動かない模様
とりあえず停止まで
notepad
Get-Process notepad | Stop-Process
ファイルパスから起動したい
xargs 的なことがわからない
xargs できるらしい
%
ってなんだ
> 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.
起動はできたけど、多重起動はエラーになる
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: 指定されたファイルが見つかりません。
wait がない?
return each object after a loop
Get-Process notepad | % { $_ }
多分ファイルシステムレベルで競合してる。
パスはあるようだが…?
Get-Process notepad | foreach { Test-Path $_.Path }
True
True
True
True
ロックをとってる?
.CommandLine
じゃなきゃ問題なかった
Get-Process notepad | foreach -Parallel { Start-Process $_.Path }
CommandLine
はパスじゃない。
Get-Process notepad | foreach -Parallel { Test-Path $_.CommandLine; $_ }
そうなると、 CommandLine
は分解して渡さないとな
args がなかったらパースは省略できる。
引き続き -ArgumentList
の対応を考える。
分割するだけだから、ほとんどパースじゃない
Get-Process chrome | foreach { $_.CommandLine.Split(" ") }
"
エスケープの考慮が必要
あとは配列操作だけ
とりあえず "
で分割
Get-Process notepad | foreach { $_.CommandLine.Split('"')[1] }
args
Get-Process chrome | foreach { $args = $_.CommandLine.Split('"')[2].Remove(0, 1).Split(' '); $args.Length }
parsing
Get-Process chrome | foreach { $path,$rest = $_.CommandLine.Remove(0, 1).Split('" '); $args = $rest.Remove(0, 1).Split(' '); @($path,$args) }
結局、正規表現
regex
^"([^"]+)"(.*)$
^"([^"]+)"(?: (.*))?$
test
"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 }
,
op
>$null
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 ' ')) }
foreach
は ScriptBlock
や function
を受け取るようだ
PowerShell、タブ補完が効きやすいから使いやすかった
このスクラップは2021/08/26にクローズされました