是否可以使用批处理文件中的长路径变量来调用 EXE 并将这些变量作为命令行参数?如何操作?
我读到我们可以在批处理文件中设置各种变量。
此外,其中一些参数的路径确实很长。
它们可以用作值以参数形式传递给该批处理文件中调用的 EXE 吗?
我理解并在 PowerShell 脚本中看到过此类示例。可以使用批处理文件及其变量执行类似操作吗?
在尝试使 SET 命令和路径变量正常工作时遇到问题。
答案1
SET MYVAR="Hello World"
ECHO %MYVAR%
将 echo 替换为您想要的任何命令。
我建议您SET /?
在命令提示符窗口中运行并仔细阅读输出。它将为您提供许多非常有用的附加信息。
答案2
是的,这是可能的,而且是更好的方法来编写 .BAT 批处理文件,以便于阅读和轻松更改值和参数。
发生了2个重大缺陷并已得到解决。
A)SET 命令中的空格导致问题
等号必须紧跟在变量名后面。SET MYVAR="List.txt"
摘自 Frank Thomas 在上面链接的 SET 文章,
“变量名或字符串周围的任何多余空格都不会被忽略,与许多其他脚本语言不同,SET 不会容忍多余空格。”。因此,如果您输入 ln --list %MYVAR %(“R”后面的空格),您的命令可能会起作用,因为尾随空格成为变量名的一部分
B) 长路径中的“引号”需要我在其他地方找到的解决方案。
要有长路径,需要部分链接洞察力,因此从这里提取部分答案信息: https://stackoverflow.com/a/55951234/1937901
如果您需要用引号连接路径,则可以使用 = 替换变量中的引号。这不需要您知道路径是否已包含引号。如果没有引号,则不会发生任何变化。
@echo off
rem Paths to combine
set DIRECTORY="C:\Directory with spaces"
set FILENAME="sub directory\filename.txt"
echo %DIRECTORY%
echo %FILENAME%
rem This is just to illustrate how the = operator works
set DIR_WITHOUT_SPACES=%DIRECTORY:"=%
echo %DIR_WITHOUT_SPACES%
rem Combine two paths
set COMBINED="%DIRECTORY:"=%\%FILENAME:"=%"
echo %COMBINED%
使用上面的例子,利用 SET 创建并连接路径字符串,然后将其作为命令行参数推送到 ln.exe
SET FolA1="..文件夹子路径 1." SET FolA2="..文件夹子路径 1." 设置 SrcRoot="C:\Users\用户名\AppData\Roaming\应用程序名称\Backups" 设置目标根目录="S:\HL_TEST\LN" 设置 DstCountFol="003--includedir--cp-bk" 设置目标日志=%目标日志计数:"=%_Log.txt 设置 DstPlus=%DstRoot:"=%\%DstCountFol:"=% 设置 SrcA1=%SrcRoot:"=%\%FolA1:"=% 设置 SrcA2=%SrcRoot:"=%\%FolA2:"=% 设置 DstA1=%DstRoot:"=%\%DstCountFol:"=%\%FolA1:"=% 设置 DstA2=%DstRoot:"=%\%DstCountFol:"=%\%FolA2:"=% 回显 %SrcA1% 回显 %SrcA2% 回显 %DstA1% 回显 %DstA2% 回音开启 ln --progress --json --output %DstLog% --source %SrcA2% --destination %DstA2% --backup --copy %SrcA1% %DstA1%
这是批处理文件中 LN.exe 的最终命令行,以较长路径变量作为参数调用。
答案3
rem from another variable
set "add_path=C:\food\foo bar"
set "path=%add_path%;%path%"
rem ..mode simple append to path
set "path=C:\food\foo bar;%path%"
也可以看看https://ss64.com/nt/set.html了解更多信息