script powershell et raccourci envoyer vers

script powershell et raccourci envoyer vers - Infrastructures serveurs - Systèmes & Réseaux Pro

Marsh Posté le 09-05-2016 à 12:19:05    

Bonjour,

 

J'aurai besoin d'aide pour améliorer un peu mon script powershell.
Le but est la conversion d'un fichier tiff vers pdf (ou plusieurs fichiers).

 

L'exécution de ce script se fait par les utilisateur via le clic droit envoyer vers -> convertiff tiff en pdf

 

Le script n'est pas finalisé car si on sélectionne un seul fichier, il me convertis tous les fichiers du dossier courant + des dossiers enfant qu'il va trouver.
Je souhaiterais qu'il convertisse uniquement la sélection lorsque c'est des fichiers qui sont sélectionnés .
Lorsqu'on sélectionne un dossier, le résultat voulu est celui qu'on a avec ce script, c'est à dire toute la descendance.

 

Voici le script actuel :

 

$a=Get-ChildItem -Recurse -Include *.tiff
foreach($b in $a) {
    \\\xxx\Tiff2Pdf\bin\tiff2pdf.exe $b -o "$b.pdf"  
}
Get-ChildItem -Recurse -Include *.tiff.pdf | rename-item -newname {$_.name -replace ".tiff.pdf",".pdf"}

 


Je sais que c'est pas tres joli le renommage à la fin, mais je suis pas très bon en powershell, j'ai fais comme je savais faire.
C'est parce que sinon tous les fichiers convertis se retrouve en toto.tiff.pdf

 


Message édité par matteu le 09-05-2016 à 21:21:58

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 09-05-2016 à 12:19:05   

Reply

Marsh Posté le 09-05-2016 à 19:57:46    


Bonjour,  
 
deja avant de faire un $a=Get-ChildItem -Recurse -Include *.tiff  
 
il faut determiner si il s'agit d'un ou plusieur dossiers ou un ou plusieur fichiers ou un mix des 2
 
dans le cas de fichier il verifier qu'il s'agit de fichier tiff.
 
test fichier ou dossier :
 
f(Test-Path $_ -pathType container){"dossier"}
if(Test-Path $_ -pathType leaf){"fichier"}
 
type de fichier :
 
[System.IO.Path]::GetExtension($fichier)
 
ce qui donne :
 
debut boucle des arguments
  pour chaque item determiner fichier ou dossier
  si fichier
      verifier si fichier tiff
          convertir
   si dossier
      debut boucle les fichier a l'intereur tiff
           pour chaque fichier  
                    convertir
 
       fin boucle fichier
fin de boucle argument
                       
       

Reply

Marsh Posté le 10-05-2016 à 07:57:27    

Merci beaucoup pour ton retour très constructif.
Je vais essayer de suivre ton algo.

 

J'avais fais ca moi au mieux :

 

$a=Get-ChildItem -Recurse -Include *.tiff | out-gridview -passthru
foreach($b in $a) {
    $out=$b.Fullname -replace (".tiff",".pdf" )
    \\xxx\Tiff2Pdf\bin\tiff2pdf.exe $b -o $out  
}

 

C'est fonctionnel, mais faut Powershell v3

 

Faut aussi que je regarde un peu sur le net pour pouvoir lancer le script sans mettre l'execution policy a unrestricted si c'est faisable ou non et apres terminus :p

 

Aller je m'attaque a ton algo

 

Voila ce que je pensais :

 

foreach ($a in $_) {
    if(Test-Path $a -pathType container){
    $fichiers=Get-ChildItem -Recurse -Include *.tiff
        foreach($b in $fichiers) {
            $out=$b.Fullname -replace (".tiff",".pdf" )
            \\xxx\Tiff2Pdf\bin\tiff2pdf.exe $b -o $out  
        }
    }
    if(Test-Path $a -pathType leaf){
        $type= [System.IO.Path]::GetExtension($fichier)
        if ($type -eq ".tiff" ){
                $out=$a.Fullname -replace (".tiff",".pdf" )
                \\xxx\Tiff2Pdf\bin\tiff2pdf.exe $a -o $out  
        }
    }  
   
}

 

Mais ca ne marche pas ^^ et mon foreach ($a in $_) je suis pas persuadé que ca fonctionne et c'est de la que vient mon problème principal je parie :)
Comment dire à powershell, parmi tout ce que je te donne comme arguments/paramètres ... fait ca

 


Après quelque recherche il semblerait qu'il faille remplacer par foreach ($a in $args) {

 


Message édité par matteu le 10-05-2016 à 09:18:59

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 10-05-2016 à 09:03:52    

Pour l'évolution du script, il fonctionne pour 1 fichier. mais pas pour plusieurs, je vois que $args contient tous les fichiers que je selectionne a la suite les un des autres avec un espace. Donc en gros, c'est pas un tableau comme je le pensais. Et c'est la ou ca se corse bien comme il faut parce que je sèche complet ^^

 

