我确信这个问题之前可能已经得到解答,但是 Google-fu 似乎无法找到我所寻找的内容。
我正在尝试编写一个脚本,该脚本将接受用户输入的文件名(FQDN)。然后,它将检查该名称是否包含短语(“打印机清单”)。如果是,则 Write-Host “成功”,如果不包含,则 Write-Host “未格式化” - 具体来说,我将脚本设置为查找字符串“打印机清单”。
无论我在 Read-Host 上设置文件名为何,我都无法让脚本将文件名理解为字符串(至少我认为这是我的问题)。
到目前为止,它看起来像这样(经过清理和简化)。
$input = Read-Host "Enter File name"
if($input.name -contains "*Printer Inventory*") {
Write-Host "Success"
Read-Host "Press Enter"
}else {
Write-Host "Not formatted correctly"
Read-Host "Press enter"
}
$input 变量的格式类似于以下内容:“\netshare\usershare\user\04-22-2022 Building 7 Printer Inventory.txt”
(这样格式化是因为用户将按住 Shift 键并单击来运行“复制为路径”以获取文件名;日期、建筑物 ID 将随着时间而改变)
我可以将“-contains”更改为“-like”“-matches”“-eq”-任何我能想到的,我的 else 语句总是输出“未格式化”,我将“$input.name”更改为“$input”并尝试
if ($_.name ...)
并使用
$input.FullName
或者
$_.FullName
谢谢大家的帮助。
勘误表:只是一点背景信息,但与我的请求并不特别相关 - 我实际上要操作文件中的数据,而我已经在没有“if”语句的情况下完成了这项工作。但是,我希望它能够正常工作,这样如果用户意外提供了错误的文件,脚本就会在处理文件之前终止。我省略了脚本的这些部分,因为我真的只想专注于让名称识别正常工作。
答案1
这是正常行为。类似.Name
或的属性.Size
不是自动添加到似乎包含路径的字符串中。它们只出现在System.IO.FileSystemInfo 对象,它们根本不是字符串——它们是自定义数据类型,有时只是伪装成字符串。
创建 FileSystemInfo 对象的一种方法是调用Get-Item
字符串路径:
$path = "\\netshare\whatever"
$item = Get-Item $path
echo $item.Name
echo $item.FullName
echo $item.GetType() # reveals the object's real type
echo "$item" # uses .ToString() to stringify the object