Используйте переменную как -path при использовании Get-Content в PowerShell - PullRequest
3 голосов
/ 20 июня 2019

Я пытаюсь получить содержимое текстового файла с помощью Get-Content, и я хочу, чтобы значение -path было в переменной следующим образом:

$MyFileName = "testfile"    
$MyFilePath = "(.\MyFolder\" + $MyFileName + ".txt)"
$ServerList = Get-Content -Path $MyFilePath

Но я продолжаю получатьошибка:

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

Это работает, если я жестко закодирую путь к файлу

$ServerList = Get-Content -Path (.\MyFolder\MyFile.txt)

Write-Host $MyFilePath
.\MyFolder\testfile.txt

Ответы [ 4 ]

2 голосов
/ 20 июня 2019

Если вы посмотрите на переменную, строка содержит буквально круглые скобки:

$MyFileName = "testfile"
$MyFilePath = "(.\MyFolder\" + $MyFileName + ".txt)"
$myfilepath

(.\MyFolder\testfile.txt)

Это будет работать:

$MyFileName = "testfile"
$MyFilePath = ".\MyFolder\" + $MyFileName + ".txt"
$myfilepath

.\MyFolder\testfile.txt

Вы могли бы поставить скобки снаружи, но вам это не нужно. Или

".\MyFolder\$MyFileName.txt"
1 голос
/ 20 июня 2019

вот один из способов сделать то, что вы, кажется, хотите.[ ухмылка ] 1-ая часть - это ваш код с очень своеобразным результирующим именем файла.2-я часть разбита на части, которые легче читать / понимать / изменять.

$YourFileName = "testfile"    
$YourFilePath = "(.\MyFolder\" + $YourFileName + ".txt)"

$BaseName = 'testfile'
$Extension = 'txt'
$FileName = $FileName, $Extension -join '.'
$Directory = $env:TEMP
$FullFileName = Join-Path -Path $Directory -ChildPath $FileName

$YourFilePath
$FullFileName

output ...

(.\MyFolder\testfile.txt)
C:\Temp\testfile.txt

обратите внимание, что ваш код создал имя файла, которое почти наверняка недопустимо.[ ухмылка ]

1 голос
/ 20 июня 2019

попробуйте установить полный путь к файлу, например

$MyFilePath = "C:\My Folder\My File.txt"

или, если вы действительно хотите использовать относительный путь, снимите скобки, например

$MyFilePath = ".\My Folder\My File.txt"
0 голосов
/ 21 июня 2019

Я обнаружил, что проблема заключается в использовании переменной внутри рабочего процесса. Я был так сосредоточен на этом блоке кода, что забыл посмотреть на картину в целом.

У меня есть код ниже, который имел проблему:

Workflow GetServerStatus{
   $ServerList = Get-Content -path $FullFileName
   $ServiceList = Get-Content service_list.txt
   ForEach -Parallel ($Server in $ServerList){
      InlineScript{
         Get-Service -ComputerName $Using:Server -name $Using:ServiceList
      }
   }
}

#credits to @Lee_Dailey
$Extension = 'txt'
$FileName = $BaseName, $Extension -join '.'
$Directory = '.\server'
$FullFileName = Join-Path -Path $Directory -ChildPath $FileName

GetServiceStatus

Оказывается, проблема в том, что я неправильно передаю переменные в рабочий процесс Должно быть:

Workflow GetServiceStatus{
    param(
        $FullFileName
    )

Это тогда называется так

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