2016-11-21 19 views
0

winscp.comを使用して.ppkに変換する.pemファイルのリストがあります。フォルダ内のすべてのファイルに対してコマンドを実行します

コマンドは次のとおりです。

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

自動的にフォルダ内のすべての*の.pemファイルを読み込み、PPKに変換するスクリプトを書くにはどうすればよいですか?

は私が開始

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

のためにこれを使用する必要が推測しかし、それは、コマンドの行を交換し、フォルダ内のPEMファイルのすべての数十を処理するので、どのように私はそれをファイル名をキャプチャして作るのですか?

答えて

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" 
} 
+0

ありがとうございました! は、変数をwinscp.comの場所に追加しただけで、 $ scpfile – MisterM

0

ファイル名とフルネームが表示されます。違いは、完全な名前には完全なパスが含まれ、名前はファイル名だけです。

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

これを実行するとわかります。だから、このような名前をつけて、$ name変数を使ってforeachループの中で他のコマンドを実行することができます。

0

この

$msbuild = "C:\pathofexefile\WinSCP.com" 
$formatstring="/keygen {0} /output={1}.ppk" 

Set-Location "c:\temp" 

gci -file -Filter "*.txt" | %{$arguments=($formatstring -f $_.FullName, $_.BaseName);start-process $msbuild $arguments } 
関連する問題