我坚持这个:我需要在批处理脚本上合并两个文本文件在单个制表符分隔的文本文件中.例如:
文件1:
qwer
tyui
asdf
Run Code Online (Sandbox Code Playgroud)
文件2:
1345
6876
8796
Run Code Online (Sandbox Code Playgroud)
文件3:
qwer 1345
tyui 6876
asdf 8796
Run Code Online (Sandbox Code Playgroud)
事实上,我所需要的只是Unix命令: paste -d "\t" file1 file2 > file3
我有一个批处理文件,需要传递一个包含管道和空格的参数.由于空格,在传入参数时需要将双引号附加到参数上.我需要去掉那些双引号并回显参数.通常,使用〜会让我这样做,但我认为我传入的具体参数会导致问题.如果我这样做:
[test1.bat]
call test2.bat "Account|Access Level|Description"
Run Code Online (Sandbox Code Playgroud)
[test2.bat]
echo %1
echo %~1
Run Code Online (Sandbox Code Playgroud)
并运行test1.bat,我得到这个输出:
"Account|Access Level|Description"
'Access' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
那么如何删除双引号并仍然有一个可用的变量?
假设你跑了 test.bat "blabla,blabla,^>blabla", "blaby"
test.bat实现:
@SETLOCAL
@ECHO OFF
SET list=%~1
ECHO "LIST: %list%"
ECHO "ARG 1: %~1"
ECHO "ARG 2: %~2"
@ENDLOCAL
@GOTO :EOF
Run Code Online (Sandbox Code Playgroud)
输出符合预期:
"LIST: blabla,blabla,>blabla"
"ARG 1: blabla,blabla,^>blabla"
"ARG 2: blaby"
Run Code Online (Sandbox Code Playgroud)
但是,如果在批处理文件中使test.bat成为一个函数,该怎么办:
@SETLOCAL
CALL :TEST "blabla,blabla,^>blabla", "blaby"
@ENDLOCAL
@GOTO :EOF
:TEST
@SETLOCAL
@ECHO OFF
SET list=%~1
ECHO "LIST: %list%"
ECHO "ARG 1: %~1"
ECHO "ARG 2: %~2"
@ENDLOCAL
@GOTO :EOF
Run Code Online (Sandbox Code Playgroud)
运行后输出为:
"LIST: blabla,blabla,^"
"ARG 1: blabla,blabla,^^>blabla"
"ARG 2: blaby"
Run Code Online (Sandbox Code Playgroud)
咦?
blabla列表中去了哪里?^^?为什么?有人可以解释特殊字符在函数参数中的行为方式与命令行参数不同吗?
我知道,在比较批处理文件中的内容是否相等时,通常将两边括在引号中,例如
IF "%myvar% NEQ "0"
Run Code Online (Sandbox Code Playgroud)
但是,当使用“大于”或“小于”进行比较时,这不起作用,因为操作数将被视为带有引号的字符串。所以你可以这样做
IF %myvar% GTR 20000
Run Code Online (Sandbox Code Playgroud)
需要注意的是,如果变量 %myvar% 没有声明,那么就像这样做
IF GTR 20000
Run Code Online (Sandbox Code Playgroud)
这是一个语法错误。
我想出了以下解决方法:
IF 1%myvar% GTR 120000
Run Code Online (Sandbox Code Playgroud)
我希望这会导致IF 1 GTR 120000ifmyvar未定义,并且它似乎有效。
这是比较数字和计算未声明变量的安全方法,还是我只是提出了一个全新的警告?
批处理脚本非常新。我需要将命令的输出分配给变量。我开始了解 FOR /F 命令。我的命令有空格和双引号。所以我尝试使用 usebackq 选项。但它因空间错误而失败。
for /F "usebackq delims=" %%G IN (`"C:\Program Files (x86)\ABC\DEF\XYZ.exe" Get /a "P1=D2" /b "Q1=D3" /c "D5"`) DO (
SET var=%%G
)
ECHO %var%
pause
Run Code Online (Sandbox Code Playgroud)
失败 :
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
根据 StackOverflow 上的其他问题,我做的一切都是正确的 - usebackq来使用反勾号,demlims=来忽略空格作为分隔符。我不知道为什么它仍然失败。任何帮助表示赞赏!
我有一个程序的长路径名,我必须在for/f循环中运行,其中包括一个右括号")",我需要从中解析输出:
for /f "tokens=1" %%G in ('"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list') do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
...'list'是传递给我程序的参数.我收到错误"'C:\ Documents'不被识别为内部或外部命令,可操作程序或批处理文件."
我知道问题是,右括号实际上关闭了"for"块,因此结尾的双引号不是"看到"的,所以长路径名不再包含在双引号内.我不明白的是为什么会发生这种情况,因为我的路径是用双引号括起来的?我也尝试了usebackq选项:
for /f "usebackq tokens=1" %%G in (`"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list`) do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
......没有更好的结果.我试图逃避这样的"^)"或像这样的"^^)",无所事事.尝试加倍双引号:
for /f "tokens=1" %%G in ('""C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe"" list') do (echo Will do something with %%G)
Run Code Online (Sandbox Code Playgroud)
仍然无法正常工作.
此外,我实际上使用了一个保存路径的变量,这个变量事先不知道(从%CD%构建),并且激活了EnableDelayedExpansion.我尝试了延迟扩展(在其他情况下修复了类似的问题)以防止变量在读取时扩展并在执行时延迟它:
setlocal EnableDelayedExpansion
set _var=%CD%\program.exe
@REM _var now contains C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe
for /f "tokens=1" %%G …Run Code Online (Sandbox Code Playgroud) 假设我有变量a与内容" 123 "和变量b123与其中的一些文本.出于某种原因,我想使用变量a作为第二个var名称的一部分.像这样的东西:
SET a=123
SET b123=some_text_in_it
rem i want next line to output "some_text_in_it"
echo %b%a%%
Run Code Online (Sandbox Code Playgroud)
所以我想将文本与var内容连接起来,并使用结果字符串作为变量名称来回显该内容.上面的示例不起作用,我明白为什么,可能我需要添加一些灌浆.怎么做,最好在一条线上?
我正在尝试回显存储在变量中的字符串,但它似乎需要大量的转义.我正在尝试使用以下代码:
setlocal EnableDelayedExpansion
@echo off
set "grass=@##&!$^&%**(&)"
echo !grass!
Run Code Online (Sandbox Code Playgroud)
我想grass逐字回显变量,所以我@##&!$^&%**(&)在输出中看到了一个.应该做什么?谢谢!
我有一个Batch脚本,我想在其中获取脚本的完整路径.我很好奇,这有什么区别:
set scriptpath=%0
Run Code Online (Sandbox Code Playgroud)
还有这个:
set scriptpath=%~f0
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
我在编写批处理文件时遇到了一个“奇怪的”(对我来说)问题,希望有人能解释为什么这样做了……我有一个批处理文件建立了一个相当复杂的命令行,我希望它在执行之前将其构建的内容回显到屏幕上,以便我可以检查它是否正确构建。我还有其他方法可以做到这一点1,但是由于各种原因,我尝试了某种形式的东西:
for %%a in (echo "") do %%~a complicated-command-line-with-parameters
Run Code Online (Sandbox Code Playgroud)
想法是它将运行该do部分两次:一次%%a设置为echo(将命令显示在控制台上),一次设置为"":期望它实际上将执行该命令(使用%%~a会去除双引号和所有剩下的就是命令本身)。但是,在echo工作时,命令本身未执行。
对于最小复制,请从命令提示符处运行以下命令:
C:\>for %a in (echo "") do %~a dir
C:\>echo dir
dir
C:\> dir
Run Code Online (Sandbox Code Playgroud)
可以看出,它可以echo很好地运行命令,但是似乎前面的空格dir阻止了它的执行。
但是请注意,手动运行带有前导空格的命令是可以的:
C:\> dir
Volume in drive C is OS
Volume Serial Number is A8BD-F861
...
Run Code Online (Sandbox Code Playgroud)
并且,如果以某种方式尝试运行该命令<space>dir,那么它(可能)会抱怨缺少命令:
C:\>" dir"
'" dir"' is not recognized as an internal or external command,
operable program …Run Code Online (Sandbox Code Playgroud) batch-file ×10
windows ×7
cmd ×5
bash ×1
escaping ×1
for-loop ×1
quotes ×1
variables ×1
windows-10 ×1