j'en suis la :

 

foreach ($a in "$args" ) {
    if(Test-Path $a -pathType container){
        $fichiers=Get-ChildItem $a -Recurse -Include *.tiff
        foreach($b in $fichiers) {
            $out=$b.Fullname -replace (".tiff",".pdf" )
            \\mecahers.net\data\SHAREAPPLICATION\Tiff2Pdf\bin\tiff2pdf.exe $b -o $out  
        }
    }
    if(Test-Path $a -pathType leaf){
        $type= [System.IO.Path]::GetExtension($a)
        if ($type -eq ".tiff" ){
                $out=$a -replace (".tiff",".pdf" )          
                \\mecahers.net\data\SHAREAPPLICATION\Tiff2Pdf\bin\tiff2pdf.exe $a -o $out                  
        }
    }  
   
}

 

Donc en fait, il me reste 1 problème à régler et à priori apres ce serait bon.
imaginons que je selectionne 2 fichier : "mon fic 1" et "mon fic 2"
le probleme est que $args = mon fic 1 mon fic 2
Et du cou, je ne vois pas comment il est capable d'interpreter le traitement pour le fichier 1 puis pour le fichier 2. Pour moi il cherche "mon fic 1 mon fic 2" et du cou problème car il n'existe pas.

 

En fait, il me fait une chaine de caractère avec chaque argument l'un à la suite de l'autre


Message édité par matteu le 10-05-2016 à 12:24:21

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 10-05-2016 à 17:03:26    

Je sais pas si quelqu'un pourrait me dire si je suis sur la bonne voie ou non, et me débloquer pour savoir comment récupérer correctement les argument pour pouvoir les exploiter ensuite !
 
Merci par avance


---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 10-05-2016 à 22:36:43    

Citation :

             
 
   $out=$b.Fullname -replace (".tiff",".pdf" )
   $out=$a -replace (".tiff",".pdf" )    


 
à revoir, il faut cibler l'extension et pas faire une recherche
 
il vaut mieux concatener le nom sans extension avec la nouvelle extension : [System.IO.Path]::GetFileNameWithoutExtension
 
pour la solution multiple une solution ici :
 
http://tomtalks.uk/2014/04/powersh [...] s1-to-txt/

Reply

Marsh Posté le 11-05-2016 à 08:38:08    

Pour les 2 remarques donc j'en arrive à ca :

 

foreach ($a in "$args" ) {
    if(Test-Path $a -pathType container){
        $fichiers=Get-ChildItem $a -Recurse -Include *.tiff
        foreach($b in $fichiers) {
            $out=$b.DirectoryName + "\" + $b.Name
            $out = [System.IO.Path]::ChangeExtension("$out",".pdf" )
            \\xxx\Tiff2Pdf\bin\tiff2pdf.exe $b -o $out  
        }
    }
    if(Test-Path $a -pathType leaf){
        $type= [System.IO.Path]::GetExtension($a)
        if ($type -eq ".tiff" ){
                $out = [System.IO.Path]::GetFileNameWithoutExtension("$a" ) + ".pdf"        
                \\xxx\Tiff2Pdf\bin\tiff2pdf.exe $a -o $out                  
        }
    }  
   
}

 

$b si c'est un dossier est un objet de ce que je comprends alors que $a contient directement le chemin complet.
Je ne trouve pas comment avoir le même résultat en une seule ligne car si je fais avec filenamewithoutextension je perds le path donc ca ne fonctionne plus !

 

Donc la le script fonctionne toujours comme avant mais en effet, ca évitera que ca cause des problèmes dans le cas ou le fichier s'appellerai monfichier.tiff.salut.tiff

 

Par contre, je comprends mal le rapport entre ce que fais le bonhomme et ce que je souhaite faire. Je vais m'y pencher plus peut etre je verrai mieux !

 

Lui il splitte en fonction du nom car il passe que des fichiers .ps1 donc ok ^^
Moi pour ma part, c'est variable car quand on clique sur un dossier, il n'y aura pas d'extension. Quand on clique sur des fichiers, on peut se tromper et cliquer sur le mauvais.

 

ce qui m'embete en fait c'est que $args = c:\ezfgerg c:\ezfgerg\reger c:\ezfgerg\ezf  zeef  
Bref, en gros le caractère de séparation de args c'est l'espace, et moi je peux pas me servir de ca puisque si jamais il y a un espace dans le nom de fichier ou dossier ca ne fonctionnera plus !


Message édité par matteu le 11-05-2016 à 09:43:09

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 11-05-2016 à 11:17:27    

En fait, même sur un fichier j'ai un problème oui.
 
La par exemple, je prends un fichier qui s'appelle "test - Copie (5)" et ca marche pas.
Les parenthèses posent probleme à priori !
 
C'est pas aussi simple que je pensais :s  
 
Ca doit bien faire 10 bonnes heures que je travaille la dessus, qu'est ce que je suis mauvais !


