Powershell从文件中删除所有目录路径

时间:2012-09-12 09:37:46

标签: powershell batch-file

好的我要做的是制作一个脚本,它将读取文本文件的每一行,“directory.txt”并导出文件的每一行而不是目录。示例如下。

  

我只是想删除“C:\ users \”等目录的路径   并保留任何文件的路径,如“C:\ users \ file.txt”

在测试文件中,Direcory.txt“会有以下内容:

  

C:\路径\路径\文件夹\
  C:\路径\路径\ file.ext
  C:\路径\路径\路径\路径\文件夹

脚本需要读取上面的文本文件并将以下行导出到新的文本文件中。

  

C:\路径\路径\ file.ext

等效的批处理脚本如下:

@ECHO OFF
FOR /F %%A IN (directory.txt) DO CALL:NoDir "%%A"
pause
EXIT /B

:NoDir
IF "%~x1" NEQ "" ECHO %~1>>nodir.txt
EXIT /B

批处理脚本无法处理400mb的文件,因此需要使用powershell来执行o.0

3 个答案:

答案 0 :(得分:1)

FTR:条件if "%~x1" neq ""没有达到您所期望的效果。它不仅会匹配文件夹,还会匹配没有扩展名的文件。

无论如何,在PowerShell中,你可能会做这样的事情,只列出不是目录的项目:

Get-Content \PATH\TO\directory.txt `
  | Get-Item `
  | Where-Object { -not $_.PSIsContainer } `
  | Select-Object FullName

答案 1 :(得分:0)

我不确定我是否理解这个问题(批处理示例显示所有路径),也许这就是您要找的内容:

Get-Content directory.txt | Where-Object {$_ -eq 'C:\path\path\file.ext'}

答案 2 :(得分:0)

你没有说你是否担心它们是否有效。以下向主机输出有效文件的行(使用Test-Path cmdlet的'-PathType leaf'参数),或者路径中最后一项的最后4个字符是一个点后跟3个字母

$Lines = Get-Content C:\Path\to\file.txt

foreach ( $line in $Lines )
{
  if ( (Test-Path $line -PathType leaf) -OR ($line -match "\.\w{3}$") )
  {
    Write-Host $line
  }
}

如果您发现文件扩展名超过3个字母,则可以相应地更改正则表达式("\.\w{3,4}$"用于4个字符的扩展名,或"\.[\w\d]{3,4}$以匹配3或4个字符长的扩展名。包括数字)

单线:

Get-Content C:\Path\to\file.txt | % { if ((Test-Path $_ -PathType Leaf) -OR ($_ -match "\.\w{3}$")) { $_ } }