将批处理文件重写为 powershell

将批处理文件重写为 powershell

我有一个批处理文件,它查看 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 "."
}

相关内容