我正在尝试使用文件索引生成一个html页面。这种方法无缝地起作用:
$htmlout = Get-ChildItem -Path "$SearchPath" -Filter "$fileType" -Recurse |
Select @{Name="Link";Expression={("<a rel=" + $_.FullName + " href=file:///" + $_.FullName + ">$_</a>")}}
“链接”列仅具有文件名(即test.txt),并在单击时显示文件内容。然后我们还有一个跳过旧文件的额外要求。该脚本现在是:
$htmlout = Get-ChildItem -Path "$SearchPath" -Recurse -include ("$fileType") | Where-Object {$_.LastWriteTime -ge "01/01/2014"} |` Select @{Name="Link";Expression={("<a rel=" + $_.FullName + " href=file:///" + $_.FullName + ">$_</a>")}}
它仍然有效,但Link列现在显示整个文件路径+文件名(即\ fileserver \ folder1 \ folder2 \ test.txt)。 添加&gt; $ _。名称&lt;在这里不起作用。
我试图理解为什么在过滤器更改后相同的URL行的行为会有所不同。
答案 0 :(得分:1)
据我所知,.ToString()
方法与{{1}返回的对象的 DefaultDisplayProperty 之间的互动存在差异}。
当满足以下两个条件时,行为会显现:
- 正在使用Get-ChildItem
参数
- 无论是否使用-filter
,-Path
参数的值都会解析为单个目录。
在上述情况下,PowerShell实施的-Recurse
方法使用 Name 属性作为默认值,而不是 FullName ,就像所有其他方案中的情况一样。
我的猜测是,这种不一致是由于使用.ToString()
时FileSystem提供程序返回的底层对象类型,而不是PowerShell在处理搜索/过滤器本身时返回的对象(如同-Filter
)。
当您将-Include
管道对象变量用双引号括起来时,PowerShell的类型转换会隐式调用$_
方法,您将得到结果名称变体。
要解决您的问题,您只需在两个代码示例中使用.ToString()
并获得所需的输出,但这很容易迟早会出现问题。
更好地解决问题的方法是在双引号字符串中正确使用PowerShell 子表达式 。
要创建子表达式,只需包含所需的代码,如下所示:-Filter
。这创建了一个分隔,其中字符是代码,哪些是字符串的一部分;在您的情况下允许您使用成员访问运算符$()
。该方法还减少了与.
运算符进行字符串连接的需要。
解决方案代码:
+