如何使用PowerShell递归调用Java程序并传入文件路径

4szc88ey  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(146)

我正在尝试批量重命名一个文件夹中的文件。例如,现在我想删除给定文件夹中所有文件名第二个索引处的字符。我已经编写了一个Java程序,它将在给定文件路径的情况下执行此操作。
问题是我正在尝试用PowerShell批量处理流程,对PowerShell的了解非常少,基本上今天才开始使用,而且主要是从命令行测试运行我的Java程序。我决定为此尝试PowerShell,因为我看到了YouTube上的一个视频,有人递归地使用PowerShell删除某个字符(就像一个“-”)从它出现在文件夹中每个文件名的每一个点。我想也许我可以用PowerShell递归来批处理更改每个文件名的过程。
我想用PowerShell递归调用Java程序,让PowerShell把文件夹中每个文件的路径一个接一个地传递给Java程序,我不知道这是否可行,但我希望可以。
我试过以下方法,但由于我对PowerShell没有任何了解,我真的不知道该尝试什么。“Copy”是我想修改的文件所在的文件夹的名称。

get-childitem -recurse | java -cp "C:\Users\Media PC\Documents\Renamer\src\main\java" org.example.Main $_.name

我正在运行Java程序,因为我从程序返回了一个错误,说我没有传入正确的文件路径。

9lowa7mx

9lowa7mx1#

基于Abraham Zinala的有用评论:
撇开 * 逐个文件 * 调用外部程序(即,创建 * 子进程 *)是低效的这一事实不谈:

Get-ChildItem -File -Recurse | ForEach-Object {
  java -cp "C:\Users\Media PC\Documents\Renamer\src\main\java" org.example.Main $_.FullName
}

注意:-File开关将结果限制为仅 * 文件 *(不包括 * 目录 *)。

  • PowerShell的自动$_变量只能在script blocks ( { ... } )内部使用,因此使用$_.name作为参数 as-is 将不起作用。
  • 请参阅this answer以了解所有有意义地定义$_的上下文。
  • 要将参数传递给 * 未设计为直接从管道获取输入的命令 *,请使用ForEach-Object cmdlet自定义处理每个输入对象 * 一次一个 *。
  • 在传递给它的脚本块中,您 * 可以 * 使用$_来引用手头的管道输入对象。
  • Get-ChildItem输出以下.NET类型的示例:
  • System.IO.DirectoryInfo(用于 * 目录 *)和
  • System.IO.FileInfo(用于 * 文件 *)
  • 它们的.FullName属性包含它们的 * 完整的文件系统本机路径 *,因此$_.FullName是引用该路径的一种健壮的方式。由于.Name仅报告文件 * 名称 *,因此在对当前目录的 * 递归 * 遍历中不足以识别手头的文件。
  • PowerShell (Core) 7+中,你可以只使用$_,因为有这样的示例 * 一致地 * 字符串化为它们的.FullName属性的值(当传递参数给一个 * 外部程序 * 时,对象被 * 隐式地 * 字符串化)-不幸的是,在 Windows PowerShell 中 * 不是 * 这种情况;参见this answer

相关问题