2016-11-21 1 views
0

J'ai une liste de fichiers .pem que je veux convertir en .ppk en utilisant winscp.com.Exécuter la commande sur tous les fichiers du dossier

La commande est:

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

Comment ne pas écrire un script qui lira automatiquement tous les fichiers * .pem dans le dossier et les convertir en PPK?

Je présume que je dois utiliser pour un départ

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

Mais comment puis-je capturer les noms de fichiers et de faire en sorte qu'il remplacera les lignes dans la commande et de traiter tous les dizaines de fichiers GDP dans un dossier?

Répondre

1

& est le PowerShell call operator. $_ est un automatic variable contenant l'objet actuel dans un pipeline, dans ce cas System.IO.FileInfo objets. Pour ce type d'objet, l'expression & $_ appelle le gestionnaire par défaut (le programme associé) sur le fichier, comme si vous aviez cliqué deux fois sur le fichier dans l'Explorateur.

Pour que le code fasse ce que vous voulez, vous devez remplacer $_ par votre instruction winscp.com et remplacer les littéraux de nom de fichier par des variables appropriées. Utilisez $_.FullName pour le nom complet du fichier. Changez l'extension pour le fichier de sortie et placez ce chemin dans une variable différente.

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

fonctionne comme un charme - merci! vient d'ajouter une variable à l'emplacement winscp.com et il convertit $ scpfile – MisterM

0

Cela vous donnera le nom du fichier et le nom complet. La différence est le nom complet comprend le chemin complet et le nom est juste le nom du fichier.

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

Si vous exécutez cela, vous comprendrez. Vous pouvez donc obtenir le nom comme ceci, puis lancer n'importe quelle autre commande dans la boucle foreach avec la variable $ name.

0

essayer quelque chose comme ça

$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 }