Voici un script PowerShell qui permet de transférer un dossier vers un serveur FTP.
Ce script upload le dossier avec tous les sous dossiers et les fichiers.
$user = "guest"
$password = "Powershell"
$localdir = "C:\Scripts"
$ftpdir = "ftp://ftp.server.com/uploads/"
$client = New-Object System.Net.WebClient
$client.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$parentfolder = $localdir.split("\")[-1]
Write-Host "Création de $parentfolder"
$makedir = [System.Net.WebRequest]::Create($ftpdir+$parentfolder);
$makedir.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$makedir.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;
$makedir.GetResponse();
foreach($item in Get-ChildItem -recurse $localdir){
$filename = [system.io.path]::GetFullPath($item.FullName).SubString([system.io.path]::GetFullPath($localdir).Length + 1)
if ($item.Attributes -eq "Directory"){
try{
Write-Host "Création de $item.Name"
$makedir = [System.Net.WebRequest]::Create($ftpdir+"/"+$parentfolder+"/"+$filename);
$makedir.Credentials = New-Object System.Net.NetworkCredential($user,$password)
$makedir.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;
$makedir.GetResponse();
}
catch [Net.WebException] {
Write-Host $item.Name probably exists ...
}
continue;
}
Write-Host "Transfert de $item..."
$file = New-Object System.Uri($ftpdir+"/"+$parentfolder+"/"+$filename)
$client.UploadFile($file, $item.FullName)
} |
.
Pour copier le résultat d’une commande Powershell directement dans le presse-papier, il suffit de rajouter « | clip » à la fin de celle-ci.
Il de reste plus qu’à aller faire le coller ou vous le souhaitez.
Dans votre profile, vous souhaitez vous connecter automatiquement à votre disque USB.
Il peut arriver que la lettre change.
Pour retrouver systématiquement la lettre de votre disque, voici un méthode.
$drive = get-psdrive | where-object { $_.description -eq "Disk Label" }
Set-Location $drive.root |
Voici comment extraire les 8 derniers caractères d’une chaine.
$log = "sys000456.log"
$log.Substring($log.Length-8,8) |
Chacun ces petites habitudes sous Powershell.
Voici comment créer son profile et charger la configuration que l’on souhaite à l’ouverture de Powershell.
Identifiez le chemin de votre profile.
Sous Windows Seven, le résultat devrait ressembler à ‘C:\Users\Christophe\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1′
Vérifiez la présence du profile.
Si la réponse et « True », lancez:
Si la réponse est « False », il faut au préalable créer le fichier.
New-Item -Path $profile -Type file -Force
notepad $profile |
Une fois dans le fichier, vous pouvez ajouter toutes les commandes que vous souhaitez exécuter à l’ouverture de Powershell.
Exemple:

Relancez Powershell pour admirer le résultat.
Pour scripter des taches sur des sites web avec Internet Explorer.
Voici quelques astuces.
Tout d’abord lancer une page.
$ie = New-Object -COMObject InternetExplorer.Application
$ie.visible = $true
$ie.Navigate('http://aidexchange.fr')
While ($ie.Busy) { Start-Sleep -Milliseconds 400 } |
Afficher la liste des images
$ie.document.getElementsByTagName('img') | Select-Object -ExpandProperty src |
Afficher la liste des liens
$ie.document.getElementsByTagName('a') | Select-Object -ExpandProperty href |
Cliquer sur un lien.
$link = $ie.Document.getElementsByTagName('a') | where-object {$_.title -eq 'Linkedin'}
$link.click() |
Si vous souhaitez télécharger un document, une image ou un tout autre type de fichier, il faut charger le module « BitsTransfer » qui vous donnera accès a toute une série de cmdlets.
Import-Module BitsTransfer
Get-Command -Module BitsTransfer
CommandType Name Definition
----------- ---- ----------
Cmdlet Add-BitsFile Add-BitsFile [-BitsJob] [-Source] [-V...
Cmdlet Get-BitsTransfer Get-BitsTransfer [[-Name] ] [-AllUsers...
Cmdlet Remove-BitsTransfer Remove-BitsTransfer [-BitsJob] [-Ver...
Cmdlet Resume-BitsTransfer Resume-BitsTransfer [-BitsJob] [-Asy...
Cmdlet Set-BitsTransfer Set-BitsTransfer [-BitsJob] [-Displa...
Cmdlet Start-BitsTransfer Start-BitsTransfer [-Source] [[-Desti...
Cmdlet Suspend-BitsTransfer Suspend-BitsTransfer [-BitsJob] [-Ve... |
Et donc pour télécharger un document.
Start-BitsTransfer -Source 'http://aidexchange.fr/plus.png' -Destination 'c:\images\' |
Avec tous ces éléments il est possible de scripter le téléchargement quotidien d’un fichier sur un site web, le téléchargement rapide toutes les images d’une page ou toute autres idées tordues.
D’autres infos.
Je n’aime pas le photos prise en portrait. A chacun ces goûts.
Voici le moyen que j’ai trouver pour toutes les supprimer d’un coup.
$image = New-Object -ComObject Wia.ImageFile
Get-ChildItem -Recurse -Include *.jpg -Path "..\images" | foreach {
$file = $_.fullname
$image.LoadFile($file)
if ( $image.Width -gt $image.Height) {
Remove-Item -Path $file -Force
}
} |
Une petite ligne rapide pour tester la présence d’un dossier et le créer si absent.
If (-not (Test-Path "dossier_test")) { New-Item -ItemType Directory -Name "dossier_test" } |
Mon problème, j’utilise plusieurs appareils photos et mon smartphone pour immortaliser ma petite famille. De ce fait, je me retrouve avec des photos DSC… partout. Je souhaite les classer chronologiquement avec Powershell.
De nombreux programme sous Windows le font en se basant sur EXIF.
Mais quoi de mieux que le faire soit même en Powershell.
Grâces aux Métadonnées EXIF voici ce qu’il est possible de faire.
[reflection.assembly]::loadfile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll") > $null
if ((Test-Path -path "Result") -ne $True)
{
New-Item -Name "Result" -type directory
}
$Files = Get-ChildItem -filter *.jpg
foreach ($file in $Files)
{
$foo=New-Object -TypeName system.drawing.bitmap -ArgumentList $File.fullname
$date = $foo.GetPropertyItem(36867).value[0..20]
$arYear = [Char]$date[0],[Char]$date[1],[Char]$date[2],[Char]$date[3]
$arMonth = [Char]$date[5],[Char]$date[6]
$arDay = [Char]$date[8],[Char]$date[9]
$strYear = [String]::Join("",$arYear)
$strMonth = [String]::Join("",$arMonth)
$strDay = [String]::Join("",$arDay)
$DateTaken = $strYear + "-" + $strMonth + "-" + $strDay
$time = [Char]$date[11],[Char]$date[12],[Char]$date[14],[Char]$date[15],[Char]$date[17],[Char]$date[18]
$strtime = [String]::Join("",$time)
$taken = $DateTaken + "-" + $strtime + ".jpg"
$TargetPath = ".\result\" + $taken
Copy-Item -PassThru $File.fullname -Destination $TargetPath
} |
Cette commande vous permet de lister uniquement les répertoires et sous-répertoires du dossier courant.
Sans le filtre, Get-ChildItem vous affiche les dossiers et les fichiers.
Get-ChildItem -Recurse | Where-Object { $_.PSIsContainer } | Select-Object Name,Fullname |