我正在尝试编写一个解析目录的脚本,在具有相同名称但扩展名不同的其他文件中找到给定扩展名的3个最新文件,然后将输出传递给命令行程序。
到目前为止,我有:
$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0] argumentB "argumentC"
\path\program argumentA $file[1] argumentB "argumentC"
\path\program argumentA $file[2] argumentB "argumentC"
不确定它是否重要但是参数2需要引用程序才能使用它。我最终会将输出写入文件,或者最好使用红利问题中描述的另一行代码中的输出。
我遇到的问题是,当我使用$ file [0]作为参数时,没有任何反应。当我使用存储在$ file [0]中的文件名而不是使用该变量时,它会运行,但不会传递argumentB或argumentC。如果我从cmd运行它,我会得到正确的输出。
我的问题是: 如何让程序识别变量? 如何让程序识别其他参数?
奖金问题: 该程序将输出一个文件列表。除了程序输出中列出的文件外,如何删除给定文件夹中的所有内容?
答案 0 :(得分:0)
尝试
$($file[0])
我发现我经常需要在“魔法”美元符号括号中包装它们以使它们在PowerShell中工作。
答案 1 :(得分:0)
由于您要选择Select-Object
并选择FullName
属性,因此您有3个System.Management.Automation.PSCustomObject
类型的对象,其FullName
属性。当您将对象用作程序的命令行参数时,应该访问该对象的FullName
属性,如下所示:
$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
\path\program argumentA $file[0].FullName argumentB "argumentC"
如果从Select-Object
cmdlet中删除fullname属性,Powershell将不会创建PSCustomObject,您可以从原始System.IO.FileInfo
对象访问所有属性和方法。
这就是你如何看待差异:
PsCustomObject
$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3
$file[0] | gm
<强> System.IO.FileInfo 强>
$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select -last 3
$file[0] | gm
答案 2 :(得分:0)
我实际上会使用一个循环来避免重复。 (这样你就可以避免复制和粘贴错误并简化问题,特别是如果你稍后添加错误处理或其他任何事情)。
$files = dir test -Exclude *.md5 | sort -prop LastWriteTime |
select fullname -last 3
foreach ($file in $files) {
& \path\program argumentA $file argumentB "argumentC"
}
由于PS无论如何都会将集合视为与普通对象相同,即使您只选择了1个对象,这也是有效的。