2

У меня есть простой скрипт powershell, который открывает ur и регистрирует, был ли он успешным:

$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

Когда я запускаю программу из PowerShell ISE, она работает нормально и ведет журнал, как и ожидалось:

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

Когда я запускаю точно такой же файл из командной строки Windows, я не получаю запись в файле журнала. Что я делаю неправильно?

2 ответа2

3

Я подозреваю, что это проблема рабочего каталога. Посмотрите в C:\Windows\System32 и посмотрите, есть ли там ваш журнал. Или укажите явный путь к журналу, а не используйте относительный путь.

2

Вот что вы говорите PowerShell, чтобы написать «.\ Log.log», и это так. Просто я не думаю, что он пишет там, где вы ожидаете. Он записывает, где находится get-location , что по умолчанию обычно является вашим пользовательским каталогом (или каталогом выполняющей его учетной записи). Проверьте .\users\<username>\log.log и посмотрите, есть ли он там. Теперь вам нужен способ получить текущий каталог выполнения скрипта и записать в него свой вывод. Вы можете сделать это так:

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

В вашем случае $LogFile самом деле будет:

$LogFile = "$ScriptDir\log.log"

Проверьте Invoke-WebRequest :) Возможно, вам будет проще для веб-запросов. Вы также можете подумать о добавлении finally к вашему try\catch чтобы это было try\catch\finally . Блок finally всегда выполняется, и вы можете использовать его для регистрации выполнения скрипта (в данном случае).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .