找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 9963|回复: 15

[其他] 怎样把PowerShell语句改成CMD脚本语句?谢谢!

[复制链接]
发表于 2025-7-5 06:10:27 | 显示全部楼层 |阅读模式
PowerShell语句:
  1. $str = "新建%Test文图"
  2. $newstr = $str -replace '%', '%%'
  3. Write-Output "替换后: $newstr"
复制代码
结果:替换后:新建%%Test文图

把旧字符串“新建%Test文图”,变成新字符串“新建%%Test文图”,
也就是将一个%,替换成两个%%。
用CMD语句怎样实现?
谢谢啦!
发表于 2025-7-5 11:19:55 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-5 11:39 编辑

回复 1# Shuye

这是一个较为 '怪异' 的转换,因为 % 字符是 cmd 中全局变量的引用符,在任何语境中均会被强行求值,故字面量中的单个 % 字符须被加倍写入。当采用字符串替换函数时还须用延迟变量协助完成,以下是相应的cmd示例代码...

  1. @echo off &setlocal enabledelayedexpansion
  2. set "$str=新建%%Test文图"
  3. set "$newstr=!$str:%%=%%%%!"
  4. echo,替换后: %$newstr%
  5. pause&exit/b
复制代码
 楼主| 发表于 2025-7-5 13:16:50 | 显示全部楼层
本帖最后由 Shuye 于 2025-7-5 13:29 编辑
回复  Shuye

这是一个较为 '怪异' 的转换,因为 % 字符是 cmd 中全局变量的引用符,在任何语境中均会被 ...
aloha20200628 发表于 2025-7-5 11:19



    谢谢 aloha20200628 兄!
只是,这串"新建%Test文图",不是手工写入的,而是程序运行中自动提取的,存入某个变量,如Temppat,
事先不知道变量Temppat里有没有%,也不知道%的具体位置,如果有%,就将%替换为%%。

既然PowerShell可以做到,能不能在CMD脚本中调用PowerShell代码来实现?
比如:powershell -command …………
谢谢啦!
发表于 2025-7-5 13:57:43 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-5 14:23 编辑

回复 3# Shuye

你用记事本写入 新建%Test文图 之后存为 1.txt,再运行以下代码(存为 1.bat 与 1.txt 同目录)试试看结果...

  1. @echo off &setlocal enabledelayedexpansion
  2. ::下式将 1.txt 第一行读入 $str 变量
  3. set/p "$str="<1.txt
  4. set "$newstr=!$str:%%=%%%%!"
  5. echo,替换后: %$newstr%
  6. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
Shuye + 1 成功!

查看全部评分

 楼主| 发表于 2025-7-5 14:18:43 | 显示全部楼层
回复  Shuye

