获取文件名,然后执行 Write-Host (PowerShell 5.1)

获取文件名,然后执行 Write-Host (PowerShell 5.1)

我确信这个问题之前可能已经得到解答,但是 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

相关内容