以下是我的情景:
我有一个包含很多行的文本文件。每一行都是文件夹的路径。
示例:000.txt
C:\Program Files (x86)\Microsoft Office\Office15
C:\Program Files (x86)\Common Files\Adobe\Acrobat
C:\Program Files (x86)\Common Files\Blizzard Entertainment
我需要找到一种方法来获取每行的最后一个子文件夹的名称,并使用它来创建文件夹链接:
d:\>mklink /j office15 "C:\Program Files (x86)\Microsoft Office\Office15"
d:\>mklink /j acrobat "C:\Program Files (x86)\Common Files\Adobe\Acrobat"
d:\>mklink /j "Blizzard Entertainment" "C:\Program Files (x86)\Common Files\Blizzard Entertainment"
我试过这个:
$a="C:\Program Files (x86)\Microsoft Office\Office15"
$a.Split()[-1]
结果:
Office\Office15
我也尝试过:
$a.Split("`t",[System.StringSplitOptions]::RemoveEmptyEntries)[-1]
结果是:
5
如何使用Batch或PowerShell在最后\
之后获取每行或每个单词的最后一个单词?
答案 0 :(得分:7)
我认为这些文件夹都已经存在,如果是这样,有一种完全不同的方式可以考虑:
Get-Content "000.txt" | Get-Item | foreach-object {
cmd /c mklink /J $_.Name $_.FullName
}
因此,对于每个文件夹名称,您将获得与该文件夹关联的DirectoryInfo对象。然后,您可以直接从Name
属性中提取路径的最后部分。
这样做的另一个好处是,如果在尝试链接到目标文件夹之前不存在任何目标文件夹,则会收到错误。
答案 1 :(得分:6)
你很接近,但是忘了指定要拆分字符串的字符,所以它默认为空格:
$a="C:\Program Files (x86)\Microsoft Office\Office15"
$a.Split('\')[-1]
答案 2 :(得分:4)
以下是批处理
的另一种简单方法@echo off
for /f "delims=" %%a in (000.txt) do (
mklink /j "%%~na" "%%~fa"
)
答案 3 :(得分:1)
使用批处理 - 查看for
命令和字符串操作。您可以执行以下操作 -
@echo off
setLocal enableDelayedExpansion
for /f "delims=" %%a in (000.txt) do (
set dir=%%a
set dir=!dir: =/!
set dir=!dir:\= !
for %%b in (!dir!) do set ldir=%%b
echo !ldir:/= !
mklink /j "!ldir:/= !" "%%a"
)
这个脚本循环遍历文本文档(我已经使用了000.txt,可以将其更改为变量),每次将变量dir
设置为当前行,我们假设是目录路径。然后通过用/
(目录名称不能包含的字符)替换所有空格和所有{{ 1}}带空格的字符(这样每个目录名之间现在有一个空格)。然后,for循环将变量\
设置为最后一个目录名。
答案 4 :(得分:0)
PowerShell有一个专用工具,用于将路径拆分为父路径(目录前缀)或叶子组件(文件名/目录名称):Split-Path
。
Split-Path -Leaf
仅返回最后一个路径组件,这将启用以下解决方案:
Get-Content 000.txt | ForEach-Object { cmd /c mklink /j (Split-Path -Leaf $_) $_ }
请注意需要使用cmd /c
,因为mklink
是cmd.exe
内部的命令。