You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ruby编写脚本为多分段RAR文件创建Parity归档

适配多分段RAR文件的Parity归档Ruby脚本实现

我已经用par2j64.exe写了一个Ruby脚本,能给单个.rar文件创建Parity归档,但现在需要改成支持多分段的.rar文件。


原单个RAR文件的Ruby脚本

# Set parameters for par2j64
parity_tool = "par2j64.exe"
redundancy_percent = "15"
par2_files = "8"
working_directory = "G:/Working"

# Find all RAR files in the specified working directory
rar_files = Dir.glob(File.join(working_directory, "*.rar"))

if rar_files.empty?
puts "No RAR files found in the specified working directory."
else
# Iterate over each RAR file
rar_files.each do |rar_file_path|
# Extract the filename from the file path
rar_file_name = File.basename(rar_file_path)

# Create parity archives for the RAR file
puts "Creating parity archives for #{rar_file_name}..."
Dir.chdir(working_directory) do
  system("#{parity_tool} c /rr#{redundancy_percent} /rf#{par2_files} /rd1 \"#{rar_file_name}.par2\" \"#{rar_file_path}\"")
end
puts "Parity archives created for #{rar_file_name}."
puts
end
end

可用的DOS批处理脚本

rem Search the first file of each splitted RAR archive
for %%F in ("*.part1.rar" "*.part01.rar" "*.part001.rar") do (
    call :SUB_CREATE "%%~nF"
)

echo Parity archive creation complete.
pause

rem Exit script before sub routine
exit

:SUB_CREATE
rem Sub-routine to create PAR files for multiple input files

echo Creating parity archives for multiple %~n1...
%PARITY_TOOL% c /rr%REDUNDANCY_PERCENT% /rf%PAR2_FILES% /rd1 "%~n1.par2" "%~n1.part*.rar"
echo Parity archives created for multiple %~n1.
echo
rem exit subroutine
exit /B

我尝试但无法正常工作的Ruby脚本

# Set parameters
parity_tool = "par2j64.exe"
redundancy_percent = "15"
par2_files = "8"
working_directory = "G:/Working"

# Search the first file of each splitted RAR archive
Dir.glob("*.part1.rar") do |file|
create_parity(file)
end

Dir.glob("*.part01.rar") do |file|
create_parity(file)
end

Dir.glob("*.part001.rar") do |file|
create_parity(file)
end

puts "Parity archive creation complete."
puts "Press Enter to continue."
gets

# Method to create parity archives for multiple input files
def create_parity(file)
puts "Creating parity archives for multiple #{File.basename(file, ".*")}..."
system("#{parity_tool} c /rr#{redundancy_percent} /rf#{par2_files} /rd1 #{File.basename(file, ".*")}.par2 #{File.basename(file, ".*")}.part*.rar")
puts "Parity archives created for multiple #{File.basename(file, ".*")}."
puts
end

正确的Ruby实现方案

你的尝试脚本存在三个核心问题:

  1. 变量作用域限制:create_parity方法无法读取外部定义的parity_tool等参数,Ruby方法默认不能直接访问外部局部变量。
  2. 路径匹配错误:Dir.glob未指定工作目录,会在脚本运行目录而非设定的working_directory下搜索文件。
  3. 空格兼容问题:文件名含空格时,system命令会解析出错,需要给路径添加引号。

修正后的脚本如下:

# 设置par2j64参数
parity_tool = "par2j64.exe"
redundancy_percent = "15"
par2_files = "8"
working_directory = "G:/Working"

# 切换到工作目录执行所有操作
Dir.chdir(working_directory) do
  # 匹配三种分段RAR的首文件格式
  part_patterns = ["*.part1.rar", "*.part01.rar", "*.part001.rar"]
  
  part_patterns.each do |pattern|
    Dir.glob(pattern) do |file|
      base_name = File.basename(file, ".*")
      puts "正在为 #{base_name} 创建奇偶校验归档..."
      
      # 构建命令并添加引号处理空格文件名
      command = "#{parity_tool} c /rr#{redundancy_percent} /rf#{par2_files} /rd1 \"#{base_name}.par2\" \"#{base_name}.part*.rar\""
      system(command)
      
      puts "#{base_name} 的奇偶校验归档创建完成。"
      puts
    end
  end
end

puts "所有奇偶校验归档创建完成。"
puts "按回车键继续..."
gets

关键优化点

  • 直接切换到工作目录执行,避免路径混乱。
  • 合并三种首文件的搜索逻辑,简化代码结构。
  • 给命令中的文件名添加双引号,确保兼容含空格的文件名。

内容的提问来源于stack exchange,提问作者Fred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:47:43