【问题标题】:Using PowerShell to pass all files of a folder as arguments to a command line program使用 PowerShell 将文件夹的所有文件作为参数传递给命令行程序
【发布时间】:2021-11-20 11:52:09
【问题描述】:

我正在尝试为安全文件传输工具创建文件夹的文件列表。我就是这样做的:

Get-ChildItem c:\files | % {$_.FullName} > c:\temp\list1.csv
$csv = Import-Csv C:\TEMP\list1.csv -Header Path

输出将每个文件保存在一个新行中,但我需要它在一行中。

需要的输出

"C:\files\Alpha" "C:\files\Beta" "C:\files\Gamma" "C:\files\Delta"

实际输出

C:\files\Alpha
C:\files\Beta
C:\files\Gamma
C:\files\Delta

csv 文件正是我首先想到的。包含上述格式的文件的变量就足够了。你有什么想法吗?

编辑:谢谢@Matthias R. Jessen 和@WaitingForGuacamole,你们给了我想要的东西。

(Get-ChildItem C:\scripts -File).ForEach({'"{0}"' -f $_.FullName.Replace('"','\"')}) -join " "

但是,不知何故,我的工具(用 java 编写)将输出解释为一个文件,而不是一行中的多个文件。 错误信息下方:

Java : Error: The file 'C:\files\Alpha C:\files\Beta C:\files\Delta C:\files\Gamma' was not found and is excluded from the transfer.

我知道,当使用属性文件而不是在 PowerShell 中手动输入命令时,我必须以不同的方式切换路径。 有没有办法让输出看起来像:

"C:\\files\Alpha" "C:\\files\Beta" "C:\\files\Gamma" "C:\\files\Delta"

【问题讨论】:

  • -join@(Get-ChildItem C:\files -File).ForEach({'"{0}"' -f $_.FullName.Replace('"','\"')})
  • Mathias - 我不得不说我真的很喜欢你的 Powershell 的优雅和紧凑。您在此处提供的示例完成了除了元素之间的空间之外的所有操作。我将它调整为:(Get-ChildItem C:\scripts -File).ForEach({'"{0}"' -f $_.FullName.Replace('"','\"')}) -join " ",这样我就可以添加分隔符,它似乎可以工作
  • 谢谢,我已经根据新的挑战更新了问题
  • 嗨@SuperiorOven,欢迎来到StackOverflow!我建议您在最近的编辑之后也更改您的标题,以便它反映您实际要求的内容:“将文件夹的所有文件作为参数传递给命令行程序”。

标签: powershell variables get-childitem csv-import


【解决方案1】:

要将特定文件夹的所有子文件夹的文件路径作为单独的参数传递给命令行程序,只需传递

的结果
(Get-ChildItem -File).FullName

到程序。示例:

$files = (Get-ChildItem C:\MyFolder -File).FullName

# Expected: myprogram.exe -arg1 -arg2 C:\MyFolder\file1.txt C:\MyFolder\file2.txt ...
myprogram.exe -arg1 -arg2 $files

【讨论】:

  • 谢谢@Zeemee。这就是我需要的!
猜你喜欢
  • 2010-11-06
  • 2016-06-20
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
相关资源
最近更新 更多