如何在PowerShell中使用变量连接字符串?

26

我试图在PowerShell中构建文件路径,但字符串拼接似乎有点奇怪。

我有一个文件夹列表:

c:\code\MyProj1
c:\code\MyProj2

我想在这里获取DLL文件的路径:

c:\code\MyProj1\bin\debug\MyProj1.dll
c:\code\MyProj2\bin\debug\MyProj2.dll

这是我想要做的事情:

$buildconfig = "Debug"

Get-ChildItem c:\code | % {
    Write-Host $_.FullName + "\" + $buildconfig + "\" + $_ + ".dll"
}

这个不起作用。我该怎么修复它?


4
使用 Write-Host 要小心 - 它只能写入到主控制台。无法将该输出内容捕获到变量中。如果您只是删除 Write-Host 并将字符串留在那里,它将 1)隐式使用 Write-Output 和 2)您将能够将该输出内容捕获到变量中,例如 gci c:\code | %{$_.FullName+"\$build-config$($_.basename).dll"`。 - Keith Hill
4个回答

31

试一下这个

Get-ChildItem  | % { Write-Host "$($_.FullName)\$buildConfig\$($_.Name).dll" }

在你的代码中,

  1. $build-Config 不是一个有效的变量名称。
  2. $.FullName 应该改成 $_.FullName
  3. $ 应该改成 $_.Name

$_.Name 包括扩展名。我怀疑意图是将当前的扩展名替换为 .dll,而不是添加一个额外的 .dll。 :-) - Keith Hill
1
他说他有一个文件夹列表。所以,$.Name 应该没问题。否则,$.BaseName 也可以。 - ravikanth

14

您可以使用PowerShell中String.Format的等效方式 - 这通常是构建字符串的最简单方法。在字符串中放置{0},{1}等变量所在的位置,紧接着在字符串后面放置-f,然后是逗号分隔的变量列表。

Get-ChildItem c:\code|%{'{0}\{1}\{2}.dll' -f $_.fullname,$buildconfig,$_.name}

(وˆ‘è؟که°†$buildconfigهڈکé‡ڈهگچ称ن¸­çڑ„ç ´وٹکهڈ·هژ»وژ‰ï¼Œه› ن¸؛وˆ‘ن¹‹ه‰چن¹ں看هˆ°è؟‡è؟™ن¼ڑه¼•èµ·é—®é¢کم€‚)


7

尝试使用Join-Path命令:

Get-ChildItem c:\code\*\bin\* -Filter *.dll | Foreach-Object {
    Join-Path -Path  $_.DirectoryName -ChildPath "$buildconfig\$($_.Name)" 
}

0

这将获取所有的dll文件并过滤出与您目录结构的正则表达式匹配的文件。

Get-ChildItem C:\code -Recurse -filter "*.dll" | where { $_.directory -match 'C:\\code\\myproj.\\bin\\debug'}

如果你只想要路径,而不是对象,你可以在末尾添加| select fullname,像这样:

Get-ChildItem C:\code -Recurse -filter "*.dll" | where { $_.directory -match 'C:\\code\\myproj.\\bin\\debug'} | select fullname


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接