8
votes

PowerShell: Exécutez le script du raccourci en utilisant un chemin relatif

edit : aux futurs lecteurs, en bref, les scripts PowerShell n'aient pas été destiné à être utilisés de cette façon, c'est pourquoi il n'y a pas de solution élégante.

J'ai la ligne suivante qui exécute un script en tant qu'administrateur d'un raccourci:

c: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe -noprofile -NOexit Start-Process PowerShell -verb Runes -ArgumentList "C: \ Documents \ WindowsPowershell \ scripts \ Test.ps1"

Je veux changer:

"c: \ documents \ windowspowershell \ scripts \ test.ps1"

à un chemin relatif comme:

". \ test.ps1"

Mais je n'ai pas compris comment je peux le faire. Comment puis-je exécuter le script par rapport à l'emplacement du raccourci? (Le raccourci et le script sont dans le même dossier)


9 commentaires

duplicaté possible de Quel est le meilleur façon de déterminer l'emplacement du script PowerShell actuel?


Est-ce qu'un raccourci réel tel que vous obtiendriez par clic droit-glissant et sélectionnez Créer des raccourcis ici? Ou est-ce un fichier de commandes qui lance votre script PowerShell? Ou est-ce que ceci est lancé à partir de tâches planifiées? Ou autre? S'il vous plaît soyez aussi explicite que possible.


@Entbark: son raccourci réel créé en cliquant sur le bouton droit de la souris et en sélectionnant Créer des raccourcis ici.


OK, alors si vous entrez dans les propriétés du raccourci, allez à l'onglet Raccourci et assurez-vous que la valeur du démarrage est identique à celle de votre script. Essayez ça.


@Entbark: l'avez-vous essayé? J'ai déjà essayé cela, le problème n'est pas que cela ne puisse pas trouver test.ps1 , mais qu'il ne peut même pas reconnaître que . \ Test.ps1 est un chemin relatif.


Oui, j'ai essayé juste maintenant et ça a fonctionné. J'ai le script dans un dossier et le raccourci dans un dossier complètement différent. Les propriétés du raccourci: cible: c: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe -noprofile -Noexit start-processhershell -verb runshell -verb runas -argumentlist ". \ Test.ps1" Démarrer: E: \ Test L'emplacement du raccourci est sur mon bureau.


"Démarrer" Vous ne pouvez pas être un chemin relatif, il apparaît. Mais j'ai déplacé le raccourci vers le même dossier que le script lui-même et l'a rendu à nouveau sans modifier le raccourci, et cela fonctionnait toujours.


@Entbark: Merci pour l'aide. Malheureusement, peu importe ce que j'essaie, je ne peux pas le faire fonctionner comme vous expliquez. J'ai même copié exactement ce qui est dans votre commentaire et j'ai toujours eu la même erreur. La solution de Noam ci-dessous a toutefois fonctionné pour moi.


@Jessegood - Je voulais juste vérifier si vous avez exécuté Set-ExecutionPolicy sans restriction sur le système? Sans cela, je reçois le raccourci mourant immédiatement après l'ouverture.


5 Réponses :


0
votes

Lorsque j'exécute un script à partir d'un raccourci, il utilise le chemin du script actuel. Vous pouvez vérifier le répertoire actuel avec pwd (présentoir de travail). Vous pouvez vérifier (puis utiliser) le chemin du script avec Split-path -parent $ myInvocation.mycommand.definition Comme la réponse indique dans Quelle est la meilleure façon de déterminer l'emplacement du script PowerShell actuel? .

Pour répondre à votre question, vous devriez déjà pouvoir utiliser des chemins relatifs. L'as tu essayé? Si oui, quelle était votre expérience?


5 commentaires

Pouvez-vous montrer un exemple de la syntaxe que j'ai besoin d'utiliser?


Peux-tu être plus précis? De quelle partie avez-vous besoin de syntaxe? Vous semblez déjà savoir comment utiliser des chemins relatifs comme démontré dans votre question.


Changer "c: \ documents \ windowspowershell \ scripts \ test.ps1" à ". \ Test.ps1" et clique sur le raccourci donne une erreur qu'il ne peut pas reconnaître ". \ test.ps1" en tant que cmdlet, exécutable, etc.


