对文件夹中的所有文件执行命令

时间:2016-11-21 04:03:51

标签: powershell putty

我有一个.pem文件列表,我希望使用winscp.com转换为.ppk。

命令是:

WinSCP.com /keygen filename.pem /output=filename.ppk

如何编写一个自动读取文件夹中所有* .pem文件并将其转换为ppk的脚本?

我认为我需要使用它作为开始

Get-ChildItem -Recurse -Include "*.pem" | % { & $_ }

但是我如何捕获文件名并使其成为替换命令中的行并处理文件夹中的所有数十个pem文件?

3 个答案:

答案 0 :(得分:1)

&是PowerShell call operator$_是一个automatic variable,它将当前对象保存在管道中,在本例中为System.IO.FileInfo个对象。对于这种对象,表达式& $_调用文件上的默认处理程序(关联程序),就像您在资源管理器中双击该文件一样。

要使代码执行您想要的操作,您需要将$_替换为winscp.com语句,并将文件名文字替换为适当的变量。使用$_.FullName获取文件的全名。更改输出文件的扩展名,并将该路径放在另一个变量中。

Get-ChildItem -Recurse -Include "*.pem" | % {
  $outfile = Join-Path $_.DirectoryName ($_.BaseName + '.ppk')
  & winscp.com /keygen $_.FullName "/output=$outfile"
}

答案 1 :(得分:0)

这将为您提供文件名和全名。不同之处在于全名包括完整路径,名称只是文件名。

 Get-ChildItem c:\users\somefolder -Recurse -filter "*.pem" | foreach{
   $name = $_.Name
   $fullName = $_.FullName
   Write-Output $name
   Write-Output $fullName
 }

如果你运行这个,你就会明白。所以你可以得到这样的名字,然后使用$ name变量在foreach循环中运行任何其他命令。

答案 2 :(得分:0)

尝试类似这样的事情

.gitignore