从参数解析 ImagePath 路径

从参数解析 ImagePath 路径

我有一个 powershell 脚本,它遍历下面列出的所有服务,HKLM:\Systemn\ControlSet001\services\查看ImagePath它是否有空格但没有引号。

例如

C:\this is\very bad\but people\do it\anyways.exe

但是,这些可能包含如下开关/参数:

C:\this is\very bad\but people\do it\anyways.exe -foo -bar -ray:JkLmOpQ-或者-C:\this is\very bad\but people\do it\anyways.exe /foo /bar /ray:JkLmOpQ

很简单,只需将没有参数的内容括在引号中即可,

例如

$foo = "`"$bar`""

不过,我想正确处理可能有参数的事情,例如

"C:\this is\very bad\but people\do it\anyways.exe" -foo -bar -ray:JkLmOpQ
"C:\this is\very bad\but people\do it\anyways.exe" /foo /bar /ray:JkLmOpQ

/考虑使用 RegEx 或在或上拆分字符串,-但这些可能存在我遗漏的边缘情况。

答案1

我查看了这个问题,发现似乎是 Program Files 中的空格导致了这个问题。

这是我为了调查而创建的 PowerShell 脚本。

Clear-Host
$keys = Get-ChildItem HKLM:\System\ControlSet001\services
$items = $keys | Foreach-Object {Get-ItemProperty $_.PsPath }
ForEach ($item in $items) {
If ($item.ImagePath -match " " -and $item.ImagePath -notmatch "`"" -and $item.ImagePath -match "Program Files") {
"{0,-28} {1,-120} " -f $Item.PSChildName, $item.ImagePath 
}
}

[据我所知,空格会导致什么问题,因为我发现两个 Nvidia 图像的路径周围没有引号]

答案2

最简单的方法就是替换字符串。我曾用这种方法解决过类似的图像路径问题。

if(($Temp.ImagePath -notlike "*`"*") -AND ($Temp.ImagePath -like "*.exe*")) `
   {
      if($Temp.ImagePath -like "*D:\*") (repeat for "*C:\*")
         {
             $Temp.ImagePath = $Temp.ImagePath.Replace("D:\", "`"D:\")
         }

      $NewPath = $Temp.ImagePath -replace ".exe", ".exe`""

      Set-ItemProperty -Path "HKLM:\SYSTEM\currentControlSet\Services\$currentService" -Name ImagePath -Value $NewPath
   }

相关内容