Проблема с Powershell при использовании команды mkdir - PullRequest
3 голосов
/ 11 октября 2019

Я столкнулся со странной проблемой с powershell. При вызове команды mkdir с помощью powershell var создается впечатление, что powershell добавляет переменную, хотя это происходит только в том случае, если внутри вызова функции.

У меня есть следующий пример кода.

function TestStuff($test) {
    Write-Host "Called with parameter: $test"
    $newPath = Join-Path "C:\testy\" $test
    mkdir $newPath
    # It's ok here
    Write-Host "New path is: $newPath"
    return $newPath;
}

$myNewPath = TestStuff "testVar"
# It's been doubled up here
Write-Host "Returned from function it is: $myNewPath"

Это приводит к следующему выводу

Called with parameter: testVar
New path is: C:\testy\testVar
Returned from function it is: C:\testy\testVar C:\testy\testVar

В рамках скрипта powershell эту проблему было сложно обнаружить. Может ли кто-нибудь объяснить это поведение? Возможное решение было переписано, поэтому оно не было вызовом функции. Другой альтернативой было перенаправить вывод mkdir в ноль следующим образом: mkdir $myPath > null Хотя это создает файл с именем null в файловой системе, но, похоже, не работает с $myPath var.

1 Ответ

0 голосов
/ 11 октября 2019

Я столкнулся со странной проблемой с powershell

Нет, вы пришли, чтобы узнать истинную природу PowerShell.

В PowerShell любой вывод излюбое выражение значения «всплывает» перед вызывающей стороной, включая вывод из вызова mkdir:

PS C:\> $myNewPath = TestStuff "testVar"
PS C:\> $myNewPath.Count
2
PS C:\> $myNewPath[0].GetType() # the output from `mkdir` is a DirectoryInfo object

IsPublic IsSerial Name                                     BaseType                  
-------- -------- ----                                     --------                  
True     True     DirectoryInfo                            System.IO.FileSystemInfo  

PS C:\> $myNewPath[1].GetType() # this is the string you `return`d:

IsPublic IsSerial Name                                     BaseType                  
-------- -------- ----                                     --------                  
True     True     String                                   System.Object             


Чтобы исправить вашу функцию, либо подавите вывод из mkdir с помощью Out-Nullили присваивая его $null:

mkdir $newPath |Out-Null
# or
$null = mkdir $newPath
# or 
[void]( mkdir $newPath )

... или просто передавая результаты непосредственно из mkdir:

function Test-Stuff {
    param($test)

    Write-Host "Called with parameter: $test"
    $newPath = Join-Path "C:\testy" $test

    # No output suppression, output value will be returned to the caller
    mkdir $newPath

    # Let's ensure that the last call actually succeeded
    if($?){
        Write-Host "New path is: $newPath"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...