我正在尝试批量重命名一个文件夹中的文件。例如,现在我想删除给定文件夹中所有文件名第二个索引处的字符。我已经编写了一个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程序,因为我从程序返回了一个错误,说我没有传入正确的文件路径。
1条答案
按热度按时间9lowa7mx1#
基于Abraham Zinala的有用评论:
撇开 * 逐个文件 * 调用外部程序(即,创建 * 子进程 *)是低效的这一事实不谈:
注意:
-File
开关将结果限制为仅 * 文件 *(不包括 * 目录 *)。$_
变量只能在script blocks ({ ... }
)内部使用,因此使用$_.name
作为参数 as-is 将不起作用。$_
的上下文。ForEach-Object
cmdlet自定义处理每个输入对象 * 一次一个 *。$_
来引用手头的管道输入对象。Get-ChildItem
输出以下.NET类型的示例:System.IO.DirectoryInfo
(用于 * 目录 *)和System.IO.FileInfo
(用于 * 文件 *).FullName
属性包含它们的 * 完整的文件系统本机路径 *,因此$_.FullName
是引用该路径的一种健壮的方式。由于.Name
仅报告文件 * 名称 *,因此在对当前目录的 * 递归 * 遍历中不足以识别手头的文件。$_
,因为有这样的示例 * 一致地 * 字符串化为它们的.FullName
属性的值(当传递参数给一个 * 外部程序 * 时,对象被 * 隐式地 * 字符串化)-不幸的是,在 Windows PowerShell 中 * 不是 * 这种情况;参见this answer。