将文件名作为参数传递给函数的脚本[重复]

Posted

技术标签:

【中文标题】将文件名作为参数传递给函数的脚本[重复]【英文标题】:Script that pass file names as arguments to function [duplicate] 【发布时间】:2017-08-04 22:31:05 【问题描述】:

我有一个名为 threshold 的程序。我在一个名为 images 的目录中有一组图像。

|-- images
|   -----img_1.jpg
|   -----img_2.jpg
|   -----img_3.jpg
|   ------
|   ------img_n.jpeg
|-- threshold.exe
|-- myscript

如何编写 bash 脚本,使其接受目录名作为参数,并将目录中的每个文件作为参数单独传递给程序 threshold.exe。

如果我执行,

$./myscript images 

最后的执行应该是这样的。

./threshold.exe img_1.jpg./threshold.exe img_2.jpg........./threshold.exe img_n.jpg

【问题讨论】:

你自己尝试了什么/ 运行时,您的批处理文件将为您提供“内部”变量。假设一个批处理文件“DoIt.bat”。像 doit.bat "c:\folder path\to\wherever" 这样的调用会将 "c:\folder path\to\wherever" 参数停放在变量 %1 中。因此,您将查询 %1 的文件列表并将每个文件传递给threshold @file。 ForFiles / Batch parameters 玩得开心。试试看,发布您的代码,我们将帮助您走得更远。不过,您在 Windows 中吗? 类似 'for %%i in (path to directory \ *.jpg) do threshold.exe %%i' 我猜这应该可行.. 顺便说一句,./threshold img_1.jpg 不起作用,因为threshold 位于父目录中,而不是当前目录中。您想要./threshold images/img_1.jpg 或与../threshold img_1.jpg 等效的名称。 未来,顺便说一句,试着关注***.com/help/mcve -- 发布一个问题,不仅描述你想做什么,还描述你尝试了什么,它是如何失败的,以及 导致相同故障的最短代码量,其构造使得其他人(不仅仅是您)可以运行它并看到相同的结果。 【参考方案1】:

假设您在 Windows 环境中。

forfiles /p %1 /m *.jpg /c "cmd /c threshold.exe @file"

-对于路径中的每个文件 (/p) %1

-其中 %1 是传递的参数,也就是您要搜索的文件夹

-运行命令(/ccmd /c threshold.exe @file

-其中@file代表jpg文件的路径

【讨论】:

鉴于 OP 提出的是“bash”问题而不是“batch”问题,并使用 ./ 启动他们的程序,这看起来不是一个安全的假设。 (...虽然.exe 扩展名有点冲突,但这不是一个确定的事情——在您的Unixen 上使用Mono 运行的CLR 可执行文件或使用Wine 运行的PE 文件通常仍然安装有扩展名完好无损)。 @CharlesDuffy,基于相同的队列,我也很确定他没有运行 Windows。希望这些信息仍然可以帮助他或正在寻找类似答案的人。【参考方案2】:
#!/bin/bash
for dir; do
  for f in "$dir"/*; do
    ./threshold.exe "$f"
  done
done

这表现如下:

首先,迭代命令行参数,将每个参数视为一个目录 接下来,遍历当前目录中的文件 然后,为每个文件调用您的可执行文件

请注意,这将是./threshold.exe images/img_1.jpg 的形式,而不是./threshold img_1.jpg 的形式——这是必要的,以便我们从实际包含 @ 的目录中运行./threshold.exe 987654325@,并且仍然为您的文件提供有效的相对路径。

【讨论】:

以上是关于将文件名作为参数传递给函数的脚本[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#将方法作为参数传递给另一个方法[重复]

将命令行参数传递给python脚本[重复]

如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]

将文件扩展名作为参数传递给powershell脚本

将带有空格的路径作为参数传递给 bat 文件

将方法作为参数传递给另一个方法[重复]