目录路径中的通配符,用于使用 powershell 将文件从源传输到目标
wildcards in directory path for transferring the files from source to destination using powershell
我必须使用 PUTTY 从目录“/sourcedir/Test/TRANS*/transferfiles.csv”中的 SFTP 帐户获取文件,并将它们传输到我的本地目标目录。在目录路径中使用通配符“TRANS*”时遇到问题。我如何在目录路径中使用多个通配符?我收到错误 "/sourcedir/Test/TRANS*/*transferfiles*.csv": multiple-level wildcards unsupported."
。
TIA
[string]$TransferResults = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@$(IPaddress):/sourcedir/Test/TRANS*/*transferfiles*.csv" $Destination
我尝试了@Cpt.Whale建议的解决方案。
输出:
Listing directory /sourcedir/Test/ drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_whiteplain drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_test_1
要在 foreach 循环中解析的代码片段。
foreach($file in $parsedfolders){
[string]$fpath = $file.fullName
[string]$TransferResults = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@$(IPaddress):$fpath/*transferfiles*.csv"
$Destination
我收到错误:无法识别/传输文件.csv:没有这样的文件或目录
根据您的评论,我假设 pscp -ls
的输出如下所示:
Listing directory /sourcedir/Test/
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_whiteplain
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_test_1
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS test spaces
从该输出中,我们可以使用正则表达式获取文件夹名称:
# First, list the folder names in the upper level folder
$folders = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' -ls "username@10.0.0.1:/sourcedir/Test/"
# only lines starting with d, select everything after time "0:00"
$pattern = '^d.+\d:\d{2} (.*)'
# parse output into folder names using regex
$parsedFolders = foreach ($folder in $folders) {
# trim whitespace
[regex]::Match($folder,$pattern).Groups[1].Value.trim() |
# discard empty results
Where { -not [string]::IsNullOrWhiteSpace($_) }
}
现在解析后的文件夹应该可以使用了:
$parsedFolders
TRANS_whiteplain
TRANS_test_1
TRANS test spaces
所以尝试为每个文件夹制作副本:
# Finally, copy files from each parsed folder to destination
$results = foreach ($parsedFolder in $parsedFolders) {
& 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@10.0.0.1:/sourcedir/Test/$parsedfolder/*transferfiles*.csv" $Destination
}
我必须使用 PUTTY 从目录“/sourcedir/Test/TRANS*/transferfiles.csv”中的 SFTP 帐户获取文件,并将它们传输到我的本地目标目录。在目录路径中使用通配符“TRANS*”时遇到问题。我如何在目录路径中使用多个通配符?我收到错误 "/sourcedir/Test/TRANS*/*transferfiles*.csv": multiple-level wildcards unsupported."
。
TIA
[string]$TransferResults = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@$(IPaddress):/sourcedir/Test/TRANS*/*transferfiles*.csv" $Destination
我尝试了@Cpt.Whale建议的解决方案。 输出:
Listing directory /sourcedir/Test/ drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_whiteplain drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_test_1
要在 foreach 循环中解析的代码片段。
foreach($file in $parsedfolders){
[string]$fpath = $file.fullName
[string]$TransferResults = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@$(IPaddress):$fpath/*transferfiles*.csv"
$Destination
我收到错误:无法识别/传输文件.csv:没有这样的文件或目录
根据您的评论,我假设 pscp -ls
的输出如下所示:
Listing directory /sourcedir/Test/
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_whiteplain
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS_test_1
drwxr--r-- 1 - - 0 Apr 28 14:43 TRANS test spaces
从该输出中,我们可以使用正则表达式获取文件夹名称:
# First, list the folder names in the upper level folder
$folders = & 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' -ls "username@10.0.0.1:/sourcedir/Test/"
# only lines starting with d, select everything after time "0:00"
$pattern = '^d.+\d:\d{2} (.*)'
# parse output into folder names using regex
$parsedFolders = foreach ($folder in $folders) {
# trim whitespace
[regex]::Match($folder,$pattern).Groups[1].Value.trim() |
# discard empty results
Where { -not [string]::IsNullOrWhiteSpace($_) }
}
现在解析后的文件夹应该可以使用了:
$parsedFolders
TRANS_whiteplain
TRANS_test_1
TRANS test spaces
所以尝试为每个文件夹制作副本:
# Finally, copy files from each parsed folder to destination
$results = foreach ($parsedFolder in $parsedFolders) {
& 'C:\Program Files\PuTTY\pscp.exe' -l 'username' -pw 'password' "username@10.0.0.1:/sourcedir/Test/$parsedfolder/*transferfiles*.csv" $Destination
}