JMeter中通过OS Process Sampler重命名文件后如何获取正确文件名?
解决JMeter中获取重命名后文件正确名称的问题
问题根源
你遇到的问题是因为${__time(,postfix)}函数每次被调用时都会生成新的时间戳:当你在OS Process Sampler里用它生成重命名后缀后,后续再引用${postfix}时,这个变量可能已经被重新赋值(比如循环迭代中再次调用__time),或者因变量作用域限制,拿到的并非当时重命名所用的那个时间戳。
解决方案
方案1:提前固定时间戳变量(单文件/批量统一后缀)
如果20个文件需要共用同一个时间戳后缀,或者仅处理单个文件:
- 在OS Process Sampler之前添加一个JSR223 Sampler,用Groovy脚本生成并固定时间戳变量:
// 生成时间戳并存储到postfix变量 def timestamp = __time(,); vars.put("postfix", timestamp); - 随后在OS Process Sampler的重命名命令中直接使用
TestFile_${postfix}.docx,后续任何地方引用${postfix}都会是同一个正确的时间戳,完全对应重命名后的文件名。
方案2:批量处理时逐个保存文件名(每个文件独立后缀)
如果20个文件需要各自的专属时间戳后缀:
- 在Loop Controller(循环20次)内部,先添加JSR223 Sampler生成当前迭代的时间戳:
def currentPostfix = __time(,); vars.put("currentPostfix", currentPostfix); // 可选:将文件名存入列表,方便后续批量调用 def fileName = "TestFile_${currentPostfix}.docx"; def fileList = vars.getObject("fileList") ?: []; fileList.add(fileName); vars.putObject("fileList", fileList); - 接着在同一次循环的OS Process Sampler中,用
TestFile_${currentPostfix}.docx作为新文件名,确保每个文件的后缀独立且准确。后续可结合ForEach控制器遍历${fileList},获取所有重命名后的文件名。
方案3:事后扫描目标文件夹获取文件名
如果无法提前固定变量,可在OS Process Sampler执行完成后,用脚本扫描目标文件夹匹配文件名:
- 添加JSR223 Sampler,用Groovy代码查找目标文件夹中符合命名规则的文件:
// 替换为你的目标文件夹绝对路径 def targetFolder = new File("D:/your/target/folder"); // 匹配以TestFile_开头的docx文件 def matchedFiles = targetFolder.listFiles().findAll { it.name.startsWith("TestFile_") && it.name.endsWith(".docx") }; // 按修改时间排序取最新文件,批量处理时可遍历所有结果 def latestFile = matchedFiles.max { it.lastModified() }; if (latestFile) { vars.put("correctFileName", latestFile.name); } - 之后通过
${correctFileName}即可获取正确的重命名后文件名。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

