在PowerShell上使用获取内容时使用变量as-path
我试图通过使用get content获取文本文件的内容,我希望-path的值位于如下所示的变量上:在PowerShell上使用获取内容时使用变量as-path,powershell,Powershell,我试图通过使用get content获取文本文件的内容,我希望-path的值位于如下所示的变量上: $MyFileName = "testfile" $MyFilePath = "(.\MyFolder\" + $MyFileName + ".txt)" $ServerList = Get-Content -Path $MyFilePath 但我一直在犯错误: Cannot bind argument to parameter 'Path' because it is null. 如
$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
尝试设置完整的文件路径,如
$MyFilePath = "C:\My Folder\My File.txt"
或者,如果你知道相对路径是你想要的,移除括号
$MyFilePath = ".\My Folder\My File.txt"
这里有一种方法可以做你想做的事。[grin]第一部分是您的代码,其中包含非常特殊的文件名。第二部分分为易于阅读/理解/修改的部分
$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
输出
(.\MyFolder\testfile.txt)
C:\Temp\testfile.txt
请注意,代码生成的文件名几乎肯定是无效的。[grin]如果查看变量,字符串中会有括号:
$MyFileName = "testfile"
$MyFilePath = "(.\MyFolder\" + $MyFileName + ".txt)"
$myfilepath
(.\MyFolder\testfile.txt)
这将有助于:
$MyFileName = "testfile"
$MyFilePath = ".\MyFolder\" + $MyFileName + ".txt"
$myfilepath
.\MyFolder\testfile.txt
你可以把括号放在外面,但你不需要。或
".\MyFolder\$MyFileName.txt"
我发现问题在于在工作流中使用变量。我太专注于这段代码了,以至于忘了看大局 我有以下出现问题的代码:
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
试过了,我还是犯了同样的错误。我之所以编辑我的问题,是因为实际文件名本身就是一个变量,减去文件扩展名。txtry使用
Join Path
比如$MyFilePath=Join Path-Path“C:\my Folder”-ChildPath$MyFileName
如果缺少文件类型,添加这一行$MyFilePath+='.txt'
仍然一样,我甚至尝试了$MyFilePath=“C:\My Folder\{0}.txt“-f$MyFileName写入主机$MyFilePath时,我得到了正确的结果。问题是在Get content上使用$MyFilePath变量作为-Path选项时,$MyFileName
到底是什么?$MyFileName | Get Member
返回什么?TypeName:System.string除非文件确实包含括号,否则不要在文件名中使用括号-Path
需要字符串或字符串数组。在您的情况下,这将是-Path'.\MyFolder\MyFile.txt'
。请尝试删除它们,但仍然相同。除非您需要获取内容部分周围的参数,否则请删除它们。它们是不寻常的,因为它们分散了你问题中新改变的观点的注意力。如果您确实需要它们,请解释原因。我并不特别需要它们,我是powershell的新手,我基本上是从各种来源获得此代码的,我回家后会更新我的问题我认为问题源于我在工作流内使用get Content进行并行处理,当我将代码带到工作流外时,它工作得完美无缺。我以为问题就出在这段代码上,但我错了,我会更新我的问题。@Ruben_PH-ah!这改变了很多事情。只要你修复了严重损坏的文件名生成器代码,人们就可以关注其他方面。[咧嘴笑]