![将批处理文件重写为 powershell](https://linux22.com/image/1616721/%E5%B0%86%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E9%87%8D%E5%86%99%E4%B8%BA%20powershell.png)
我有一个批处理文件,它查看 inf 文件并找到 open=Open= 或 OPEN= 并运行程序。
@echo off
setlocal ENABLEDELAYEDEXPANSION
set _drive=W:
set _cmd=
cd /d !_drive!\
for /f "tokens=1,2* delims==" %%i in (autorun.inf) do (
if "%%i"=="open" set _cmd=%%j
if "%%i"=="Open" set _cmd=%%j
if "%%i"=="OPEN" set _cmd=%%j
)
if not defined _cmd (
echo Unable to parse autorun.inf and find 'open='
) else (
!_drive!\!_cmd!
START !_drive!
)
endlocal
我希望有人比我更擅长使用 powershell,可以引导我找到正确的方向,因为我已经在网上搜索了一段时间。所以我应该提到这是原文作者
答案1
免责声明:本文是在短时间内通过一些基本的谷歌搜索整理而成的。因此,可能有更有效和/或更强大的方法来处理下面的脚本(例如通过将命令连接在一起)。
假设您只是想读取autorun.inf
并启动.exe
在例如之后找到的文件(或您拥有的文件)open=
,您可能需要尝试与以下类似的操作:
例如 Search_INF.ps1
# Open "autorun.inf", search for a string containing ex. "open=", then perform
# actions based on the string found.
# --- Variables ---
$_drive = 'W:'
$_file = 'C:\path\to\autorun.inf'
# --- Main ---
# Use Select-String to find a given -Pattern in the $_file.
$_match = Select-String -Path $_file -List -Pattern 'open='
# Check the value of $_match.Line. If there were no matches (i.e. $_match.Line
# is $null), let the user know and exit the script.
if ($_match.Line -eq $Null) {
Write-Output ''
Write-Output 'Unable to parse autorun.inf and find "open="'
Exit
}
# Returns just the matched string (ex. "open=program.exe") from $_match.
$_program = $_match.Line
# Slice off the first five characters (i.e. "open=") of e.g. "open=program.exe"
# (leaving just ex. "program.exe")
$_program = ($_program).Substring(5)
# Build the command string.
$_cmd = $_drive + '\' + $_program
# Start the program (ex. as "W:\program.exe")
START $_cmd
# Open the specified $_drive in Explorer. Equivalent to e.g. "start W:" in CMD.
CMD /C START $_drive
要运行上述脚本,请powershell
从命令行调用,确保指定脚本的路径,例如:
powershell .\search_inf.ps1
(假设命令窗口与您的文件在同一目录中打开.ps1
)。
请注意,除非您明确允许,否则 Windows 可能不允许您运行 PowerShell 脚本。
笔记
在上面的脚本中,
Select-String
最初设置$_match
为例如Path\to\autorun.inf:2:open=program.exe
。使用该
-List
选项,Select-String
仅返回给定输入文件的匹配文本的第一个实例。open=
不区分大小写(Select-String
据我所知,这是 的默认设置)。因此,在原始脚本中,它应该涵盖open=
、Open=
和。OPEN=
open=
可能适用shellexecute=
于某些autorun.inf
文件。$_match.Line
仅返回匹配的行(例如open=program.exe
),而不是例如Path\to\autorun.inf:2:open=program.exe
。根据粗略测试,该
CMD /C START $_drive
语法似乎仅适用于裸驱动器号(例如W:
)。$_file = 'C:\path\to\autorun.inf'
是占位符。例如$_file = $_drive + '\autorun.inf'
,假设autorun.inf
位于 ex 的根目录中W:\
。
PowerShell 资源
微软
ThinkPowerShell.com
StackOverflow.com
SS64.com
答案2
电源外壳。简短而甜蜜。将任何命令复制到网络搜索中即可阅读 MS 文档。
编辑:代码改进,以处理命令行参数并检查“ShellExecute”
$Drive = 'W:'
Set-Location $Drive
$Run = ( Get-Content autorun.inf | ?{ $_ -match 'Open=|ShellExecute=' }) -replace 'Open=' -replace 'ShellExecute='
If ( !($Run) ) {
echo 'No "Open" or "ShellExecute" statement in the "autorun.inf" file.'
} Else {
$Run = $Run.Split(' ')
$Splat = @{ 'FilePath' = $Run[0] }
If ($Run.Count -gt 1) {
$Splat += @{ 'ArgumentList' = $Run[1..$Run.Count] }
}
Try {
If ( Test-Path $Splat.FilePath ) {
$Splat.FilePath = (Resolve-Path $Splat.FilePath).Path
Start-Process @Splat
} Else {
echo "'$($Run[0])' is not a valid path to executeable."
}
} Catch {
Echo "An error occured when attempting to run '$($Run[0])'"
}
explorer "."
}