我有这样的千行文件。
x:/folder/folder/PN.xxx
y:/folder/PN.xxx
...
我需要制作用于更改此脚本的脚本(用于在excel中使用):
x;file.xxx
y;file.yyy
对我而言,最好的结果是:
x;PN;x:/folder/folder/
y;PN;y:/folder/
我尝试在cmd中使用最简单的方法:
D:\>powershell -Command "(gc serverPN.txt) -replace 'xxx', ';' | Out-File myFile.txt"
但我不知道,在XXX中写什么是needet,当我要删除/ * /之间的所有内容时。这样的事情可能很接近:“\\[\D]*\\'
”。
感谢您的帮助。
答案 0 :(得分:3)
假设行存储在text_file.txt
中,对于batch-file解决方案,您需要for /F
循环和~
修饰符进行循环变量扩展(另请参阅{{1详情):
for /?
对于您问题中的示例数据,这将在以下输出中删除:
for /F "usebackq delims=" %%L in ("text_file.txt") do ( echo(%%~dL;%%~nxL;%%~dpL )
如果您希望输出中没有扩展名的纯文件名,请将x:;PN.xxx;x:/folder/folder/
y:;PN.xxx;y:/folder/
替换为%%~nxL
。
答案 1 :(得分:1)
在PowerShell中尝试:
gc "serverPN.txt" | % {
get-item $_ | %{
"$($_.PSDrive);$($_.Name);$($_.Directory)" | Out-File "myFile.txt" -Append
}
}
答案 2 :(得分:1)
这应该是您要求的正则表达式::.*/
,您可以将其替换为;
:
powershell -Command "(gc serverPN.txt) -replace ':.*/', ';' | Out-File myFile.txt"
答案 3 :(得分:0)
$test = 'C:/test1/test2/test3/test4/testfile.xls'
$newfile =$test.Substring(0,2) + ';' + $test.Substring($test.LastIndexOf('/')+1,($test.Length-$test.LastIndexOf('/')-1))
输出:
C:;testfile.xls
答案 4 :(得分:0)
虽然它不是心爱的PowerShell,但cmd也可以产生“最好的结果”。
C:>TYPE fi2.bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "usebackq tokens=*" %%f IN (`TYPE fi2.txt`) DO (
SET DRIVE=%%~df
SET DRIVE=!DRIVE:~0,1!
SET FILENAME=%%~nf
SET DIRNAME=%%~pf
SET DIRNAME=!DIRNAME:\=/!
ECHO !DRIVE!;!FILENAME!;%%~df!DIRNAME!
)
EXIT /B 0
C:>CALL fi2.bat
x;PN;x:/folder/folder/
y;PN;y:/folder/