PowerShell Вывод текста - PullRequest
       3

PowerShell Вывод текста

0 голосов
/ 29 ноября 2018

У меня есть приведенный ниже скрипт PowerShell, чтобы проверить, заблокирован ли файл - как мне также вывести 0 или 999 в текстовый файл, например C: \ stuff \ PSOutput.txt?

$file = "\\xxxxx\xxxxxx\xxxxxxx\test.log"
try {
    [IO.File]::OpenWrite($file).Close();
    exit 0
} catch {
    exit 999
}
$exit | Out-File -FilePath "C:\stuff\PSOutput.txt"

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Операторы exit в вашем коде заставляют ваш скрипт завершиться до того, как он достигнет точки, где $exit будет записано в выходной файл.Но даже если бы он туда попал, он на самом деле не записывал бы код выхода, потому что ключевое слово exit волшебным образом не заполняет (неопределенную) переменную $exit кодом выхода.Возможно, вы путаете его с автоматической переменной $LastExitCode, которая обновляется на стороне вызывающая сторона после выхода вызываемой стороны.

То, что вы на самом деле хотите сделать, этоопределите пользовательскую функцию, которая правильно устанавливает код выхода и делает все остальное, что вы хотите сделать перед фактическим выходом:

function ExitWithCode($exitcode) {
    $host.SetShouldExit($exitcode)
    $exit | Out-File -FilePath 'C:\stuff\PSOutput.txt'
    exit $exitcode
}

, затем используйте ее в своем коде так:

try {
    [IO.File]::OpenWrite($file).Close()
    ExitWithCode 0
} catch {
    ExitWithCode 999
}

Использование$host.SetShouldExit() в дополнение к exit гарантирует, что ваш скрипт всегда устанавливает правильный код завершения, независимо от того, как он вызывается .

0 голосов
/ 29 ноября 2018

Вам нужно будет отредактировать путь к вашему файлу в первой строке скрипта:

$fileName = "test.txt"                                                           
$file = New-Object -TypeName System.IO.FileInfo -ArgumentList $fileName
[System.IO.FileStream] $fs = $file.OpenWrite(); 
if (!$?) {
"0" | Out-File "C:\PSOutput.txt"
}
else {
$fs.Dispose()
"999" | Out-File "C:\PSOutput.txt"
}
0 голосов
/ 29 ноября 2018

Это должно работать:

$file = "\\xxxx\xxxxx\xxxxxxx\test.log"
$exitCode = 0
if (Test-Path -Path $file -PathType Leaf) {
    $fileInfo = New-Object System.IO.FileInfo $file
    try {
        $stream = $fileInfo.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
        if ($stream) { $stream.Close() }
    } 
    catch {
        $exitCode = 999  # the file is locked by a process.
    }
}
$exitCode | Out-File -FilePath "C:\stuff\PSOutput.txt"
0 голосов
/ 29 ноября 2018

Не exit сценарий.Сохраните значение выхода в переменную и запишите его в файл.

$file = "\xxxx\xxxxx\xxxxxxx\test.log"
try { [IO.File]::OpenWrite($file).close(); $exit = 0 } catch { $exit = 999}
$exit | Out-File -FilePath "C:\Path\to\myFile.txt"

exit останавливает ваш скрипт и возвращает значение выхода.Чтобы делать больше вещей с вашим скриптом (например, сохранять значение в файл), вы не должны использовать exit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...