Powershell:根据文件名更改文件中的特定文本,然后将所述文件重命名为与更改的文本相同的文件

Powershell:根据文件名更改文件中的特定文本,然后将所述文件重命名为与更改的文本相同的文件,powershell,Powershell,我有一堆txt文件,其中引用了与txt文件同名的PDF文件 问题是这些文件的文件名太长。 这些txt和pdf文件是自动生成的,在收到它们之前,我无法更改文件名长度 因此,我要做的是打开所有文件,根据文件名在文件中查找文件名,将文件名更改为最多16个字符+扩展名(总共20个字符) 然后输出具有新文件名的文本文件,并将相应的PDF重命名为新文件名 我对Powershell非常陌生,在谷歌搜索了大约两天之后,我发现了如下内容: $files = Get-ChildItem "C:\Test\Done"

我有一堆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对象中的变量中删除了“”,它可以正常工作,它可以找到变量$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
有什么想法吗


下面是Christian的回答。

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

$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++
}

如果你不介意的话,我用几个问题更新了我原来的帖子?非常感谢您的帮助:)@user1875531您尝试过我编辑的asnwer:{$\.replace($($file.name)”,“$outputfile”)}??效果很好!,除了txt文件中的信息具有.pdf扩展名,因此查找testfile.txt不会更改textfile.pdf,您知道如何在没有文件扩展名的情况下实现相同的结果吗?我想在尝试查找文件中的信息时,可以使用$file.BaseName来消除扩展名问题,但是,鉴于您已将$outputfile设置为包含“.txt”,文件中的名称将变为testfile.txt.pdf,这并没有多大帮助。所以我试着删除它,但它只是重命名了txt文件,没有扩展名。。有什么想法吗?:)@用户现在重试,我已经编辑了文本替换的相关行。