Voici un autre exemple C: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe -Noprofile -Noexit -Command "& start-processhell-verb PowerShell -verb runas. \ Test.ps1" , ceci entraînera une erreur lorsqu'il est exécuté à partir d'un raccourci . \ test.ps1 ne peut pas être reconnu.


Comment allez-vous dire au script où de l'exécution? Vous changez de répertoires ( CD )? Ou spécifiez-vous où courir? Si vous ne spécifiez pas l'emplacement de l'exécution, cela ne saura peut-être que vous souhaitez y aller.



3
votes

Voici une solution laideuse.

raccourci.lnk fichier avec cible: % ComSpec% / c. \ launcher.cmd ( Source ) et démarrez: % cd% (ou vide ).

launcher.cmd fichier avec contenu: xxx

pslauncher.ps1 fichier avec contenus: xxx

Il existe sûrement une meilleure solution. Peut-être avec le paramètre -workingDirectory de Démarrer-processus < / a>? Ou Stockage des informations d'identification avec les cmdlets converties * -Securstring? Comptez moi curieux.

Pourquoi est-ce que vous veux un raccourci?


2 commentaires

Merci cette solution fonctionne, mais comme vous l'avez mentionnée, c'est laid. Fondamentalement, je voulais un moyen facile de distribuer des scripts aux personnes qui ne savent rien de PowerShell. En regardant autour de lui semble emballage des scripts dans un exe ou créer une interface graphique serait l'autre solution.


Oui. Ce avait l'air bien dans une démonstration, mais je ne l'ai pas essayé. Bien sûr, il est livré avec une cafetière et un four grille-pain, vous n'aurez probablement pas besoin ...



0
votes

Pour votre script, définissez-le à l'aide de PowerShell par défaut. Créez un raccourci pour votre script et attribuez-la une clé à chaud en cliquant avec le bouton droit de la souris sur votre raccourci, sélectionnez Propriétés, cliquez sur l'onglet Raccourci. Déplacez votre curseur la touche Sélectionner un raccourci et définissez une touche de raccourci. Chaque fois que vous appuyez sur la touche de raccourci, votre script fonctionnera


0 commentaires

-1
votes

Ceci est définitivement fait pour être plus difficile que ce soit.

Ce problème est plus susceptible de vous affecter sur Windows Server. Sur des fenêtres régulières, vous pouvez exécuter set-exécudupolicy sans restriction

Je viens de modifier avec succès le registre sur une instance AWS contourner la stratégie de groupe et peut simplement cliquer avec le bouton droit de la souris sur les scripts PowerShell à partir de n'importe quel répertoire et envoyer un raccourci sur le bureau qui est exécutable.


0 commentaires

2
votes

Après beaucoup d'essais et d'erreurs, j'ai proposé une solution:

Créer un raccourci avec ceci (modifié pour votre fichier .ps1) pour que des scripts fonctionnent comme administrateur par rapport à n'importe quel répertoire: P>

(GCI | Where-Object {$_.Extension -eq ".ps1"}).Name | ForEach-Object {
    $WshShell = New-Object -ComObject WScript.Shell
    $Shortcut = $WshShell.CreateShortcut((GL).Path+"\$_ Run.lnk")
    $Shortcut.TargetPath = 'CMD'
    $Shortcut.Arguments = "/C PowerShell `"SL -PSPath `'%CD%`'; `$Path = (GL).Path; SL ~; Start PowerShell -Verb RunAs -Args \`"`"SL -PSPath `'`"`$Path`"`'; & `'`".\$_`"`'`"\`"`""    
    $Shortcut.IconLocation = 'PowerShell.exe'
    $Shortcut.Save()
}


1 commentaires

Si j'ai besoin de plusieurs paramètres, cela ne semble pas fonctionner. Par exemple. CMD / C POWERSHELL "SL -PSPATH"% cd% "; $ chemin = (GL) .Path; SL ~; Start PowerShell -verb runas -args \" - Executionpolicy Bypass masqué -Windowstyle caché "SL -PsPath" "$ PATH" '; &' ". \ Déconnectonidle.ps1" '"\" "