我遇到了ss64.com,它为如何编写Windows命令解释器将运行的批处理脚本提供了很好的帮助.
但是,我一直无法找到批处理脚本的语法,扩展或不扩展的方法,以及如何逃避事情的良好解释.
以下是我无法解决的示例问题:
foreach $i (@ARGV) { print '*' . $i ; }),编译它并以这种方式调用它:
my_script.exe "a ""b"" c"?输出是 *a "b*cmy_script.exe """a b c"""?输出它*"a*b*c"echo命令如何工作?在那个命令中扩展了什么?for [...] %%I在文件脚本中使用,但for [...] %I在交互式会话中?%PROCESSOR_ARCHITECTURE%字面回声?我发现echo.exe %""PROCESSOR_ARCHITECTURE%有效,有没有更好的解决方案?%配对?例:
set b=a,echo %a %b% c%?%a a c%set a =b,echo %a %b% c%?bb c%如何使用转义双引号替换批处理文件参数中的所有双引号?这是我当前的批处理文件,它扩展了字符串中的所有命令行参数:
@echo off
call bash --verbose -c "g++-linux-4.1 %*"
Run Code Online (Sandbox Code Playgroud)
然后它使用该字符串调用Cygwin的bash,执行Linux交叉编译器.不幸的是,我将这些参数传递给我的批处理文件:
"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions
-Wno-inline -Wall -DNDEBUG -c
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o"
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"
Run Code Online (Sandbox Code Playgroud)
传入第一个路径的第一个引用是过早地结束传递给GCC的字符串,并将其余参数直接传递给bash(这非常失败.)
我想如果我可以将参数连接成一个单独的字符串然后转义它应该正常工作的引号,但我很难确定如何做到这一点.有人知道吗?
我试图使用批处理文件编写VPN拨号器/断路器,但我卡住了.经过一番调查后,我发现%密码的存在并不好.
这是代码
@echo OFF
SET SWITCHPARSE1=%1
SET SWITCHPARSE2=%2
REM echo %SWITCHPARSE1%
SHIFT
SHIFT
IF "SWITCHPARSE1" == "" goto Usage
IF "SWITCHPARSE1" == "/?" goto Usage
IF "SWITCHPARSE2" == "" goto Usage
IF "SWITCHPARSE2" == "/?" goto Usage
IF "%SWITCHPARSE1%" == "sl" (
IF "%SWITCHPARSE2%" == "conn" (
echo "inside sl conn"
rasdial sl employee1 K%%Pxev3=)g:{#Swc9
goto end
) ELSE IF "%SWITCHPARSE2%" == "disconn" (
rasdial sl /disconnect
goto end
) ELSE (
goto Usage
)
) ELSE IF …Run Code Online (Sandbox Code Playgroud) 这个自我回答的问题旨在系统地概述 PowerShell CLI(命令行界面),适用于Windows PowerShell ( powershell.exe) 和PowerShell (Core) v6+(pwsh.exe在 Windows 上,pwsh在 Unix 上)。
尽管存在官方帮助主题(请参阅答案中的链接),但它们并没有描绘出完整的画面并且缺乏系统的处理(截至撰写本文时)。
其中,回答了以下问题:
特定于版本的 CLI 有何不同?
如何将要执行的 PowerShell 代码传递给 CLI?怎么办-Command(-c)和-File(-f)有什么区别?
传递给这些参数的参数需要如何引用和转义?
哪些字符编码问题会起作用?
PowerShell CLI 如何处理 stdin 输入,它们生成什么 stdout/stderr 以及以什么格式?
powershell quoting command-line-interface character-encoding io-redirection
我正在尝试使用批处理文件来创建另一个批处理文件...这是一个我必须经常使用的文件,每次都会更改一些变量.我遇到了一个问题,因为在我试图创建的批处理中,它也使用echo来写入.txt文件.
这是命令:
echo echo %date% - %time% >> C:\MOVEit\Logs\FileGrabberLog.txt >> C:\filegrabber_%org%.bat
Run Code Online (Sandbox Code Playgroud)
我想将整个字符串echo %date% - %time% >> C:\MOVEit\Logs\FileGrabberLog.txt输入C:\ filegrabber_%org%.bat.
我可以在它周围放置""但它们出现在我正在尝试创建的批处理中.
有人知道解决这个问题吗?
例如,我有这样的循环,在名称包含百分号的文件夹上调用dir,因此解释器尝试将这些字符之间的字符解析为变量.这样的文件夹例如在虚拟化解决方案(例如ThinApp)中是常见的,即将存储在本地用户AppData中的数据改为写入例如:X:\ My Virtualized App \%AppData%.
当然我知道可以通过将%加倍来实现它,但是不可能说服解释器在for循环中不解析这样的变量,例如:
FOR /F "tokens=*" %%F IN ('dir /b /s X:\myapp\%AppData% ') DO @(
echo %%F
)
Run Code Online (Sandbox Code Playgroud)
在这里,无论我尝试什么,加倍,四倍的百分比,或添加插入没有任何区别.传递给dir命令的路径已解析appdata,因此具有两个驱动器规范无效.
在我的程序中,我做了它显示20%或2%,但百分号没有显示.你有什么方法可以显示百分比符号吗?
(这是为了最小的字符限制,不要在这里往下看)
我在 Windows 上的 git bash 中使用以下 git 命令:
git log --format="%C(cyan)%cd%Creset %s" --date=short -5
Run Code Online (Sandbox Code Playgroud)
它显示提交日期 ( %cd),后跟提交消息 ( %s)。提交日期用颜色标记包裹:%C(cyan)开始彩色输出和%Creset停止彩色输出。
虽然它在 git bash 中运行良好,但它不适用于cmd:%cd%被 Windows shell 扩展到当前工作目录(相当于$PWD在 bash 中)。
因此,当该命令通过 运行时cmd,我看到当前工作目录显示而不是第一列中的提交日期!
git bash:
2015-10-08 commit msg
2015-10-08 commit msg
2015-10-07 commit msg
2015-10-06 commit msg
2015-10-06 commit msg
Run Code Online (Sandbox Code Playgroud)
指令:
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
Run Code Online (Sandbox Code Playgroud)
实际上,我cmd自己从来没有直接使用过,我在编写 …
我试过http live streaming用ffmpegwindows build(http://ffmpeg.zeranoe.com/builds/)
这是命令
ffmpeg.exe -v 9 -loglevel 99 -re -i tes.avi -an ^
-c:v libx264 -b:v 128k -preset medium ^
-flags -global_header -map 0 -f segment -segment_time 4 ^
-segment_list test.m3u8 -segment_format mpegts stream%^05d.ts
Run Code Online (Sandbox Code Playgroud)
但是出现了一条错误消息,
[segment @ 045f5840] Codec for stream 0 does not use global headers but container format requires global headers
[segment @ 045f5840] Selected stream id:0 type:video
[mpegts @ 062f2540] Invalid segment filename template 'stream05d.ts'
[AVIOContext @ 04a90e00] Statistics: …Run Code Online (Sandbox Code Playgroud) 我将以下内容作为参数传递给 powershell(w7 上的 v4):
-debugWrite -fileName SettingsFile -jsonContent { "c": "some setting", "d": "unknown", "b": "some thing", "a": 1 }
Run Code Online (Sandbox Code Playgroud)
但是 PS 被 JSON 挂断了。我试过分隔 \double-quotes\ 并将 -jsonContent 之后的所有内容放在“单引号”中,但无济于事。
这是运行 PS 的 Windows 7 (PS4) 环境:
注意:“...”混淆指的是同一个目录。IOW,所有文件都位于同一目录中。
运行一个批处理文件,开始整个事情:
"C:\...\script.bat" > "C:\...\script-output.txt" 2>&1
Run Code Online (Sandbox Code Playgroud)
这会运行script.bat并输出到script-output.txt. script.bat是一个长的 1-liner:
%WINDIR%\sysnative\windowspowershell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "C:\...\customscript.PS1" --% -fileName DropFileToCreate -jsonContent "{ "c": "some setting", "d": "unknown", "b": "some thing", "a": 1 }" -debugWrite
Run Code Online (Sandbox Code Playgroud)
传奇:
DropFileToCreate - 传递给 PS 脚本的文件名,用于在同一目录中创建文件。
-jsonContent- …
为什么我不能bcdedit在PowerShell中编辑描述字段?
例如,在cmd.exe以下命令中:
bcdedit /set {GUID} description "OS2"
Run Code Online (Sandbox Code Playgroud)
成功完成,更改指定GUID的描述字段,但是当我从Powershell执行相同操作时,我收到以下错误:
The set command specified is not valid.
Run "bcdedit /?" for command line assistance.
The parameter is incorrect.
Run Code Online (Sandbox Code Playgroud)
谁可以给我解释一下这个?
我有这个在 powershell 上运行正常的命令
Compare-Object (Get-Content "tex1.txt") (Get-Content "tex2.txt") | Where-Object{$_.SideIndicator -eq "<="} | select inputobject | ft -hidetableheaders
Run Code Online (Sandbox Code Playgroud)
我正在尝试通过执行以下操作在 cmd 中运行:
powershell -Command " & {Compare-Object (Get-Content "tex1.txt") (Get-Content "tex2.txt") | Where-Object{$_.SideIndicator -eq "<="} | select inputobject | ft -hidetableheaders}"
Run Code Online (Sandbox Code Playgroud)
但它说的是:名称、目录或卷语法不正确(是西班牙语,所以我不知道确切的翻译)
我认为问题在于管道,因为在管道之前运行所有内容:Compare-Object (Get-Content "tex1.txt") (Get-Content "tex2.txt")有效
PD:我也尝试^在管道之前写,但我没有成功。