Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
876 connectés 

  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  script powershell et raccourci envoyer vers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

script powershell et raccourci envoyer vers

n°139921
Matteu
Posté le 09-05-2016 à 12:19:05  profilanswer
 

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
mood
Publicité
Posté le 09-05-2016 à 12:19:05  profilanswer
 

n°139944
exmachina
Posté le 09-05-2016 à 19:57:46  profilanswer
 


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
                       
       

n°139958
Matteu
Posté le 10-05-2016 à 07:57:27  profilanswer
 

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
n°139963
Matteu
Posté le 10-05-2016 à 09:03:52  profilanswer
 

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
n°139995
Matteu
Posté le 10-05-2016 à 17:03:26  profilanswer
 

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
n°140008
exmachina
Posté le 10-05-2016 à 22:36:43  profilanswer
 

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/

n°140012
Matteu
Posté le 11-05-2016 à 08:38:08  profilanswer
 

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
n°140018
Matteu
Posté le 11-05-2016 à 11:17:27  profilanswer
 

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
n°140035
exmachina
Posté le 11-05-2016 à 22:17:57  profilanswer
 

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'”
—————————

n°140036
Matteu
Posté le 12-05-2016 à 00:21:48  profilanswer
 

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
mood
Publicité
Posté le 12-05-2016 à 00:21:48  profilanswer
 

n°140041
Matteu
Posté le 12-05-2016 à 09:43:23  profilanswer
 

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
n°140072
exmachina
Posté le 12-05-2016 à 19:40:38  profilanswer
 

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

n°140073
Matteu
Posté le 12-05-2016 à 19:46:15  profilanswer
 

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
n°140083
Matteu
Posté le 13-05-2016 à 10:19:21  profilanswer
 

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
n°140104
Matteu
Posté le 13-05-2016 à 20:21:59  profilanswer
 

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
n°140254
Matteu
Posté le 23-05-2016 à 12:29:09  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  script powershell et raccourci envoyer vers

 

Sujets relatifs
Cherche fournisseur de 09x avec renvoi vers l'étranger (parti sur OVH)powershell - utilisation des disques
migration exchange microosft vers exchange ovhEmpecher l update vers office 2016 pour les postes hors domaines
Migration AD 2003 vers 2012Execution script demarrage Session citrix
Exchange: Problème encodage vers Orange/wanadoo (SMTP)Exécution d'un script à la fermeture d'un poste de travail
Switch port SFP vers prise fibre optique simple SCBascule Windows server 2008 vers nas
Plus de sujets relatifs à : script powershell et raccourci envoyer vers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR