如何用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实现方案
你的尝试脚本存在三个核心问题:
- 变量作用域限制:
create_parity方法无法读取外部定义的parity_tool等参数,Ruby方法默认不能直接访问外部局部变量。 - 路径匹配错误:
Dir.glob未指定工作目录,会在脚本运行目录而非设定的working_directory下搜索文件。 - 空格兼容问题:文件名含空格时,
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
相关产品推荐
相关产品推荐

