我有一个 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
}