---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 11-05-2016 à 22:17:57    

essaie en ajoutant un batch avant
 
Batch:
—————————
@echo off
 
for %%x in (%*) do %systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe “C:\bin\test.ps1 ‘%%x'”
—————————

Reply

Marsh Posté le 12-05-2016 à 00:21:48    

MMM j'ai beau chercher sur google je trouve aucune documentation pour tout ca par contre !
 
Ca correspond a quoi tous les endroits avec les % stp ^^ que je comprenne :)


---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 12-05-2016 à 00:21:48   

Reply

Marsh Posté le 12-05-2016 à 09:43:23    

Et ca ne fonctionne plus si je fais comme ca plus rien ne se passe.
En changer le c:\bin ... évidement !
 
Je me rends compte que le caractère ' me pause problème egalement dans mon script :(
 
En gros, le passage de parametre lorsqu'on selectionne un fichier avec la souris c'est la mouise si je comprends bien ?
 
Faut que je trouve une solution que la, ca devient trop long pour juste faire ca...  
 
Une idée pour m'aider à gérer ca ?


---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 12-05-2016 à 19:40:38    

essais de faire un write-host pour voir comment les chemin sont represnté avec un dossier et quelque fichiers
 
apres il faut trouver des regex qui pourrait fonctionner dans tout les cas de figure

Reply

Marsh Posté le 12-05-2016 à 19:46:15    

Bé justement en fait le ' et les () par exemple n'apparaissent meme pas.
au tout debut du script je fais $args et apres pause et je vois pas les caractères posant problèmes.
donc la je vois pas du tout comment faire :s

 

Actuellement le script est un .bat d'une ligne mais ne peut faire que des fichiers, si jamais c'est faisable en .bat, je vais peut etre changer de technique.

 

Apres consultation apres le principal interessé, en gros, l'objectif c'est uniquement :
-Si clic sur un fichier transformation du fichier en .pdf
-Si clic sur un dossier, transformation de tous les .tiff en .pdf.

 

Donc aps de gestion de cas ou on sélectionne 2 fichiers etc on m'a demandé d'arreté de perdre du temps la dessus.


Message édité par matteu le 12-05-2016 à 19:48:00

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 13-05-2016 à 10:19:21    

Je pense qu'en powershell on peut pas le faire, il récupère pas correctement le répertoire on dirait...

 

En batch, voila la commande qui fonctionne pour 1 tiff :
call "xxx\Tiff2Pdf\bin\tiff2pdf.exe" %1 -o "%~dpn1".pdf

 

Je pensais que cette modification suffirait :

 

for %%x in (*.tiff *.tif) do (
 call "\\mecahers.net\data\SHAREAPPLICATION\Tiff2Pdf\bin\tiff2pdf.exe" %%x -o "%%~dpnx".pdf
)
Pour le traitement de plusieurs tiff lorsqu'on sélectionne un dossier mais a priori non...  %x ne récupère pas les données correctes j'ai bien l'impression.

 

EDIT :

 

Voila ou j'en suis :
Ca fonctionne bien séparrément mais il y a un soucis dans ma condition je pense car ensemble ca ne marche pas !
Le but est de dire si c'est un dossier tu fais l'action pour les dossier, sinon tu fais pour un fichier.
Script tres simple, ou on gere pas les exception etc.

 

if exist "%~1"(
pause
for %%x in (%1\"*.tif" ) do (
 call "\\mecahers.net\data\SHAREAPPLICATION\Tiff2Pdf\bin\tiff2pdf.exe" "%%x" -o "%%~dpnx".pdf
)
)
else
(
call "\\mecahers.net\data\SHAREAPPLICATION\Tiff2Pdf\bin\tiff2pdf.exe" %1 -o "%~dpn1".pdf
pause
)


Message édité par matteu le 13-05-2016 à 13:23:00

---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 13-05-2016 à 20:21:59    

C est bon c est résolu je poste lundi la solution !
Bien plus facile en batch qu en power shell ...
 
Ce dernier n est pas foutu de prendre certains caractère en paramètre alors que le batch sait le faire ...
Honte à lui !


---------------
Mon Feedback---Mes ventes
Reply

Marsh Posté le 23-05-2016 à 12:29:09    

Petit oubli mais voila comment je m'en suis sorti :

 

if "%~x1" == ".tiff" goto fichier
if "%~x1" == ".tif" goto fichier
if "%~x1" == "" goto dossier

 


:fichier
call "\\xxx\Tiff2Pdf\bin\tiff2pdf.exe" %1 -o "%~dpn1".pdf
goto end

 

: dossier
for %%x in (%1\"*.tif" ) do (
 call "\\xxx\Tiff2Pdf\bin\tiff2pdf.exe" "%%x" -o "%%~dpnx".pdf
)
goto end


Message édité par matteu le 23-05-2016 à 12:30:03

---------------
Mon Feedback---Mes ventes
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed