使用 ForEach 从文本文件中删除项

Remove-item from text file using ForEach

提问人:Kaygol 提问时间:11/16/2023 最后编辑:Kaygol 更新时间:11/16/2023 访问量:55

问:

我有一个包含目录路径和文件名的文本文件(每行一个),示例如下

"\\servername\data01\My document\test.txt"
"\\servername2\hellofolder\10 to 1\files456.doc"

假设我在文本文件中有 10 个路径和文件名(所有不同的路径和文件夹)。 我想让powershell运行文本文件并删除文本文件中提到的文件夹中的所有文件。

我会直截了当地承认(我不擅长powershell)......所以我尝试了以下方法

$files = get-content -path C:\Temp\filestest.txt
forEach ($file in $files) {remove-item $file}

我收到以下错误

Remove-item:找不到路径 “C:\Windows\system32”\服务器名称\数据01\我的文档\测试.txt“' 因为它不存在。在 C:\Temp\RemoveFiles.ps1:2 字符:28

  • forEach ($files中的$file) {remove-item -path $file}
  •                        ~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo:ObjectNotFound:(C:\Windows\syst...FSS0434281.msg“:String) [删除项], ItemNotFoundException(项目NotFound异常)
    • FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand

我相信所有的专家都可以告诉我哪里出了问题。 感谢您的帮助。

目前我正在做的是这个

$file="\\servername\Source01\Cases\Allegro\Export\client name\Email Collection 17Sep15\Native\00\69\emailmsg1.msg"
$file1="\\servername\Source01\Cases\Allegro\Export\Client name\Email Collection 17Sep15\Native\00\69\emailmsg2.msg"
$file2="\\servername\source02\Client name\searchable pdfs\004\pdf1.pdf"
$file3="\\servername\source02\Client name\searchable pdfs\004\pdf2.pdf"
$file4="\\servername\source02\Client name\searchable pdfs\004\pdf3.pdf"

然后

Remove-item -path $file
Remove-item -path $file1
Remove-item -path $file2
Remove-item -path $file3
Remove-item -path $file4
PowerShell foreach

评论

0赞 Theo 11/16/2023
您可以在资源管理器中访问文件吗?服务器上是否存在实际的共享?data01hellofolder
0赞 lit 11/16/2023
欢迎来到 SO,Kaygol。根据错误消息,它似乎不包含正确指定的路径。请将文件test.txt文件复制并粘贴到问题中。如果有很多行,就做两行或三行。如果文件路径有任何专有信息,请以某种方式进行更改。看起来至少有一条路径在开始时。filetest.txtC:\Windows\System32
0赞 Kaygol 11/16/2023
@theo我绝对可以访问文件夹和文件
0赞 Kaygol 11/16/2023
filetest.txt 文件每行包含以下数据lang-js "\\Servername\Source01\Cases\Allegro\Export\Client name\Email Collection 17Sep15\Native\00\18\emailmsg1.msg" "\\Servername\Source01\Cases\Allegro\Export\Client name\Email Collection 17Sep15\Native\00\18\emailmsg2.msg" "\\Servername\Source01\Cases\Allegro\Export\Client name\Email Collection 17Sep15\Native\00\18\emailmsg3.msg" "\\Servername\Source01\Cases\Allegro\Export\Client name\Email Collection 17Sep15\Native\00\18\emailmsg4.msg"
0赞 Kaygol 11/16/2023
对不起大家...试图弄清楚这个网站的格式

答:

0赞 Dilly B 11/16/2023 #1

您可以尝试使用以下命令

Get-Content C:\Temp\filestest.txt | ForEach-Object {Remove-Item $_}

$_ 保存循环的当前变量。

评论

0赞 Kaygol 11/16/2023
'''{Remove-Item $_}''' 也不起作用
0赞 Martin Brown 11/16/2023 #2

我认为问题是因为您的文件在每行的开头和结尾都有引号。请尝试以下操作:

$files = get-content -path C:\Temp\filestest.txt
forEach ($file in $files) { remove-item $file.Trim('"') }

另一种选择是将其视为CSV文件,如下所示:

Import-Csv .\filestest.txt -Header 'Path' | Remove-Item

评论

0赞 Kaygol 11/16/2023
尝试过,仍然相同的错误typescript $files = get-content -path C:\Temp\filestest.txt forEach ($file in $files) { remove-item $file.Trim('"') }
0赞 RetiredGeek 11/16/2023
从 OP 中的错误消息来看,“C:\Windows\System32”似乎被追加到文件的路径之前?我在代码中看不到它,但看起来这就是正在发生的事情。
0赞 Martin Brown 11/18/2023
@RetiredGeek 我的理论是,因为路径以引号开头,所以 remove-item 认为它们是相对的,并且位于当前目录的前面。