0

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

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

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

C:\path\path\folder\
C:\path\path\file.ext
C:\path\path\path\path\folder

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

C:\path\path\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

4

3 回答 3

1

FTR:这种情况if "%~x1" neq ""并没有达到您的预期。它不仅会匹配文件夹,还会匹配没有扩展名的文件。

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

Get-Content \PATH\TO\directory.txt `
  | Get-Item `
  | Where-Object { -not $_.PSIsContainer } `
  | Select-Object FullName
于 2012-09-12T10:57:42.243 回答
0

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

Get-Content directory.txt | Where-Object {$_ -eq 'C:\path\path\file.ext'}
于 2012-09-12T10:22:49.667 回答
0

您没有说您是否担心它们是否是有效路径。以下输出到主机的行是有效文件(使用 Test-Path cmdlet 的“-PathType 叶”参数),或者路径中最后一项的最后 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}$")) { $_ } }
于 2012-09-12T10:41:44.847 回答