你用记事本写入 新建%Test文图 之后存为 1.txt,再运行以下代码(存为 1.bat 与 1.txt 同目 ...
aloha20200628 发表于 2025-7-5 13:57



    通过过渡文件,替换成功。谢谢 aloha20200628 兄!

不过,我还是想要不用过渡文件的代码。
发表于 2025-7-5 14:29:12 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-5 14:36 编辑

回复 5# Shuye

其实用4楼代码是要证明》只要变量 $str 未被其字面量暴露出 % 字符,就应该没问题,不必非绕道从文件读入...
 楼主| 发表于 2025-7-5 14:40:53 | 显示全部楼层
回复  Shuye

其实用4楼代码是要证明》只要变量 $str 未被其字面量暴露出 % 字符,就应该没问题,不必非 ...
aloha20200628 发表于 2025-7-5 14:29



    求代码。谢谢!
发表于 2025-7-5 15:01:08 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-5 15:25 编辑

回复 7# Shuye

从文件数据读入到变量 $str 只是不用字面量生成 $str 的示例之一,楼主能说明 “程序运行中自动提取生成的变量 Temppat ...” 的具体过程吗?或给一段示例代码以便接龙到批处代码中...
发表于 2025-7-7 12:27:19 | 显示全部楼层
回复 1# Shuye


将Powershell代码嵌入到批处理执行:
  1. @echo off
  2. set "original=新建%%Test文图"
  3. set "psCommand=$str='%original%'; $newstr=$str -replace '%%','%%%%'; $newstr"
  4. for /f "delims=" %%a in ('powershell -Command "%psCommand%"') do set "result=%%a"
  5. echo 替换后: %result%
复制代码
发表于 2025-7-7 13:49:04 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-7 13:58 编辑


有趣的是3楼说的这个内含 % 字符的 Temppat 变量值,我们还不知从何而来,假设是从文本文件 1.txt 读取而来,即如4楼代码之解,或如下用批处调用 powershell 亦可,但楼主至今未明变量 Temppat 的来路 ...

  1. @echo off &for /f "delims=" %%v in ('powershell "(gc 1.txt -raw).replace('%%','%%%%')" ') do set "$newstr=%%v" &echo,%%v
复制代码
 楼主| 发表于 2025-7-10 15:32:35 | 显示全部楼层
本帖最后由 Shuye 于 2025-7-10 15:43 编辑
回复  Shuye


将Powershell代码嵌入到批处理执行:
yakeyun 发表于 2025-7-7 12:27


谢谢 yakeyun 兄!

不过,赋值不对,赋了两个%%:set "original=新建%%Test文图"
我的原意是:将单%的,新建%Test文图,替换为双%%的,新建%%Test文图。
   
 楼主| 发表于 2025-7-10 15:34:03 | 显示全部楼层
回复  Shuye

从文件数据读入到变量 $str 只是不用字面量生成 $str 的示例之一,楼主能说明 “程序运行中 ...
aloha20200628 发表于 2025-7-5 15:01



谢谢 aloha20200628 兄!

上文说的,字符串,新建%Test文图,存入变量Temppat,只是打个比方。
又比如,通过右键菜单调用脚本,脚本接收,Set "Temppat=%~1",
如果目标对象含%,那么Temppat的值中就含%。
现在的难题是,没办法将单%替换为双%%。
 楼主| 发表于 2025-7-10 15:36:08 | 显示全部楼层
本帖最后由 Shuye 于 2025-7-10 15:51 编辑
有趣的是3楼说的这个内含 % 字符的 Temppat 变量值,我们还不知从何而来,假设是从文本文件 1.txt 读取而 ...
aloha20200628 发表于 2025-7-7 13:49



谢谢 aloha20200628 兄!

通过过渡文件替换,也有个难题:
怎样把Temppat的值,也就是,新建%Test文图,写进过渡文件?
常规的几种方法,都会把单%吃掉,变成:新建Test文图。
除非手工干预,加多一个%。
既然手工干预,那就不用通过过渡文件替换了。

发表于 2025-7-10 17:27:35 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-7-10 18:13 编辑

回复 12# Shuye

用批处脚本直接处理命令行参数 %1 为例,以下代码存为 test.bat,命令行运行 test.bat "新建%Test文图"  看其运行效果吧...

  1. @echo off &setlocal enabledelayedexpansion
  2. set "$str=%~1"
  3. set "$newstr=!$str:%%=%%%%!"
  4. echo,替换后: %$newstr%
  5. pause&exit/b
复制代码
如果将命令行参数 %1 先写入文件再读回处理,可用以下代码(如命令行参数不含&等特殊字符亦可用 echo,%~1>1.txt 替代第二行)...

  1. @echo off &setlocal enabledelayedexpansion
  2. set/p="%~1"<nul>1.txt
  3. set/p "$str="<1.txt
  4. set "$newstr=!$str:%%=%%%%!"
  5. echo,替换后: %$newstr%
  6. pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
Shuye + 1 测试通过。

查看全部评分

发表于 2025-7-10 20:08:53 | 显示全部楼层
就因为多写了几行,补充成相对完整的代码,就不会用了?
另外,好奇楼主把全文加蓝,除了刺眼还有什么作用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:05 , Processed in 0.032227 second(s), 13 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表