这段代码
@echo off
setlocal EnableDelayedExpansion
set myvar=first
set first=second
echo myvar:!myvar!
set myvar=!myvar!
echo myvar:!myvar!
Run Code Online (Sandbox Code Playgroud)
给
myvar:first
myvar:first
Run Code Online (Sandbox Code Playgroud)
在Windows Vista SP2上.
我预期的输出是
myvar:first
myvar:second
Run Code Online (Sandbox Code Playgroud)
为什么差异以及如何获得理想的效果?
如何在批处理中读取和解析具有特殊字符的文件?我有一个名为test.txt的文本文件,只有foo!!!bar一个批处理文件:
@echo off
setlocal enabledelayedexpansion enableextensions
FOR /F "tokens=* delims=" %%a IN (.\test.txt) DO (
echo Unquoted is %%a
echo Quoted is "%%a"
set "myVar=%%a"
echo myVar is still !myVar! or "!myVar!"
)
exit /b 0
Run Code Online (Sandbox Code Playgroud)
我希望并期望它以foo!!!bar某种方式输出,但这输出:
Unquoted is foobar
Quoted is "foobar"
myVar is still foobar or "foobar"
Run Code Online (Sandbox Code Playgroud)
当然我可以type test.txt,但我想处理文件的每一行.
如果您有一个包含空格的文件名,通常在Windows命令shell(cmd.exe)上引用它.
dir "\Program Files"
Run Code Online (Sandbox Code Playgroud)
这也适用于其他特殊字符^&;,=.但它不适用于百分号,因为它们可能是变量替代的一部分.例如,
mkdir "%os%"
Run Code Online (Sandbox Code Playgroud)
将创建一个名为的目录Windows_NT.要逃脱百分号,可以使用插入符号:
mkdir ^%os^%
Run Code Online (Sandbox Code Playgroud)
但不幸的是,插入符号在双引号中失去了意义:
mkdir "^%os^%"
Run Code Online (Sandbox Code Playgroud)
创建一个名为的目录^%os^%.
这是我到目前为止发现的(Windows 7命令shell):
^和&可与插入符号或双引号进行转义.;,,,=,和空间只能用双引号转义.%只能用插入符号进行转义.'`+-~_.!#$@()[]{}显然,这些字符不必在文件名中进行转义.<>:"/\|?*无论如何,这些字符在文件名中都是非法的.这似乎使得引用文件名的通用算法相当复杂.例如,要创建一个名为的目录My favorite %OS%,您必须编写:
mkdir "My favorite "^%OS^%
Run Code Online (Sandbox Code Playgroud)
问题1:是否有更简单的方法来安全地引用空格和百分比字符?
问题2:'`+-~_.!#$@()[]{}如果没有逃脱,角色是否真的可以安全使用?
我正在尝试批量创建一个简单的脚本以在Windows中运行,该脚本有3个变量:
该脚本工作正常,除非URL包含%20或%2F等字符,其中我猜cmd.exe试图将它们用作变量,我将URL的值放在引号之间,但这没有帮助.
如果我使用地址:
set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"
Run Code Online (Sandbox Code Playgroud)
浏览器打开这个:
https://domain.com/app.html?path=FFlocalhostFcode&do_pause=false&go=true
Run Code Online (Sandbox Code Playgroud)
有没有办法可以设置变量或处理它的值,这样它就不会将这些符号解释为变量名?
在此先感谢,这里是代码供参考.这是我第一次尝试批量编写脚本,所以任何建议都会非常感激.
@echo off
echo "Setting variables..."
set iterations=2
set url="http://domain.com/app.html?path=%2F%2Flocalhost%2Fcode&do_pause=false&go=true"
set time=5
set browser="C:\Program Files\Google\Chrome\Application\chrome.exe"
echo "Running the browser..."
FOR /L %%i IN (1,1,%iterations%) DO (
%browser% %url%
timeout %time%
)
ECHO Browsers are running, press Enter when ready to close this window. . .
pause
Run Code Online (Sandbox Code Playgroud) 我一直在使用Python timeit模块,但它只是通过交互式Python会话或Unix shell.现在,我正在尝试在Windows命令提示符(cmd.exe)中测量一些代码片段,但它显示以下错误:
C:\Users\Me>python -m timeit '"-".join(map(str, range(100)))'
Traceback (most recent call last):
File "C:\Python33\lib\runpy.py", line 160, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python33\lib\runpy.py", line 73, in _run_code
exec(code, run_globals)
File "C:\Python33\lib\timeit.py", line 334, in <module>
sys.exit(main())
File "C:\Python33\lib\timeit.py", line 298, in main
t = Timer(stmt, setup, timer)
File "C:\Python33\lib\timeit.py", line 131, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 6
'-.join(map(str,
^
SyntaxError: EOL while scanning string literal
Run Code Online (Sandbox Code Playgroud)
这是相当令人困惑的,因为我没有在字符串中插入任何换行符 - 相反,我实际上直接从timeit模块文档粘贴了示例.
在玩这个时,我尝试测试没有任何空格的片段,因为错误标记了它们之前的字符.即使现在没有异常,模块也会报告相同的执行时间,就像我传递了一个pass …
如何检查批处理文件中的变量是否包含特殊字符?例如,如果我的变量包含文件名,则文件名不应包含\/ < > | : * " ?此类字符。
@echo off
set param="XXX"
echo %param%| findstr /r "^[^\\/?%*:|"<>\.]*$">nul
if %errorlevel% equ 0 goto :next
echo "Invalid Attribute"
:next
echo correct
Run Code Online (Sandbox Code Playgroud)
我使用此链接作为参考正则表达式来验证文件夹名称和文件名
通常可以用来^在命令行中转义字符。但我无法让它工作。
这是一个测试程序,CommandArguments.exe,它打印它得到的参数。
int main(int argc, char *argv[])
{
int i, j;
for (i = 0; i < argc; ++i) {
printf("%d: %s\n", i, argv[i]);
for (j = 0; j < strlen(argv[i]); ++j) {
printf(" ");
printf("%d ", argv[i][j]);
}
printf("\n");
}
}
Run Code Online (Sandbox Code Playgroud)
有问题的程序 LineBreakCommandArguments.exe 如下所示:
void main(void)
{
system("CommandArguments ^\n"); // ^\n does not really pass a line break...
}
Run Code Online (Sandbox Code Playgroud)
LineBreakCommandArguments.exe 的输出:
>LineBreakCommandArguments.exe
0: CommandArguments
67 111 109 109 97 110 100 65 114 103 117 109 101 …Run Code Online (Sandbox Code Playgroud) c windows command-line parameter-passing command-line-arguments
这个引人入胜的帖子:
在一个看似格式错误的cat"shell"(一个Linux shell,大概是BASH)的调用中突出了令人惊讶的行为.基本上,shell似乎能够从一系列字符串中的模糊位置获取可执行文件,然后使用I/O重定向到流/文件描述符.
根据我的理解,基本过程是:
1>(stdout))(这发生在命令中启动可执行进程之前!(例如cat调用))这导致了一些令人惊讶的逻辑.例如,在执行后的新目录中echo "dog" > cat:
<cat cat >dog:从文件中写入"狗" cat来dog使用shell工具cat
<cat cat> cat cat:覆盖第一个命令,留下一个空白cat文件(不确定在第二个命令的中间发生了什么).
<cat cat> cat cat >dog 2>more:创建空文件,dog并用空文件more覆盖cat文件.
<cat >dog cat cat <dog >cat(创建空文件dog,覆盖catw /空文件)
<cat cat >dog 2>much 1>more:用cat空文件覆盖; 创建文件dog/ …我想"在文件中使用 Batch编写符号。
echo| set /p=""" >> abc.txt
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为它将数据发送到我的文件时出错。
有任何想法吗?
我有一个简单的批处理脚本test.bat,它通过命令行参数进行迭代:
@echo off
set prefix=C:\Program Files\MyProg
for %%x in (%*) do (
echo %prefix%
)
Run Code Online (Sandbox Code Playgroud)
这个版本的脚本在 cmd.exe 中没有问题:
C:\>test a b
C:\Program Files\MyProg
C:\Program Files\MyProg
Run Code Online (Sandbox Code Playgroud)
但是,如果我修改批处理文件以具有不同的prefix值,则添加(x86):
set prefix=C:\Program Files (x86)\MyProg
Run Code Online (Sandbox Code Playgroud)
脚本失败:
C:\>test a b
\MyProg was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
这悲剧!我该如何解决这个问题?