2 votes

Powershell script ne se connecte pas comme prévu lorsqu'il est exécuté en ligne de commande

J'ai un simple script powershell qui ouvre une ur et enregistre si cela a réussi :

$LogFile = ".\userLoad.log"
$Date = Get-Date
Try
{
    $Request = [System.Net.WebRequest]::Create("http://dxscrumassist.zhi.com/maintenance/loadusers.aspx")
    $Response = $Request.GetResponse()
    $LogString = "$Date - User Load Success"
    $Response.Close()
}
Catch
{
    $LogString = "$Date - User Load Failure"
}
Add-content $LogFile -value $LogString

Lorsque j'exécute le programme à partir de PowerShell ISE, il fonctionne bien et s'enregistre comme prévu :

powershell.exe -executionpolicy bypass -file C:\AAA\loadUsers.ps1

Lorsque j'exécute exactement le même fichier à partir de la ligne de commande Windows, je n'obtiens pas d'entrée dans le fichier journal. Qu'est-ce que je fais de mal ?

3voto

djeidot Points 2143

Je pense qu'il s'agit d'un problème de répertoire de travail. Regardez dans C:\Windows\System32 et voyez si votre journal s'y trouve. Ou donnez un chemin explicite à l'endroit où vous voulez que le journal soit placé plutôt que d'utiliser un chemin relatif.

2voto

Frostman Points 166

Voilà le problème, tu dis à powershell d'écrire dans ". \log.log "et ça l'est. C'est juste que je ne pense pas qu'il s'agisse d'écrire là où on l'attend. C'est écrire là où get-location est, qui est en fait un défaut qui est généralement votre répertoire utilisateur (ou celui du compte qui l'exécute). Vérifiez .\users\<username>\log.log et voir si c'est là. Maintenant, ce que vous voulez, c'est un moyen d'obtenir le répertoire d'exécution actuel du script et d'y écrire votre sortie. Vous pouvez le faire comme suit :

function Get-ScriptDirectory
{
  $Invocation = (Get-Variable MyInvocation -Scope 1).Value
  Split-Path $Invocation.MyCommand.Path
}
$ScriptDir = Get-ScriptDirectory

Dans votre cas, $LogFile serait en fait :

$LogFile = "$ScriptDir\log.log"

Vérifiez Invoke-WebRequest :) Vous le trouverez peut-être plus facile pour les requêtes web. Vous pourriez également envisager d'ajouter un finally à votre try\catch pour qu'il s'agisse d'un try\catch\finally . Le site finally s'exécute toujours et vous pouvez l'utiliser pour enregistrer l'exécution du script (dans ce cas).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X