2010-10-20 38 views
24

我想在PowerShell中建立一个文件路径,并且字符串连接似乎有点时髦。如何在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-Output和2)你将能够将该输出捕获到一个变量,例如, 'gci c:\ code | %{$ _。FullName +“\'$ build-config \ $($ _。basename)\。dll”' – 2010-10-20 14:33:20

回答

26

试试这个

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

在你的代码,

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

'$ _。Name'包含扩展名。我怀疑目的是用'.dll'替换当前的扩展名,而不是添加额外的'.dll'。 :-) – 2010-10-20 14:35:15

+1

他说他有一个文件夹列表。所以,$ _。名称应该可以。否则,$ _。BaseName是可以的。 – ravikanth 2010-10-20 14:50:37

14

你可以使用PowerShell的等价物的String.Format的 - 它通常是建立一个字符串的最简单的方法。将{0},{1}等放在字符串中需要变量的位置,在字符串后面紧跟一个-f,然后用逗号分隔变量列表。

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

(我也采取了冲出,以前也发生问题的原因,因为我已经看到了$ buildconfig变量名。)

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

6

尝试加入路径cmdlet:

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