0

我有一堆 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

有任何想法吗?

下面由克里斯蒂安回答。

4

1 回答 1

2

这样的事情应该是可行的:

$files = Get-ChildItem "C:\Test\Done" -recurse -include *.txt
$i = 0
foreach ($file in $files){

$outputfile = "{0}{1}{2}{3}.txt" -f (Get-Date).hour , (Get-Date).minute , (Get-Date).millisecond , ([string]$i).padleft(3,'0')

(Get-Content $file) | 
Foreach-object {
$_.replace(("$($file.name)" -replace '.txt',''), ("$outputfile" -replace '.txt',''))}| 
Set-Content $file 

rename-item $file $outputfile
rename-item ($file -replace '.txt','.pdf') ($outputfile -replace '.txt','.pdf') 

$i++
}
于 2012-12-04T13:26:08.840 回答