我在我的批处理脚本中输入了未知长度文件的URL。
http://Repository.com/Stuff/Things/Repo/file1.csv
http://www.place.com/Folder/file2.xml
与它们几乎没有任何一致性。我需要一种只使用批处理的方法(尽管从批处理中调用powershell是一个选项)将这些方法分解为完整路径和文件名。
http://Repository.com/Stuff/Things/Repo/
file1.csv
file2.xml
我已经看过用其他语言做的方法,但我只限于批量,而且它不是我强大的语言之一。我尝试使用带有“delims = /”的far / f循环,但是当它到达//时它会退出。
答案 0 :(得分:3)
在PowerShell中,您可以将URL字符串转换为System.Uri
类,该类提供有关URL及其结构的详细信息。您可能需要使用serialization format属性进行操作,如下所示:
PS C:\> # get System.Uri object:
PS C:\> $uri = [uri]"http://Repository.com/Stuff/Things/Repo/file1.csv"
PS C:\> $uri
AbsolutePath : /Stuff/Things/Repo/file1.csv
AbsoluteUri : http://repository.com/Stuff/Things/Repo/file1.csv
LocalPath : /Stuff/Things/Repo/file1.csv
Authority : repository.com
HostNameType : Dns
IsDefaultPort : True
IsFile : False
IsLoopback : False
PathAndQuery : /Stuff/Things/Repo/file1.csv
Segments : {/, Stuff/, Things/, Repo/...}
IsUnc : False
Host : repository.com
Port : 80
Query :
Fragment :
Scheme : http
OriginalString : http://Repository.com/Stuff/Things/Repo/file1.csv
DnsSafeHost : repository.com
IsAbsoluteUri : True
UserEscaped : False
UserInfo :
PS C:\> # get base URL without page name and query parameters:
PS C:\> $uri.Scheme + ":/" + $uri.Authority + (-join $uri.Segments[0..($uri.Segments.Length - 2)])
http:/repository.com/Stuff/Things/Repo/
PS C:\> # get page/file name:
PS C:\> $uri.Segments[-1]
file1.csv
答案 1 :(得分:3)
@echo off
setlocal EnableDelayedExpansion
set "url=http://Repository.com/Stuff/Things/Repo/file1.csv"
for %%a in ("%url%") do (
set "urlPath=!url:%%~NXa=!"
set "urlName=%%~NXa"
)
echo URL path: "%urlPath%"
echo URL name: "%urlName%"
输出:
URL path: "http://Repository.com/Stuff/Things/Repo/"
URL name: "file1.csv"
答案 2 :(得分:0)
使用字符串类的split
和SubString
方法。
e.g。
$filename = $url.split('/')[-1]
# $url.split('/') splits the url on the '/' character. [-1] takes the last part
$rest = $url.SubString(0, $url.Length - $filename.Length)
# The first parameter is the starting index of the substring, the second is the length.
答案 3 :(得分:0)