我需要验证用户是否输入了有效的unix路径语法,而不是主机上的实际路径。
可以有一个或多个路径,路径之间用逗号或白色分隔,路径可以用单引号、双引号引起来,也可以不引起来。
下面的powershell尝试无法验证上述条件:
- name: Validate Inputs
run: |
$inputPaths = "${{ inputs.source_files }}"
# Check if the input is not empty
if (-not $inputPaths) {
echo "Error: 'paths' input is required."
exit 1
}
# Check syntax of each provided path
$pathsArray = $inputPaths -split ',| '
foreach ($path in $pathsArray) {
if (-not ($path -match "^[a-zA-Z]:\\|\\\\|/'[^'\s].*'$|^[a-zA-Z]:\\|\\\\|/\"[^\"\s].*\"$|^[a-zA-Z]:\\|\\\\|/[^'\s]+$")) {
echo "Error: '$path' is not a valid absolute path syntax."
exit 1
}
}
echo "Inputs have valid syntax.
字符串
有效的输入包括
/tmp/mydir
'/tmp/my dir1'
"/tmp/my dir2"
/tmp/mydir '/tmp/my dir1' '/tmp/my dir2'
'/tmp/my dir1','/tmp/my dir2'
型
无效的输入:
'/tmp/my dir1,/tmp/my dir2'
/tmp/my dir1
'/tmp/my dir1
/tmp/my dir1'
型
我尝试验证报价,但在有效报价时出错:
$paths = "'/u/marsh/UNX/scripts/testscript/test_maillist.txt' '/pathx with space/file1' '/path,with,commas/file2' ""/double quoted path/file3"" ""/path with space/file4"" 'single quoted path/file5' /pathx with space/file1"
# Split paths by whitespace or comma while preserving paths enclosed in quotes
$splitPaths = $paths -split "(?<=\S)\s+|(?<=\S),"
foreach ($path in $splitPaths) {
# Check if the path is enclosed in single or double quotes
if (-not (($path -like "'*'") -or ($path -like '"*"'))) {
Write-Host "Error: Path '$path' is not enclosed in single or double quotes."
exit 1
}
# Remove leading and trailing quotes
$cleanPath = $path.Trim("'").Trim('"')
Write-Host "Cleaned Path: $cleanPath"
}
型
错误输出,当它不应该有:
Cleaned Path: /u/marsh/UNX/scripts/testscript/test_maillist.txt
Error: Path ''/pathx' is not enclosed in single or double quotes.
型
好心的建议。
1条答案
按热度按时间km0tfn4u1#
看起来你的输入路径是以 string literals 和/或 barewords 的 * list * 的形式:
'/tmp/my dir1,/tmp/my dir2'
-似乎对你的验证施加了一个不明显的约束:,
是文件名中的合法字符,则逐字/tmp/my dir1,/tmp/my dir2
在形式上是有效的 * 单一 * 路径。NUL
(代码点为0x0
的字符)在类Unix平台上的文件系统中的路径中是无效的。,
-根据需要进行调整。以下解决方案使用了两步方法:
[regex]::Match()
API,将路径的 * 列表 * 解析为它所表示的 * 逐字 * 项。[regex]::Match()
使用的正则表达式的解释以及使用它的选项,请参见this regex101.com page。'/foo/3" of snow'
或"/foo/3'o clock"
),但也不能使用 * 转义 * 嵌入式引号(例如,"/foo/3
" of snow"或
'/foo/3''o clock'`)-match
运算符验证每个项是否表示 * 绝对Unix路径 *。-match
使用的正则表达式的解释以及使用它的选项,请参见this regex101.com page。字符串
输出(注意,每一个输出行代表一个(成功解析的)* 单独 * 路径):
型