我有一堆 txt 文件,其中引用了与 txt 文件同名的 PDF 文件。
问题是这些文件的文件名太长。这些 txt 和 pdf 文件是自动生成的,我无法在收到它们之前更改文件名长度。
所以我要做的是打开所有文件,根据文件名在文件中找到文件名,将文件名更改为最多 16 个字符+扩展名(总共 20 个字符)的文件名,然后输出带有新的文本文件文件名,并将相应的 PDF 重命名为新文件名。
我对 Powershell 很陌生,在谷歌搜索了大约两天后,我发现了这样的东西:
$files = Get-ChildItem "C:\Test\Done" -recurse -include *.txt
foreach ($file in $files){
$outputfile = (Get-Date).hour + (Get-Date).minute + (Get-Date).millisecond + ".txt"
Get-Content $file | Foreach-object {$_ -replace '$file', '$outputfile' ` }
Set-Content $outputfile }
但我觉得我离我真正追求的东西还很远。
有谁知道我可以如何让这个脚本做我想做的事?
克里斯托弗
编辑:
我尝试了@Christian 的解决方案,它似乎有效,但它没有在文件中编辑和添加新文件名。
我试过这个只是作为一个测试:
$files = "testfil2.txt"
$output = "testfil3.txt"
(Get-Content "C:\test\done\1456390000.txt") | ForEach-Object {$_ -replace $files, $output } | Set-Content "C:\test\done\1456390000.txt"
我从 ForEach-Object 中的变量中删除了“”,它按预期工作,它找到变量 $files 并用 $output 更改它。但是,当我对 @Christian 的脚本执行相同操作时,我收到一条错误消息:
Regular expression pattern is not valid: C:\Test\Done\1542644000.txt.
At line:7 char:39
+ (Get-Content $file) | Foreach-object {$_ -replace $file, $outputfile } | Set-Co ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (C:\Test\Done\1542644000.txt:PSObject) [], RuntimeException
+ FullyQualifiedErrorId : InvalidRegularExpression
有任何想法吗?
下面由克里斯蒂安回答。