Аргумент как переменная вместо прямой передачи пути к файлу командлетам PowerShell - PullRequest
1 голос
/ 09 мая 2020

Я сохраняю путь к файлу в переменной, как показано ниже

$body = E:\Folder\body.txt

И пытаюсь получить к нему доступ в нескольких областях в сценарии PowerShell, как показано ниже

Clear-content -$body

Get-content $body.ToString()

Set-content $body

Но все эти три типа передаваемых аргументов не работают. Я получаю сообщения об ошибках ниже.

Cannot find path 'C:\Users\S51\-' because it does not exist

You cannot call a method on a null-valued expression

Cannot bind argument to parameter 'Path' because it is null

Только традиционный

Clear/Get/Set-content E:\Folder\body.txt методы работают.

Есть ли способ назначить путь к переменной и использовать их во всем коде, потому что мне нужно обращаться к одному и тому же пути несколько раз, и если мне нужно изменить файл Путь в будущем требует доработки везде. Если это переменная, я могу просто изменить в одном месте.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

tl; dr

  • Все ваши симптомы объясняются значением $body, фактически равным $null.

  • Проблема в том, что E:\Folder\body.txt не цитируется ; если вы его процитируете, ваши симптомы go прочь:

$body = 'E:\Folder\body.txt'

Нижняя часть этого ответа объясняет строковые литералы в PowerShell и этот ответ объясняет два основных режима синтаксического анализа PowerShell: аргумент (команда) режим и выражение режим.

Пояснение:

Я сохраняю путь к файлу в переменной, как показано ниже

$body = E:\Folder\body.txt

Потому что что вы намереваетесь быть строка E:\Folder\body.txt не цитируется , E:\Folder\body.txt интерпретируется как команда , что означает:

  • E:\Folder\body.txt открывается как документ , что означает, что он открывается асинхронно в Notepad.exe по умолчанию.

  • Поскольку эта операция не имеет вывода (возвращаемого значения), переменная $body создается со значением $null (строго говоря, значением [System.Management.Automation.Internal.AutomationNull]::Value, которое в большинстве случаев ведет себя как $null).

Все ваши симптомы являются результатом того, что значение $body фактически равно $null.

0 голосов
/ 09 мая 2020

В приведенном ниже коде показано несколько способов использования переменной для работы с файлами.

param(
    [string] $body = "$PSScriptRoot\body.txt"    
)

if ((Test-Path -Path $body) -eq $false) {
    New-Item -Path $body -ItemType File
}

function GetContent() {
    Get-Content -Path $body -Verbose
}
GetContent

function GetContentOfFile([string] $filePath) {
    Get-Content -Path $body -Verbose
}
GetContentOfFile -filePath $body

Invoke-Command -ScriptBlock { Clear-Content -Path $body -Verbose }

Invoke-Command -ScriptBlock { param($filepath) Clear-Content -Path $filepath -Verbose } -ArgumentList $body

Set-content -Path $body -Value 'Some content.' -Verbose
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...