<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Scripts/Batch</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Forum d'entraide sur la programmation de scripts Batch et Powershell sous Windows.]]></description>
		<language>fr</language>
		<lastBuildDate>Fri, 17 Apr 2026 18:55:16 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Scripts/Batch</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>TITLE ne prend pas en compte tous les caractères spécifiés</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2182242&amp;goto=newpost</link>
			<pubDate>Fri, 20 Feb 2026 14:57:18 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
J'utilise TITLE...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
J'utilise TITLE pour renommer le titre de ma fenêtre CMD.<br />
Je constate que seul les premiers 31 caractères sont affichés comme titre.<br />
La théorie de Windows 11 dit qu'un titre peut aller jusqu'à 240 caractères... <br />
Je n'ai pas besoin d'autant de caractères mais bien des titres de fenêtres allant jusqu'à 50 caractères.<br />
<br />
Je constate par contre que systématiquement mes fenêtres .CMD s'ouvrent en mode 'onglet'.<br />
C'est-à-dire que j'ai un '+' me permettant d'ouvrir un autre CMD dans la même fenêtre, pourquoi pas !<br />
<br />
Mais le fait justement d'avoir cet onglet limite précisément le titre affiché à 31 caractères !<br />
C'est précisément cela que je veux éviter uniquement dans le cas d'un .BAT exécuté contenant plusieurs<br />
commandes de scripting Win11 qui ouvre donc une fenêtre CMD en mode onglet  !<br />
<br />
<br />
J'espère avoir été clair...<br />
Je veux donc juste que mon titre TITLE soit affiché entièrement et donc potentiellement en désactivant le mode<br />
onglet lors d'un CMD démarré à partir de l'exécution d'un script .BAT<br />
<br />
Je n'ai rien vu de probant dans les différentes options gérant l'ouverture d'un CMD ?<br />
<br />
<br />
Quelqu'un peut-il m'éclairer sur cette question svp ?<br />
Merci d'avance.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>Luwinit</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2182242/general-developpement/programmation-systeme/windows/scripts-batch/title-ne-prend-compte-caracteres-specifies/</guid>
		</item>
		<item>
			<title><![CDATA[Batch pour Dimensions réelles d'une image 480 x 640 avec Win11]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181164&amp;goto=newpost</link>
			<pubDate>Fri, 26 Dec 2025 10:08:46 GMT</pubDate>
			<description>Bonjour à toutes et à tous,...</description>
			<content:encoded><![CDATA[<div>Bonjour à toutes et à tous, Bonnes fêtes !<br />
<br />
J'ai des photos prises par Gsm qui ont les dimensions width 480 height 640.<br />
<br />
Si je met le curseur de la souris sur la photo je lis bien les propriétés width 480 height 640.<br />
<br />
Par contre si je les ouvres dans un logiciel les dimensions sont affichées 640 x 480 ce qui n'est pas la réalité.<br />
<br />
Si quelqu'un avait une solution en Batch ou vbs cela me ferait plaisir pour extraire cette information qui pourrait me servir afin d'effectuer une rotation automatique.<br />
<br />
Naturellement le batch détecterais les dimensions et les copierais dans un fichier .txt.<br />
<br />
En vous remerciant,<br />
<br />
@+,<br />
<br />
cincap</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>cincap</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181164/general-developpement/programmation-systeme/windows/scripts-batch/batch-dimensions-reelles-d-image-480-x-640-win11/</guid>
		</item>
		<item>
			<title><![CDATA[[PowerShell] Invoke-WebRequest : Access denied]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180768&amp;goto=newpost</link>
			<pubDate>Wed, 03 Dec 2025 20:06:10 GMT</pubDate>
			<description><![CDATA[Bonjour,  
 
Quelqu'un...]]></description>
			<content:encoded><![CDATA[<div>Bonjour, <br />
<br />
Quelqu'un saurait-il m'expliquer pourquoi un même fichier image disponible et téléchargeable librement sur le web, manuellement, ne peut être téléchargé par commande powershell ?<br />
<br />
Concrètement, si je veux télécharger manuellement l'image radar du 03/12/2025 à 19h00TU, j'ouvre préalablement l'url suivante :<br />
<a rel="nofollow" href="https://kachelmannwetter.com/de/radar-standard/lorraine/20251203-1900z.html" target="_blank">https://kachelmannwetter.com/de/rada...203-1900z.html</a><br />
Cette page, copieusement encombrée de publicités (c'est sans aucun doute ainsi que les propriétaires survivent ou font leurs choux gras à coup de cookies), une fois ouverte, me donne accès au fichier image brut : <br />
<a rel="nofollow" href="https://img5.kachelmannwetter.com/images/data/cache/radar/radar_2025_12_03_1154_1900.png" target="_blank">https://img5.kachelmannwetter.com/im..._1154_1900.png</a><br />
Ce fichier peut être ouvert dans un nouvel onglet puis téléchargé manuellement sans difficulté, mais il faut donc impérativement être passé une fois au préalable par leur visionneuse, et donc leurs pubs.<br />
<br />
Mais, je souhaite automatiser cela car il m'est nécessaire de télécharger quotidiennement 288 de ces échos radars.<br />
Si je demande à PowerShell de le faire pour moi, il n'y arrive pas. En effet, lorsque je demande au programme de télécharger l'image précédente : <br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">Invoke-WebRequest -uri $url -OutFile $fichier</code><hr />
</div>Même immédiatement après l'avoir téléchargée manuellement, si j'exécute le code j'obtiens un message d'erreur : <br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">Invoke-WebRequest : Access Denied
You don't have permission to access &quot;url&quot; on this server.</pre></td></tr></table></code><hr />
</div>Quelqu'un sait-il où ça coince ? Comment montrer patte blanche au gardien du serveur ?<br />
<br />
Avec mes remerciements.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>smas57</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180768/general-developpement/programmation-systeme/windows/scripts-batch/invoke-webrequest-access-denied/</guid>
		</item>
		<item>
			<title><![CDATA[[PowerShell] Ouvrir puis fermer un onglet firefox]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180704&amp;goto=newpost</link>
			<pubDate>Sat, 29 Nov 2025 22:47:41 GMT</pubDate>
			<description>Bonjour à tous. 
 
Tout...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous.<br />
<br />
Tout débutant avec powershell, il s'agit pour moi de télécharger quotidiennement des images radar publiées sur un certain site, mises à jour toutes les 5 minutes (soit 288 images par jour), et téléchargeables avec powershell si et seulement si elles ont été préalablement ouvertes dans un navigateur quelques minutes auparavant (question de bénéfices publicitaires j'imagine).<br />
J'ai donc besoin de créer un script exécutant à intervalle régulier l'ouverture d'un onglet Firefox, par exemple :<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">
Start-Process &quot;C:\Program Files\Mozilla Firefox\firefox.exe&quot; -argumentlist &quot;https://kachelmannwetter.com/de/radar-standard/lorraine/20251121-1740z.html&quot;</pre></td></tr></table></code><hr />
</div>d'une simplicité enfantine et qui fonctionne très bien, puis d'ordonner immédiatement la fermeture de ce même onglet afin qu'il n'y ait pas 288 onglets ouverts toutes les 24 heures, mais aussi en sortant &quot;proprement&quot; pour que firefox n'intègre pas cette fermeture tel un &quot;crash&quot; (car sinon il rouvre automatiquement l'onglet), donc Stop-Process ne fonctionne pas, et en ne fermant pas les autres onglets firefox ouverts s'ils devaient exister.<br />
<br />
Quelqu'un sait-il déjà comment procéder pour fermer proprement un onglet défini, par exemple, par l'url qu'il contient ?<br />
<br />
Avec tous mes remerciements.</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>smas57</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180704/general-developpement/programmation-systeme/windows/scripts-batch/ouvrir-puis-fermer-onglet-firefox/</guid>
		</item>
		<item>
			<title>Script pour plusieurs instances du même nom Windows 11</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2180235&amp;goto=newpost</link>
			<pubDate>Sat, 01 Nov 2025 15:03:45 GMT</pubDate>
			<description>Bonjour à toutes et à tous, 
...</description>
			<content:encoded><![CDATA[<div>Bonjour à toutes et à tous,<br />
<br />
Avec mon script, j'aimerai arrêter l'instance FFmpeg.exe et puis le delete du fichier dans le dossier, cela fonctionne.<br />
<br />
Mais j'ai remarqué dans mes tests qu'il y a des fois plusieurs instances FFmpeg.exe et donc je ne sais pas l'enlever du dossier de l'application.<br />
<br />
J'avais vu que l'on peut aussi placer /Fi ?<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">
taskkill /f /im FFmpeg.exe

::Ensuite
Del FFmpeg.exe</pre></td></tr></table></code><hr />
</div>Merci d'avance.<br />
<br />
@+,<br />
<br />
cincap</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>cincap</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2180235/general-developpement/programmation-systeme/windows/scripts-batch/script-plusieurs-instances-meme-nom-windows-11-a/</guid>
		</item>
		<item>
			<title><![CDATA[[Batch] Saut de ligne vers variable]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2179669&amp;goto=newpost</link>
			<pubDate>Sun, 05 Oct 2025 10:56:12 GMT</pubDate>
			<description>Bonjour 
 
Je sèche sur...</description>
			<content:encoded><![CDATA[<div>Bonjour<br />
<br />
Je sèche sur quelque chose de très simple ... faire un saut de ligne dans un affichage de menu =&gt; autrement dit un simple<br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">echo.</code><hr />
</div>mais le hic est quand je cherche a obtenir le résultat de la commande [echo.] dans une variable pour pouvoir l'utiliser après coup en faisant un <br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code">echo %MaVar%     REM : MaVar =&quot;Résultat de la commande echo.&quot;</code><hr />
</div><br />
<br />
J'obtiens le message &quot;Commande ECHO désactivée.&quot;<br />
<br />
J'ai essayé de lire un fichier texte contenant uniquement un saut de ligne, et enregistré ce résultat dans une variable. Puis de faire un echo de cette variable ... même erreur.<br />
<br />
le script utilisé : <br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">@echo off
 
setlocal EnableDelayedExpansion
 
set FileNLine=&quot;%CD%\Build_MENU\MENU\MENU--New_Line.tmp&quot;
 
for /f &quot;delims=&quot; %%a in ('type !FileNLine!') do set &quot;NewLine=%%a&quot;
 
echo !NewLine!</pre></td></tr></table></code><hr />
</div>Je mets n'importe quel autre (que saut de ligne) caractère dans ce fichier et l'affichage est correct.<br />
<br />
Auriez-vous une idée pour obtenir un saut de ligne dans une variable.<br />
<br />
Merci d'avance</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>totom7</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2179669/general-developpement/programmation-systeme/windows/scripts-batch/saut-ligne-vers-variable/</guid>
		</item>
		<item>
			<title>Trier chargement photos depuis la dimension - Windows 11 64Bits</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178878&amp;goto=newpost</link>
			<pubDate>Thu, 28 Aug 2025 08:59:24 GMT</pubDate>
			<description>Bonjour à toutes et à tous, 
...</description>
			<content:encoded><![CDATA[<div>Bonjour à toutes et à tous,<br />
<br />
Avec ce code batch, je télécharge les photos et j'ajoute l'extension, cela fonctionne correctement.<br />
<br />
Mais j'aurai préféré en plus ne télécharger que les photos qui ont la largeur plus grande que la hauteur soit 1920 x 1080 afin de limiter la quantité de photos à télécharger.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">
@echo off
if not exist &quot;%USERPROFILE%\pictures\Windows SpotLight&quot; ( 
	mkdir &quot;%USERPROFILE%\pictures\Windows SpotLight&quot; 
)
echo Copie des fichiers Windows a la une en cours..
copy %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\* &quot;%USERPROFILE%\pictures\Windows SpotLight\*.jpg&quot; &gt; null
echo la copie est terminée

pause</pre></td></tr></table></code><hr />
</div>Merci d'avance,<br />
<br />
@+,<br />
<br />
cincap</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>cincap</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178878/general-developpement/programmation-systeme/windows/scripts-batch/trier-chargement-photos-dimension-windows-11-64bits/</guid>
		</item>
		<item>
			<title><![CDATA[Compresser un exe selon sa taille, puis compiler l'installeur]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178781&amp;goto=newpost</link>
			<pubDate>Sat, 23 Aug 2025 06:03:03 GMT</pubDate>
			<description>Hello :) 
 
Je rame sur un...</description>
			<content:encoded><![CDATA[<div>Hello :)<br />
<br />
Je rame sur un pauvre script .bat :oops:<br />
<br />
Dans le répertoire principal, j'ai le fichier <i>MonSoft.exe</i> (compilé en VB6) et upx. J'ai un sous-répertoire <i>SetupNsis</i>, dans lequel j'ai mon script Creer_installeur.bat<br />
Si le fichier exe est pas encore compressé (avec upx), je veux que le script le compresse avant de lancer le script qui créer l'installeur (le .nsi).<br />
Le problème c’est que ça fait un peu n'importe quoi : ça compresse une première fois puis ça essaye une deuxième fois (avec un message d'erreur upx: <i><font color="#FF0000">MonSoft_Vb.exe: AlreadyPackedException</font></i>, et MonSoft.exe (qui était compressé) est supprimé.<br />
<br />
Ca fait une heure que j'essaye de piger pourquoi et que je fais des tests de goto etc, je ne m'en sors pas du tout...<br />
<br />
Si quelqu'un a une solution :) <br />
<br />
Merkouin ! :mrgreen:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br /></div></td><td valign="top"><pre style="margin: 0">@echo on
setlocal
set file=../MonSoft.exe
set maxbytesize=1000000

call :setsize %file%

:compare
if %size% lss %maxbytesize% (
    echo File is less than %maxbytesize% bytes
) else (   
    echo File is more than %maxbytesize% bytes 
	cd..
	if  exist MonSoft_Vb.exe del MonSoft_Vb.exe /F /Q
	rename MonSoft.exe MonSoft_Vb.exe
	upx --best --crp-ms=999999 --nrv2d -o MonSoft.exe MonSoft_Vb.exe
	del MonSoft_Vb.exe /F /Q
)
goto compil

:setsize
set size=%~z1
goto compare

:compil
cd SetupNsis
start Setup_MonSoft.nsi</pre></td></tr></table></code><hr />
</div></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>Couin</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178781/general-developpement/programmation-systeme/windows/scripts-batch/compresser-exe-selon-taille-puis-compiler-l-installeur/</guid>
		</item>
		<item>
			<title>Comment avec un batch sélectionner les fichiers suivant leurs résolutions (1920 x 1080) Win11 64bits</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178653&amp;goto=newpost</link>
			<pubDate>Sun, 17 Aug 2025 16:04:50 GMT</pubDate>
			<description>Bonsoir à toutes et à tous,...</description>
			<content:encoded><![CDATA[<div>Bonsoir à toutes et à tous,<br />
Je cherche comment avec un fichier bat depuis un dossier spécifié avant sélectionner uniquement les photos suivant la résolution définie et les copier dans un autre dossier en ajoutant .jpg.<br />
<br />
Merci au cas il y aurait une solution.<br />
<br />
@+,<br />
<br />
cincap</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>cincap</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178653/general-developpement/programmation-systeme/windows/scripts-batch/batch-selectionner-fichiers-suivant-leurs-resolutions-1920-x-1080-win11-64bits/</guid>
		</item>
		<item>
			<title>Pourquoi mon fichier ne fonctionne plus ? Win11 64 bits</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178006&amp;goto=newpost</link>
			<pubDate>Fri, 11 Jul 2025 09:00:39 GMT</pubDate>
			<description>Bonjour à toutes et à tous, 
...</description>
			<content:encoded><![CDATA[<div>Bonjour à toutes et à tous,<br />
<br />
En testant des anciens fichiers, je constate que celui-ci ne fonctionne plus :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0">
@echo off

cls
TITLE : MediaDureeInfo
ver | find &quot;10.0.&quot; &gt;nul &amp;&amp; chcp 65001 &gt;nul || chcp 28591 &gt;nul
color 0A
 
  If not exist &quot;Duree.vbs&quot; call:construct
  For /f &quot;delims=&quot; %%a in ('cscript //nologo Duree.vbs &quot;%~1&quot; &quot;%~2&quot; &quot;%~3&quot;') do set $MediaDureeInfo=%%a

@echo off &gt;Duree.txt 
echo %$MediaDureeInfo% &gt;&gt;Duree.txt

exit</pre></td></tr></table></code><hr />
</div>Peut être ajouter une pause pour la lecture ?<br />
<br />
Merci d'avance,<br />
<br />
@+,<br />
cincap</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>cincap</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178006/general-developpement/programmation-systeme/windows/scripts-batch/pourquoi-fichier-ne-fonctionne-plus-win11-64-bits/</guid>
		</item>
		<item>
			<title><![CDATA[[Powershell] Interface XAML/WPF - afficher une fenêtre d'attente]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2178001&amp;goto=newpost</link>
			<pubDate>Thu, 10 Jul 2025 20:03:18 GMT</pubDate>
			<description>Bonjour à tous, 
 
Je viens...</description>
			<content:encoded><![CDATA[<div>Bonjour à tous,<br />
<br />
Je viens vers vous car je sèche complètement.<br />
<br />
J'ai une interface en XAML pour un script powershell.<br />
<br />
J'ai une première fenêtre (l'écran principal) où l'on peut rechercher des comptes, et dans celle-ci les comptes s'affichent sur cette même interface.<br />
Ensuite, lorsque l'on sélectionne un ou plusieurs comptes dans cette première fenêtre, une commande powershell se lance pour rechercher les groupes des ces utilisateurs et les résultats s'affichent dans une deuxième fenêtre.<br />
<br />
Cette deuxième recherche peut prendre quelques minutes et je souhaiterai que lorsque ce lance la recherche des groupes, une fenêtre intermédiaire s'affiche durant la recherche et se ferme lorsque les résultats s'affichent dans la deuxième fenêtre.<br />
<br />
Le problème c'est que ma commande powershell ne se lance pas tant que je n'ai pas quitter manuellement cette fenêtre intermédiaire.<br />
<br />
Comment faire pour que ma commande se lance en même temps que interface intermédiaire ? Et que cette interface intermédiaire se ferme à la fin de la recherche ?<br />
<br />
Mon code est composé de 3 fichiers :<br />
- un pour le code powershell : Interface.ps1<br />
- un pour la fenêtre principale où l'on lance la recherche des comptes, où les comptes trouvés s'affiche et où l'on peut lancer une recherche sur ces comptes : Interface-Main.xaml<br />
- un pour la 2ème fenêtre qui affiches les résultats des groupes des utilisateurs : Interface-UserDetails.xaml<br />
- un pour la fenêtre intermédiaire pour faire patienter : Interface-WaitingScreen.xaml<br />
<br />
<b><u>Interface-Main.xaml</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br /></div></td><td valign="top"><pre style="margin: 0">
&lt;Window xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
        Title=&quot;Gestion des comptes et groupes&quot; Height=&quot;492&quot; Width=&quot;900&quot;&gt;


    &lt;Grid Margin=&quot;10&quot;&gt;
        &lt;TabControl&gt;
            &lt;!-- Page Comptes --&gt;
            &lt;TabItem Header=&quot;Comptes&quot;&gt;
                &lt;Grid Margin=&quot;10&quot;&gt;
                    &lt;Grid.RowDefinitions&gt;
                        &lt;RowDefinition Height=&quot;Auto&quot;/&gt;
                        &lt;RowDefinition Height=&quot;Auto&quot;/&gt;
                        &lt;RowDefinition Height=&quot;*&quot;/&gt;
                        &lt;RowDefinition Height=&quot;Auto&quot;/&gt;
                    &lt;/Grid.RowDefinitions&gt;

                    &lt;!-- Formulaire Comptes --&gt;
                    &lt;StackPanel Orientation=&quot;Vertical&quot; Grid.Row=&quot;0&quot; Margin=&quot;0 0 0 10&quot;&gt;
                        &lt;StackPanel Orientation=&quot;Horizontal&quot; Margin=&quot;0 0 0 5&quot;&gt;
                            &lt;Label Content=&quot;UID&quot; Width=&quot;100&quot;/&gt;
                            &lt;TextBox Name=&quot;txtUserId&quot; Width=&quot;200&quot; Margin=&quot;0 0 100 0&quot;/&gt;
                            &lt;Label Content=&quot;Mail&quot; Width=&quot;100&quot;/&gt;
                            &lt;TextBox Name=&quot;txtUserEmail&quot; Width=&quot;200&quot;/&gt;
                        &lt;/StackPanel&gt;
                        &lt;StackPanel Orientation=&quot;Horizontal&quot; Margin=&quot;0 0 0 5&quot;&gt;
                            &lt;Label Content=&quot;Nom&quot; Width=&quot;100&quot;/&gt;
                            &lt;TextBox Name=&quot;txtUserName&quot; Width=&quot;200&quot; Margin=&quot;0 0 100 0&quot;/&gt;
                            &lt;Label Content=&quot;Description&quot; Width=&quot;100&quot;/&gt;
                            &lt;TextBox Name=&quot;txtUserDescription&quot; Width=&quot;200&quot;/&gt;
                        &lt;/StackPanel&gt;
                        &lt;StackPanel Orientation=&quot;Horizontal&quot; Margin=&quot;0 0 0 5&quot;&gt;
                            &lt;Label Content=&quot;Prénom&quot; Width=&quot;100&quot;/&gt;
                            &lt;TextBox Name=&quot;txtUserFirstName&quot; Width=&quot;200&quot;/&gt;
                        &lt;/StackPanel&gt;
                    &lt;/StackPanel&gt;

                    &lt;!-- Boutons --&gt;
                    &lt;StackPanel Orientation=&quot;Horizontal&quot; Grid.Row=&quot;1&quot; Margin=&quot;0 0 0 10&quot;&gt;
                        &lt;Button Content=&quot;Rechercher&quot; Name=&quot;btnSearchUser&quot; Width=&quot;100&quot; Margin=&quot;0 0 10 0&quot;/&gt;
                        &lt;Button Content=&quot;RAZ&quot; Name=&quot;btnResetUserSearch&quot; Width=&quot;100&quot; Margin=&quot;0 0 10 0&quot;/&gt;
                        &lt;Button Content=&quot;Exporter la liste des comptes&quot; Name=&quot;btnExportUserDetail&quot; Width=&quot;160&quot; Margin=&quot;0 0 10 0&quot;/&gt;
                        &lt;Button Content=&quot;Interroger le/les compte(s) sélectionnés&quot; Name=&quot;btnQuerySelectedUsers&quot; Width=&quot;220&quot; Margin=&quot;0 0 10 0&quot; Visibility=&quot;Collapsed&quot;/&gt;
                    &lt;/StackPanel&gt;
                    
                    &lt;!-- Tableau des résultats --&gt;
                    &lt;DataGrid Name=&quot;dataGridUserAccounts&quot; Grid.Row=&quot;2&quot; AutoGenerateColumns=&quot;True&quot; CanUserAddRows=&quot;False&quot; IsReadOnly=&quot;True&quot; SelectionMode=&quot;Extended&quot;&gt;
                    &lt;/DataGrid&gt;

                    &lt;!-- Pagination --&gt;
                    &lt;StackPanel Orientation=&quot;Horizontal&quot; HorizontalAlignment=&quot;Center&quot; Grid.Row=&quot;3&quot; Margin=&quot;0 10 0 0&quot;&gt;
                        &lt;Button Content=&quot;&amp;lt;&quot; Name=&quot;btnPreviousUserPage&quot; Width=&quot;30&quot;/&gt;
                        &lt;!-- &lt;TextBlock Text=&quot;Page 1 / 1&quot; Margin=&quot;10 0&quot;/&gt; --&gt;
                        &lt;Label Content=&quot;Page 1 sur 1&quot; Name =&quot;lblUserPageIndicator&quot; VerticalAlignment=&quot;Center&quot; Margin=&quot;0 0 10 0&quot;/&gt;
                        &lt;Button Content=&quot;&amp;gt;&quot; Name=&quot;btnNextUserPage&quot; Width=&quot;30&quot;/&gt;
                    &lt;/StackPanel&gt;
                &lt;/Grid&gt;
            &lt;/TabItem&gt;
        &lt;/TabControl&gt;
    &lt;/Grid&gt;
&lt;/Window&gt;</pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<br />
<b><u>Interface-UserDetails.xaml</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0">
&lt;Window xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
        Title=&quot;Export des Groupes du/des Compte(s) sélectionné(s) - $sAMAccountName&quot; Height=&quot;600&quot; Width=&quot;900&quot;&gt;
    &lt;DockPanel Margin=&quot;10&quot;&gt;
        &lt;Grid DockPanel.Dock=&quot;Top&quot;&gt;
            &lt;Grid.RowDefinitions&gt;
                &lt;RowDefinition Height=&quot;*&quot;/&gt;
                &lt;RowDefinition Height=&quot;Auto&quot;/&gt;
            &lt;/Grid.RowDefinitions&gt;
            &lt;ScrollViewer Grid.Row=&quot;0&quot; VerticalScrollBarVisibility=&quot;Auto&quot; HorizontalScrollBarVisibility=&quot;Auto&quot;&gt;
                &lt;DataGrid Name=&quot;dataGridUserDetails&quot; AutoGenerateColumns=&quot;True&quot; DockPanel.Dock=&quot;Top&quot; Margin=&quot;0,0,0,10&quot;/&gt;
            &lt;/ScrollViewer&gt;
            &lt;Button Name=&quot;btnExportUserDetails&quot; Content=&quot;Exporter la liste&quot; Grid.Row=&quot;1&quot; Height=&quot;30&quot;/&gt;
        &lt;/Grid&gt;
    &lt;/DockPanel&gt;
&lt;/Window&gt;</pre></td></tr></table></code><hr />
</div><br />
<b><u>Interface-WaitingScreen.xaml</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0">
&lt;Window xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
        xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
        Title=&quot;[TITLE]&quot; Height=&quot;100&quot; Width=&quot;400&quot; WindowStartupLocation=&quot;CenterScreen&quot; ResizeMode=&quot;NoResize&quot;&gt;
    &lt;DockPanel Margin=&quot;10&quot;&gt;
        &lt;Grid DockPanel.Dock=&quot;Top&quot;&gt;
            &lt;Grid.RowDefinitions&gt;
                &lt;RowDefinition Height=&quot;*&quot; /&gt;
                &lt;RowDefinition Height=&quot;Auto&quot; /&gt;
            &lt;/Grid.RowDefinitions&gt;
            &lt;TextBlock x:Name=&quot;TextWaitingScreen&quot;
               Text=&quot;Chargement en cours...&quot;
               TextWrapping=&quot;Wrap&quot;
               TextAlignment=&quot;Center&quot;
               VerticalAlignment=&quot;Center&quot;
               HorizontalAlignment=&quot;Center&quot;
               FontSize=&quot;16&quot;
               FontWeight=&quot;Bold&quot;
               Width=&quot;360&quot;
               Padding=&quot;10&quot;/&gt;
        &lt;/Grid&gt;
    &lt;/DockPanel&gt;
&lt;/Window&gt;</pre></td></tr></table></code><hr />
</div><br />
<b><u>Interface.ps1</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br /></div></td><td valign="top"><pre style="margin: 0">
clear
#region données de test
# ----------- Jeux de données de test ---------------------------------------------------
# Générer 1000 comptes fictifs
$SimulatedUserAccounts = 1..1000 | ForEach-Object {
    [PSCustomObject]@{
        sAMAccountName         = &quot;user_$_&quot;
        sn         = &quot;Nom $_&quot;
        givenName      = &quot;Prenom $_&quot;
        mail        = &quot;prenom$_.nom$_@domaine.com&quot;
        description = &quot;Utilisateur de test $_&quot;
    }
}
#$SimulatedUserAccounts | ogv

# Générer 1000 groupes fictifs
$SimulatedGroups = 1..1000 | ForEach-Object {
    [PSCustomObject]@{
        sAMAccountName         = &quot;Groupe_$_&quot;
        description = &quot;Groupe de test $_&quot;
        displayName = &quot;Ceci est le groupe $_&quot;
        mail        = &quot;groupe$_@domaine.com&quot;
    }
}
#$SimulatedGroups | ogv

# Générer quelques relations fictives Comptes-Groupes
$SimulatedUserGroupRelations = @()
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_1';
    sAMAccountNameG = 'Groupe_1'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_1';
    sAMAccountNameG = 'Groupe_41'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_1';
    sAMAccountNameG = 'Groupe_51'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_2';
    sAMAccountNameG = 'Groupe_2'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_2';
    sAMAccountNameG = 'Groupe_42'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_3';
    sAMAccountNameG = 'Groupe_3'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_3';
    sAMAccountNameG = 'Groupe_43'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_3';
    sAMAccountNameG = 'Groupe_53'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_99';
    sAMAccountNameG = 'Groupe_99'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_100';
    sAMAccountNameG = 'Groupe_100'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_100';
    sAMAccountNameG = 'Groupe_41'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_100';
    sAMAccountNameG = 'Groupe_42'
}
$SimulatedUserGroupRelations += New-Object PSObject -Property @{
    sAMAccountNameU = 'user_100';
    sAMAccountNameG = 'Groupe_43'
}
#$SimulatedUserGroupRelations | ogv
#endregion données de test

#region fonctions
#region fonction DisplayNotification
function DisplayNotification {
    param(
        [string]$Message,
        [string]$Titre = &quot;Information&quot;,
        [ValidateSet(&quot;Info&quot;, &quot;Attention&quot;, &quot;Erreur&quot;)]
        [string]$Type = &quot;Info&quot;
    )

    # on detecte le mode de lance (ps1 en console ou exe)
    $hasConsole = $true
    try {
        $null = [console]::WindowWidth
    } catch {
        $hasConsole = $false
    }

    if ($hasConsole) {
        # Affichage dans la console classique
        Write-Host - &quot;$Titre : $Message&quot; 
    }
    else {
        switch ($Type) {
            &quot;Info&quot;    { $icone = [System.Windows.MessageBoxImage]::Information }
            &quot;Attention&quot; { $icone = [System.Windows.MessageBoxImage]::Warning }
            &quot;Erreur&quot;   { $icone = [System.Windows.MessageBoxImage]::Error }
        }

        [System.Windows.MessageBox]::Show($Message, $Titre, 'OK', $icone) | Out-Null
    }
}
#region fonction DisplayNotification

#region fonction WaitingScreen
function WaitingScreen {
    param(
        [string]$Message,
        [string]$Titre = &quot;Information&quot;
    )

    # ----------- Charger le XAML - Interface_Export_GroupesCompte ----------------------
    $WaitingScreenXamlFile = Join-Path -Path $Directory -ChildPath 'Interface-WaitingScreen.xaml'
    [xml]$WaitingScreenXamlContent = (Get-Content -Path $WaitingScreenXamlFile).replace(&quot;[TITLE]&quot;, $($Titre))
    $WaitingScreenXamlReader = New-Object System.Xml.XmlNodeReader $WaitingScreenXamlContent
    $WaitingScreenApplicationWindow = [Windows.Markup.XamlReader]::Load($WaitingScreenXamlReader)

    # On link les objets du XAML
    $TextWaitingScreen = $WaitingScreenApplicationWindow.FindName(&quot;TextWaitingScreen&quot;)

    $TextWaitingScreen.Text = $Message

    $WaitingScreenApplicationWindow.ShowDialog()  | Out-Null


}
#endregion fonction WaitingScreen

#region fonction FindUserAccount
function FindUserAccount {
    param (
        [string]$uid,
        [string]$nom,
        [string]$prenom,
        [string]$mail,
        [string]$description
    )

    if ($uid -eq &quot;&quot;)         { $uid = &quot;*&quot; }
    if ($nom -eq &quot;&quot;)         { $nom = &quot;*&quot; }
    if ($prenom -eq &quot;&quot;)      { $prenom = &quot;*&quot; }
    if ($mail -eq &quot;&quot;)        { $mail = &quot;*&quot; }
    if ($description -eq &quot;&quot;) { $description = &quot;*&quot; }

    # Construction du filtre
    $filters = @()

    if ($uid -ne &quot;*&quot;) {
        $filters += { (($_.sAMAccountName -like $uid) -or ($_.name -like $uid)) }
    }
    if ($nom -ne &quot;*&quot;) {
        $filters += { ($_.sn -like $nom) }
    }
    if ($prenom -ne &quot;*&quot;) {
        $filters += { ($_.givenName -like $prenom) }
    }
    if ($mail -ne &quot;*&quot;) {
        $filters += { ($_.mail -like $mail) }
    }
    if ($description -ne &quot;*&quot;) {
        $filters += { ($_.description -like $description) }
    }

    $finalFilter = $filters -join &quot; -and &quot;
    
    if ($finalFilter -eq &quot;&quot;) {
        $finalFilter = &quot;*&quot;
    }
    
    $results = $null
    $results = $SimulatedUserAccounts | Where-Object { $finalFilter }

    return $results
}
#endregion fonction FindUserAccount

#region fonction RetrieveGroupsForUser
function RetrieveGroupsForUser {
    param ([string]$uid)
    
    $Results = New-Object -TypeName 'system.collections.arraylist'
    $groups = $null

    WaitingScreen -Message 'Nous recherchons les groupes de(s) utilisateur(s) sélectionné(s). Merci de patienter le temps que la recherche affiche les resultats.' -Titre 'Recherche en cours des groupes...'

    Sleep -Seconds 5

    #$groups = (Get-ADUser -Identity $uid -Properties memberof).memberof
    $groups = ($SimulatedUserGroupRelations | Where-Object { $_.sAMAccountNameU -eq  $uid}).sAMAccountNameG

    foreach ($group in $groups) {            
        $Results += ($SimulatedGroups | Where-Object { $_.sAMAccountName -eq  $group})
    }
    
    Sleep -Seconds 2

    return $Results
}
#endregion fonction RetrieveGroupsForUser

#region fonction ExportDetailedResults
function ExportDetailedResults {
    param ([array]$donnees, [string]$nomParDefaut = &quot;export.csv&quot;)
    $dlg = New-Object System.Windows.Forms.SaveFileDialog
    $dlg.FileName = $nomParDefaut
    $dlg.Filter = &quot;CSV (*.csv)|*.csv&quot;
    if ($dlg.ShowDialog() -eq &quot;OK&quot;) {
        $donnees | Export-Csv -Path $dlg.FileName -delimiter ';' -Encoding UTF8 -NoTypeInformation 
        DisplayNotification -Titre &quot;Export des comptes...&quot; -Message &quot;Export effectué : $($dlg.FileName)&quot; -Type 'Info'
    }
}
#endregion fonction ExportDetailedResults

#region RenderPagination
function RenderPagination {
    param (
        [array]$donnees,
        [int]$pageActuelle,
        [int]$taillePage,
        [System.Windows.Controls.DataGrid]$dataGrid,
        [System.Windows.Controls.Label]$labelPagination,
        [int]$totalPages = $null,
        [System.Windows.Controls.Button]$btnPrecedent = $null,
        [System.Windows.Controls.Button]$btnSuivant = $null
    )

    if (-not $donnees -or $donnees.Count -eq 0) {
        $dataGrid.ItemsSource = $null
        $labelPagination.Content = &quot;Page 0 sur 0&quot;
        if ($totalPages) { $totalPages.Value = 0 }
        if ($btnPrecedent) { $btnPrecedent.IsEnabled = $false }
        if ($btnSuivant) { $btnPrecedent.IsEnabled = $false }
        return
    }

    # permet d'éviter des résultats négatif si pageActuelle = 0
    if ($pageActuelle -lt 1) {
        $pageActuelle = 1
    }

    $nbTotalPages = [math]::Ceiling($donnees.Count / $taillePage)
    $indexDebut = ($pageActuelle - 1) * $taillePage    

    $donneesPage = @($donnees | Select-Object -Skip $indexDebut -First $taillePage)

    $dataGrid.ItemsSource = $donneesPage
    $labelPagination.Content = &quot;Page $($PageActuelle) sur $($nbTotalPages)&quot;

    if ($totalPages) {
        $totalPages.Value = $nbTotalPages
    }
}
#endregion RenderPagination

#region RegisterPaginationEvent
function RegisterPaginationEvent {
    param (
        [System.Windows.Controls.Button]$btnPrecedent,
        [System.Windows.Controls.Button]$btnSuivant,
        [array]$GetDonnees,
        [int]$pageActuelle,
        [int]$taillePage,
        [System.Windows.Controls.DataGrid]$dataGrid,
        [System.Windows.Controls.Label]$labelPagination
    )

    $totalPages = 0

    $refresh = {
        RenderPagination -donnees $GetDonnees -pageActuelle $pageActuelle.Value -taillePage $taillePage -dataGrid $dataGrid -labelPagination $labelPagination -totalPages $totalPages -btnPrecedent $btnPrecedent -btnSuivant $btnSuivant 
    }

    $btnPrecedent.Add_Click({
        if ($pageActuelle.Value -gt 1) {
            $pageActuelle.Value--
            &amp; $refresh
        }
    })

    $btnSuivant.Add_Click({
        if ($pageActuelle.Value -lt $totalPages) {
            $pageActuelle.Value++
            &amp; $refresh
        }
    })

    # Premier affichage
    &amp; $refresh
}
#endregion RegisterPaginationEvent
#endregion fonctions


#region MAIN
Add-Type -AssemblyName PresentationFramework

$startupSuccess = $true

# ----------- Répertoire ----------------------------------------------------------------
$Directory = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)

# ----------- Charger le XAML - Interface_Principale ------------------------------------
$PrimaryXamlFile = Join-Path -Path $Directory -ChildPath 'Interface-Main.xaml'
[xml]$PrimaryXamlContent = Get-Content -Path $PrimaryXamlFile
$PrimaryXamlReader = New-Object System.Xml.XmlNodeReader $PrimaryXamlContent
$MainApplicationWindow = [Windows.Markup.XamlReader]::Load($PrimaryXamlReader)

# ----------- COMPTES -------------------------------------------------------------------
# Pagination
$Script:UsersPerPage = 10
$Script:CurrentUserPage = 1
$Script:UserResults = @()

# On link les objets du XAML
$txtUserId             = $MainApplicationWindow.FindName(&quot;txtUserId&quot;)
$txtUserName           = $MainApplicationWindow.FindName(&quot;txtUserName&quot;)
$txtUserFirstName      = $MainApplicationWindow.FindName(&quot;txtUserFirstName&quot;)
$txtUserEmail          = $MainApplicationWindow.FindName(&quot;txtUserEmail&quot;)
$txtUserDescription    = $MainApplicationWindow.FindName(&quot;txtUserDescription&quot;)
$dataGridUserAccounts  = $MainApplicationWindow.FindName(&quot;dataGridUserAccounts&quot;)
$btnSearchUser         = $MainApplicationWindow.FindName(&quot;btnSearchUser&quot;)
$btnResetUserSearch    = $MainApplicationWindow.FindName(&quot;btnResetUserSearch&quot;)
$btnExportUserDetail   = $MainApplicationWindow.FindName(&quot;btnExportUserDetail&quot;)
$btnQuerySelectedUsers = $MainApplicationWindow.FindName(&quot;btnQuerySelectedUsers&quot;)
$btnPreviousUserPage   = $MainApplicationWindow.FindName(&quot;btnPreviousUserPage&quot;)
$btnNextUserPage       = $MainApplicationWindow.FindName(&quot;btnNextUserPage&quot;)
$lblUserPageIndicator  = $MainApplicationWindow.FindName(&quot;lblUserPageIndicator&quot;)

# Rechercher les Comptes avec les critères renseignés
$btnSearchUser.Add_Click({
    # A chaque recherche on vide les résultats précédents
    $Script:CurrentUserPage = 1
    $dataGridUserAccounts.ItemsSource = $null
    $Script:UserResults = @()
    
    $Script:UserResults = FindUserAccount -uid $txtUserId.Text -nom $txtUserName.Text -prenom $txtUserFirstName.Text -mail $txtUserEmail.Text -description $txtUserDescription.Text
   
    # S'assurer que $resultats est toujours dans le format d'un tableau
    if ($Script:UserResults -isnot [System.Collections.IEnumerable] -or $Script:UserResults -is [string]) {
        $Script:UserResults = @($Script:UserResults)
    }

    # On charge dataGridComptes uniquement si le filtre a retourné au moins un résultat
    if ($Script:UserResults.Count -gt 0) {
        RegisterPaginationEvent -btnPrecedent $btnPreviousUserPage -btnSuivant $btnNextUserPage -GetDonnees $Script:UserResults -pageActuelle $Script:CurrentUserPage -taillePage $Script:UsersPerPage -dataGrid $dataGridUserAccounts -labelPagination $lblUserPageIndicator
    }
    else {
        DisplayNotification -Titre &quot;Comptes&quot; -Message 'Aucun compte ne correspond à vos critères !' -Type 'Info'
    }
})

# Action du bouton Précédent pour la pagination
$btnPreviousUserPage.Add_Click({   
    if ($Script:CurrentUserPage -gt 1) {
        $Script:CurrentUserPage--
        RenderPagination -donnees $Script:UserResults -pageActuelle $Script:CurrentUserPage -taillePage $Script:UsersPerPage -dataGrid $dataGridUserAccounts -labelPagination $lblUserPageIndicator -btnPrecedent $btnPreviousUserPage -btnSuivant $btnNextUserPage 
    }
})

# Action du bouton Suivant pour la pagination
$btnNextUserPage.Add_Click({
    $totalPagesComptes = [math]::Ceiling($Script:UserResults.Count / $Script:UsersPerPage)
    if ($Script:CurrentUserPage -lt $totalPagesComptes) {
        $Script:CurrentUserPage++
        RenderPagination -donnees $Script:UserResults -pageActuelle $Script:CurrentUserPage -taillePage $Script:UsersPerPage -dataGrid $dataGridUserAccounts -labelPagination $lblUserPageIndicator -btnPrecedent $btnPreviousUserPage -btnSuivant $btnNextUserPage 
    }
})

# Effacer les champs de la page Comptes
$btnResetUserSearch.Add_Click({
    # Effacer les champs
    $txtUserId.Text         = &quot;&quot;
    $txtUserName.Text         = &quot;&quot;
    $txtUserFirstName.Text      = &quot;&quot;
    $txtUserEmail.Text        = &quot;&quot;
    $txtUserDescription.Text = &quot;&quot;
    $Script:UserResults = @()
    $dataGridUserAccounts.ItemsSource = $null
    $Script:CurrentUserPage = 1
    $btnQuerySelectedUsers.Visibility = 'Collapsed'
    $lblUserPageIndicator.Content = &quot;Page 0 sur 0&quot;
})

# Export en CSV des comptes
$btnExportUserDetail.Add_Click({
    if ($Script:UserResults.Count -gt 0) {
        $TimeStamp = Get-Date -UFormat '%Y%m%d-%H%M%S'
        ExportDetailedResults -donnees $Script:UserResults -nomParDefaut &quot;$($TimeStamp)_comptes.csv&quot;
    }
})

# Afficher le bouton Export Groupes de Comptes
$dataGridUserAccounts.Add_SelectionChanged({
    if ($dataGridUserAccounts.SelectedItem -ne $null) {
        $btnQuerySelectedUsers.Visibility = 'Visible'
    } else {
        $btnQuerySelectedUsers.Visibility = 'Collapsed'
    }
})

# Afficher la nouvelle fenêtre avec les groupes présents dans les comptes selectionnés
$btnQuerySelectedUsers.Add_Click({
    $comptes = $dataGridUserAccounts.SelectedItems
    
    if ($comptes -eq $null -or $comptes -eq 0 ) { return }

    $boucle = 0
    $groupsLinkedToAccounts = @()
    $uids = $null

    foreach ($compte in $comptes) {
        $uid = $null
        #$compte | ogv
        $uid = $compte.sAMAccountName
        
        if($boucle -eq 0) {
            $uids = $($uid)
            #write-host &quot;uid dans main boucle 0 = $($uid)&quot;
            $groupsLinkedToAccounts = RetrieveGroupsForUser -uid $uid
            $boucle++
        }
        else {
            $uids = &quot;$($uids)-$($uid)&quot;
            #write-host &quot;uid dans main boucle sup 0 = $($uid)&quot;
            $groupsLinkedToAccounts += RetrieveGroupsForUser -uid $uid
        }
    }

    # ----------- Charger le XAML - Interface_Export_GroupesCompte ----------------------
    $UserXamlFile = Join-Path -Path $Directory -ChildPath 'Interface-UserDetails.xaml'
    [xml]$UserXamlContent = (Get-Content -Path $UserXamlFile).replace(&quot;`$sAMAccountName&quot;, $($uids))
    $UserXamlReader = New-Object System.Xml.XmlNodeReader $UserXamlContent
    $UserApplicationWindow = [Windows.Markup.XamlReader]::Load($UserXamlReader)

    # On link les objets du XAML
    $dataGridUserDetails = $UserApplicationWindow.FindName(&quot;dataGridUserDetails&quot;)
    $btnExportUserDetails = $UserApplicationWindow.FindName(&quot;btnExportUserDetails&quot;)

    $dataGridUserDetails.ItemsSource = $groupsLinkedToAccounts

    # Export en CSV des groupes présents dans les comptes selectionnés
    $btnExportUserDetails.Add_Click({
        $TimeStamp = Get-Date -UFormat '%Y%m%d-%H%M%S'
        ExportDetailedResults -donnees $groupsLinkedToAccounts -nomParDefaut &quot;$($TimeStamp)_groupes($($uids)).csv&quot;
    })

    if ($groupsLinkedToAccounts.Count -lt 1) {
        DisplayNotification -Titre &quot;Interrogation du compte&quot; -Message 'Aucun groupe pour cet utilisateur !' -Type 'Info'
        $dataGridUserDetails.ItemsSource = @(&quot;Pas de groupe !&quot;)
    }
    else # on affiche la nouvelle fenêtre que s'il y a des résultats !
    {
        $UserApplicationWindow.ShowDialog() | Out-Null
    }
})

# on affiche l'écran principal au démarrage
if($startupSuccess) {
    $MainApplicationWindow.ShowDialog()  | Out-Null
}
#endregion MAIN</pre></td></tr></table></code><hr />
</div><br />
La fonction qui affiche la fenêtre intermédiare se trouve en ligne 119 (function WaitingScreen) et elle est applée dans la fonction qui est censée durée longtemps en ligne 191 (function RetrieveGroupsForUser).<br />
<br />
Pour les tests, on peut sélectionner user_1.<br />
<br />
Merci beaucoup pour votre aide, cela fait plusieurs semaines que je sèche.<br />
<br />
misterg94</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>misterg94</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2178001/general-developpement/programmation-systeme/windows/scripts-batch/powershell-interface-xaml-wpf-afficher-fenetre-d-attente/</guid>
		</item>
		<item>
			<title><![CDATA[[Batch] Problème de traitement script batch conversion fichier xlsx en csv]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177954&amp;goto=newpost</link>
			<pubDate>Tue, 08 Jul 2025 08:53:09 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
j'ai un soucis...]]></description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
<br />
j'ai un soucis avec un script batch, je vous explique le contexte: mon script recupère le dernier fichie excel (xlsx) placé dans un dossier, il le renomme puis il le converti en csv, pour qu'à la fin du traitement, les données soient insérées dans une base sqlserver.<br />
<br />
Le soucis, c'est que le traitement est très long.<br />
J'ai placé en pièce jointe mon fichier &quot;developpez&quot; (à réenregistré en .bat) et &quot;conversion_inter.ps1&quot; . Dans mon traitement, je fais appel au fichier &quot;conversion_inter.ps1 ( script powershell) afin de convertir mon fichier mais c'est tres long.<br />
Pourtant, dans un autre traitement, j'utilise le même méthode et c'est rapide, voici mon fichier de log :<br />
<br />
<a href="https://www.developpez.net/forums/attachments/p668611d1751964671/general-developpement/programmation-systeme/windows/scripts-batch/probleme-traitement-script-batch-conversion-fichier-xlsx-csv/conversion_inter_fichier_log.txt/"  title="Nom : conversion_inter_fichier_log.txt
Affichages : 85
Taille : 26,3 Ko">conversion_inter_fichier_log.txt</a><br />
<br />
Existerait-il un traitment plus simple, que je peux intégrer directement dans mon batch, qui converti le fichier excel (xlsx) en csv ( séparateur ;) en utf8 ?<br />
<br />
Merci à vous pour votre aide</div>


	<div style="padding:10px">

	

	

	

	
		<fieldset class="fieldset">
			<legend>Fichiers attachés</legend>
			<ul>
			<li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/txt.gif" alt="Type de fichier : txt" />
	<a href="https://www.developpez.net/forums/attachments/p668609d1751964342/general-developpement/programmation-systeme/windows/scripts-batch/probleme-traitement-script-batch-conversion-fichier-xlsx-csv/developez-.txt/">developez .txt</a> 
(4,9 Ko)
</li><li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/txt.gif" alt="Type de fichier : txt" />
	<a href="https://www.developpez.net/forums/attachments/p668610d1751964388/general-developpement/programmation-systeme/windows/scripts-batch/probleme-traitement-script-batch-conversion-fichier-xlsx-csv/conversion_inter_ps1.txt/">conversion_inter_ps1.txt</a> 
(1,9 Ko)
</li><li>
	<img class="inlineimg" src="https://forum.developpez.be/images/attach/txt.gif" alt="Type de fichier : txt" />
	<a href="https://www.developpez.net/forums/attachments/p668611d1751964671/general-developpement/programmation-systeme/windows/scripts-batch/probleme-traitement-script-batch-conversion-fichier-xlsx-csv/conversion_inter_fichier_log.txt/">conversion_inter_fichier_log.txt</a> 
(26,3 Ko)
</li>
			</ul>
		</fieldset>
	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>android59</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177954/general-developpement/programmation-systeme/windows/scripts-batch/probleme-traitement-script-batch-conversion-fichier-xlsx-csv/</guid>
		</item>
		<item>
			<title><![CDATA[[PowerShell] demande d'aide sur une commande power shell]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177040&amp;goto=newpost</link>
			<pubDate>Thu, 22 May 2025 08:40:54 GMT</pubDate>
			<description>bonjour  
 
je vient vers...</description>
			<content:encoded><![CDATA[<div>bonjour <br />
<br />
je vient vers vous <br />
<br />
je voudrai supprimer tout les fichier avec extension.Ok que sur le dossier parent et pas les dossier enfant qui on plus d'un jours<br />
j'ai deja fait cela mais je sais pas si c'est bon et ce qu'il me manque<br />
 <br />
Get-ChildItem &quot;E:\Liaisons\INPUT_PATIENT_LOGOS&quot; -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-1)  | Remove-Item E:\Liaisons\INPUT_PATIENT_LOGOS -Include *ok -Force -Recurse<br />
<br />
merci pour votre aide</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>phildar920</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177040/general-developpement/programmation-systeme/windows/scripts-batch/demande-d-aide-commande-power-shell/</guid>
		</item>
		<item>
			<title><![CDATA[Renommage en masse de fichiers (suppression d'extension)]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2177033&amp;goto=newpost</link>
			<pubDate>Thu, 22 May 2025 06:35:54 GMT</pubDate>
			<description><![CDATA[Bonjour à tous ! 
 
J'ai de...]]></description>
			<content:encoded><![CDATA[<div>Bonjour à tous !<br />
<br />
J'ai de nombreux fichiers (+ de 50.000) ayants une double extension type : &quot;nom_fichier.xyz.12345678&quot; le nombre de caractères de la seconde extension étant variable entre 8 et 12, et cette suite peut être aléatoire.<br />
<br />
Je voudrai supprimer cette seconde extension et ne garder que la classique &quot;.xyz&quot;. Le répertoire contenant ces fichiers contient également des sous répertoire contenant eux même des fichier a double extension, il faut donc que ce soit récursif.<br />
<br />
Auriez vous une idée sur la façon de procéder ?<br />
<br />
Merci ;)</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>Dr.Wily</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2177033/general-developpement/programmation-systeme/windows/scripts-batch/renommage-masse-fichiers-suppression-d-extension/</guid>
		</item>
		<item>
			<title><![CDATA[[Batch] mon nouveau blog]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2176965&amp;goto=newpost</link>
			<pubDate>Mon, 19 May 2025 15:17:55 GMT</pubDate>
			<description>Bonjour, 
Je voudrais vous...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
Je voudrais vous informer que j'ai ouvert un nouveau blog sur les faux virus et le codage batch et vbs en général: voici le lien  <a rel="nofollow" href="https://lesvirusdecoyoteblanc.blogspot.com/" target="_blank">https://lesvirusdecoyoteblanc.blogspot.com/</a><br />
Cordialement,<br />
Coyote blanc</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f519/general-developpement/programmation-systeme/windows/scripts-batch/">Scripts/Batch</category>
			<dc:creator>coyote blanc</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2176965/general-developpement/programmation-systeme/windows/scripts-batch/nouveau-blog/</guid>
		</item>
	</channel>
</rss>
