我正在尝试修改一个文件夹中一组文件的内容,并将修改后的文件写入另一个文件夹。 修改位很容易并且效果很好,但设置新内容会失败。这是代码:
$files = Get-ChildItem "~DesktopTest1*.txt"
foreach ($f in $files)
{
Get-Content "$f" |
Where-Object { -not $_.Contains('VOID') } |
Set-Content "~DesktopTest2$f"
}
运行时出现的错误是:设置内容:无法打开文件"\用户\笔记本电脑\台式机\测试1\测试.txt"的备用数据流"\用户\笔记本电脑\台式机\测试1\测试"。
"Test2\C"是什么意思?C从何而来?
这一定是一个非常容易的解决方法,但我可以使用一些帮助。
若要确保仅使用每个输入文件的文件名,请将
"~DesktopTest2$f"
跟
"~DesktopTest2$($f.Name)"
如果将$f
作为一个整体("$f"
)字符串化,则会在它表示的System.IO.FileInfo
实例上调用.ToString()
方法,该方法返回完整路径(通常在Windows PowerShell中,始终在PowerShell(核心)7+中),因此最终会得到格式错误的路径,例如C:UserjdoeDesktopTest2C:UserjdoeDesktopTest1foo.txt
- 也就是说,您有效地将完整路径追加到另一个完整路径。
至于你尝试过的:
"Test2\C"是什么意思?C从何而来?
C
是$f
字符串化的完整路径的驱动器号(例如,C:UserjdoeDesktopTest1foo.txt
)
缺少路径其余部分的原因是(意外)第二个:
(第一个来自扩展形式的~DesktopTest1*.txt
驱动器号)之后的所有内容都被解释为备用 NTFS 数据流 (ADS) 的标识符。
错误是由(意外)标识符包含无效字符的事实引起的,即.