批处理文件中的 Powershell - 如何转义元字符?

2024-05-02

运行 Windows 7,当我复制文件在例程期间到外部磁盘文件备份,我使用 Powershell v2(从批处理文件)在副本文件上重新创建原始文件的所有时间戳。

以下代码在大多数情况下都能成功运行,但并非总是如此:-

SET file=%1
SET dest=E:\

COPY /V /Y  %file% "%dest%"

SetLocal EnableDelayedExpansion
FOR /F "usebackq delims==" %%A IN ('%file%') DO (
      SET fpath=%%~dpA
      SET fname=%%~nxA
)

PowerShell.exe (Get-Item \"%dest%\%fname%\").CreationTime=$(Get-Item \"%fpath%%fname%\" ^| Select-Object -ExpandProperty CreationTime ^| Get-Date -f \"MM-dd-yyyy HH:mm:ss\")

上面的代码复制文件,然后当我将源文件拖放到批处理文件上时,将副本(目标)文件的创建日期/时间设置为源文件的创建日期/时间。

但在某些情况下,代码会失败。如果文件名包含“毒药”字符,例如(例如)方括号[...],它给出了错误“在此对象上找不到属性“CreationTime”“。文件名的解析显然在“有毒”字符处失败。

代码确实not给出错误的符号,例如&.

我尝试了使用单引号和双引号转义 Powershell 命令的各种变体,但没有成功。请有人告诉我如何转义 Powershell 反对的那些字符。

这只是一个更长的批处理例程的一小部分,我依靠它来进行定期系统备份。我没有切换到 .ps1 文件的选项,因此我需要一个在批处理文件中而不是在 .ps1 文件中工作的解决方案。

感谢您的所有建议。

ADDENDUM:我找到了一个解决方案,采纳了 mklement0 善意提供的一项建议。通过用以下命令替换我原来的 Powershell 命令,解决了我的方括号问题 -

PowerShell.exe (Get-Item -LiteralPath \"%dest%\%fname%\").CreationTime=$(Get-Item -LiteralPath \"%fpath%%fname%\" ^| Select-Object -ExpandProperty CreationTime ^| Get-Date -f \"MM-dd-yyyy HH:mm:ss\")

为了便于将来参考,请注意(关于Windows 7的):

  1. 使用此修改后的命令可以成功保留任何额外的空白字符。这是not需要包含一对额外的双引号字符才能实现此目的。

    • Editor's note: It's an edge case, but worth pointing out: without extra enclosing double quotes, any runs of more than one space are folded into one space; e.g.,
      powershell.exe -command echo \"a b\" yields a b.
      Enclosing the entire command in "..." helps in principle -
      powershell.exe -command "echo \"a b\"" - but since cmd.exe then doesn't recognize the overall string as a single, double-quoted string, metacharacters can break the command; e.g.,
      powershell.exe -command "echo \"a & b\""
  2. It is not文件路径可能包含任何“(双引号)字符,因此不需要任何代码来转义该字符。双引号字符在 FAT 和 NTFS 文件系统中是非法字符,因此永远不会在文件路径中遇到。

  3. 原则上在 Powershell 命令中使用 ' (单引号)是不好的,因为该字符在 NTFS 文件系统中不是非法的,因此可以在文件的实际路径中找到。必须优先使用双引号,因为双引号字符是非法的,在实际的 NTFS 路径中永远不会遇到。

  4. 使用 ROBOCOPY,以下通配符解决方案成功even与大多数有毒角色 - 除!(即它可以应对=&`^)。即使有,这个命令也非常强大more超过一个有毒字符(尽管并非万无一失):

    ROBOCOPY "%fpath% " "%dest%" "*%name%*%ext%*" /B /COPY:DAT /XJ /SL /R:0 /W:0 /V

    A。 “%fpath%”中的空格是必需的,它不是错误。

    b.在所有情况下唯一致命的有毒字符是感叹号 (!)。

    C。有毒字符似乎只是文件名中的问题,而不是路径中的问题。


首先要做的事情是:

在 Windows 7 中,您可以使用robocopy.exe复制文件,默认情况下保留时间戳(并且可以选择为您提供有关复制哪些属性的详细控制):

@echo off
:: Do NOT use setlocal ENABLEDELAYEDEXPANSION, because it would cause
:: misinterpretation of  "!" chars. in filenames.    
setlocal

:: Parse the file path given as %1 (the first argument) into its folder path and filename.
:: Be sure to pass the %1 argument *double-quoted* to prevent up-front interpretation 
:: by cmd.exe; e.g.:
::   someBatchFile "c:\tmp\foo.txt" or someBatchFile "%file%"
:: Note that %~dp1 always returns a path with a trailing "\".
set "fpath=%~dp1"
set "fname=%~nx1"

:: Determine the destination folder
set "dest=E:\"

:: Use robocopy to copy the file to the destination dir. with timestamps preserved.
:: Syntax is: <source-dir> <dest-dir> <filename-or-wildcard> ...
:: IMPORTANT: To avoid problems with paths that end in "\", always follow
::            a variable reference inside "..." with a *space* (a trick discovered by
::            Ed999 himself).
robocopy "%fpath% " "%dest% " "%fname%"

Note:

  • While robocopy主要用于复制整个目录, it does允许您通过指定的通配符表达式复制单个文件3rd位置参数,如"%fname%" above.
    鉴于robocopy- 与 PowerShell 不同 - 不考虑[ and ]通配符元字符 https://en.wikipedia.org/wiki/Metacharacter,这种方法应该有效(如果你的文件名包含embedded * or ?字符,这是不可能的)。

  • 尾随空格技巧(例如,"%fpath% ")是必要的,因为robocopy- 正如大多数命令行实用程序所做的那样 - 处理\"在论证结束时作为escaped ",这会破坏命令。严格来说,正确的解决方法是double尾随的\ (e.g., "E:\\"),但是你可以通过附加一个space,因为路径中的任何尾随空格都是ignored。因此,使此类调用稳健的一个简单方法是always use "%var% "(结束双引号之前的尾随空格)传递文件夹路径时。

  • robocopy没有类似的开关/V这会导致它验证文件是否已正确复制,但是 - 至少根据这篇博文 https://hardforum.com/threads/robocopy.1536038/#post-1036009639- 跑步verify on事先应该有同样的效果。


如果您仍然需要通过 PowerShell 复制创建时间戳:

powershell -command "(Get-Item -LiteralPath '%dest%%fname%').CreationTime=(Get-Item -LiteralPath '%fpath%%fname%').CreationTime"

Caveat:如果您的文件名可能已嵌入'字符。 (单引号/撇号),您必须escape他们首先,由doubling他们(例如,%fname:'=''%返回值%fname%所有'实例加倍):

powershell -command "(Get-Item -LiteralPath '%dest:'=''%%fname:'=''%').CreationTime=(Get-Item -LiteralPath '%fpath:'=''%%fname:'=''%').CreationTime"
  • Note that the command as a whole is enclosed in "...", so as to prevent cmd.exe metacharacters (such as &) that may be contained in the variable values from breaking the command.[1]

  • Inside命令字符串,'...'用于确保变量值被视为literals通过 PowerShell(如果您使用过"..."和包含的文件名$,例如,结果将是意想不到的)。

  • -LiteralPath确保Get-Item将文件路径解释为literal,而它是
    -Path传递路径时隐含的参数位置上,以及传递给的路径
    -Path被解释为通配符表达式,这可能会导致 PowerShell 通配符元字符出现问题,例如[ and ].

  • 无需转换.CreationTime源文件的属性值为日期+时间string第一的;您可以简单地将其直接分配给目标文件的.CreationTime属性,其类型为[System.DateTime].


[1] Quoting headaches:

  • 封闭only中的变量引用\-转义双引号,如问题中所示(\"%dest%\%fname%\"), is not足够了,因为这样做会使值受到影响空白规范化,意味着运行多个空间被标准化为single space.

  • While 此外附上命令作为一个整体 in "..."原则上有帮助,cmd.exethen 不会将整个字符串识别为单个双引号字符串,在这种情况下,元字符例如&在变量值中可以break命令;例如。,
    powershell.exe -command "echo \"a b\""工作正常,忠实地保留空白,但是
    powershell.exe -command "echo \"a & b\""中断,由于&.

    • Using \""代替\"解决了元字符问题,但重新引入了空白规范化:
      powershell.exe -command "echo \""a & b\""" yields a & b
  • 因此,使用'...'PowerShell 里面的字符串整体"..."字符串是使命令健壮的最简单方法:您只需要转义'变量值中的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批处理文件中的 Powershell - 如何转义元字符? 的相关文章

  • 通过 PowerShell 对 TFS 构建进行排队

    TFS2012 具有一个 2010 构建控制器和一个 2010 构建代理 还有一个 2012 构建控制器和多个 2012 构建代理 我们的软件有多个版本的多个版本 构建根据约定命名 例如Foo version 1 0 和 Foo versi
  • 如何修复在 Windows 终端中启动“powershell.exe”时出现的错误 0x800700c1?

    最近我在 Windows 终端中遇到以下错误 error 0x800700c1 when launching C Users Dry C Desktop AppData Local Microsoft WindowsApps Microso
  • 如何在 powershell 中使用正则表达式选择“catch”代码块?

    我正在尝试分析多个目录中的大量 powershell 脚本 并且希望将任何 Catch 代码块拉入列表 变量中 我正在尝试编写一个正则表达式来选择以下格式的任何块 Catch write Host Function MyInvocation
  • 如何扩展和重写集合类中的 Add

    背景 我在 PowerShell 中有一个具有 4 个属性的数据对象 其中 3 个是字符串 第 4 个是哈希表 我想安排一个新类型 将其定义为该数据对象的集合 在这个集合类中 我希望强制执行一种特定的格式 这将使我在模块中其他地方的代码更加
  • 与 Write-Host 相比,Write-Output 的使用非常不可靠

    有人指出一个问题 如果我希望命令按顺序操作 建议使用 Write Output 而不是 Write Host 因为 Write Host 不会将输出放在管道上 而其他命令却这样做 这意味着 Write Host 输出可以发生在管道上的其他命
  • 并行启动服务

    我有一个脚本可以检查不同服务器上的某些服务是否已启动 如果没有启动 该脚本应该启动该服务 问题是 它不会并行启动服务 而是等待每个服务启动 Code server list Get Content path D Path list of s
  • 如何在不使用 Invoke-WebRequest 的情况下在 Powershell 中 POST .json 文件?

    我目前正在做的事情 Invoke WebRequest Uri https coolWebsite com ext ext ContentType application json Method POST Body someJSONFile
  • 使用cmd批处理文件获取pdf中的页数

    我可以看到使用 C PHP 和其他语言获取 pdf 中的页数有很多问题 但我想知道使用批处理文件或 cmd 是否有一种简单的方法来获取页数 Using pdftk http www accesspdf com pdftk pdftk my
  • 如何在 PowerShell 中比较本地文件与 FTP 服务器上的文件的年龄并下载远程复制是否较新

    我正在编写一个 PowerShell 脚本 以帮助我为工作设置新电脑 希望这不仅仅是我一个人会使用 所以我正在尝试考虑所有事情 我在 FTP 服务器上保存了离线安装程序 java flash reader 等 如果本地副本尚未保存在创建的
  • 如何使用 Excel.UriLink.16 更改 Excel URL 的文件关联?

    我正在尝试更改文件关联 以便在另一个浏览器中打开 Excel 单元格中的 URL 根据使用 CMD ftype命令与Excel UriLink 16 我应该能够使用以下命令从 powershell 通过 cmd 执行此操作 To chang
  • 如何从 HTA 中启动批处理文件

    我有一个基本的 HTA 其中我尝试通过按钮启动批处理文件 但是当我尝试启动批处理文件时 它不会运行 当我按下按钮时 将启动命令提示符窗口 但不会运行脚本 这是代码的简单示例
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • 如何获取Windows批处理的父文件夹

    我正在编写一个批处理文件 我需要获取该bat文件的父文件夹 有可能吗 注意 我的意思是批处理文件的父文件夹 而不是调用该批处理的提示的当前目录 Thanks 批处理的父文件夹位于变量中 dp0位于 例子 echo off setlocal
  • 我的 Powershell GUI 界面在打开网格视图时不断调整大小

    我目前正在构建一个复制到剪贴板工具 其中显示存储在文件夹中的 txt 文件列表 并且我使用 out gridview 来允许用户更好地选择和过滤列表 我已附上图片以供参考 单击加载 out gridview 的按钮后如何停止调整大小 Too
  • [Regex]::Replace() 和 -replace 有什么区别?

    我明白了之间的区别 Replace and replace 但是什么是 replace and Regex Replace 我测试了以下两个代码 但对我来说结果完全相同 我还提到了 PowerShell Cookbook O reilly
  • 将变量传递给 Start-Job

    我必须在这里遗漏一些非常简单的东西 这是一个非常基本的脚本来说明我正在尝试的内容 Computers comp1 comp2 ScriptBlock New Item C Temp C txt Force Foreach C in Comp
  • 导入模块 WebAdministration 不会从脚本加载,但会从命令行加载

    我正在进行一个使用的项目PowerShell编写构建脚本 该构建利用了WebAdministration模块来管理本地 IIS 实例 当我运行构建脚本时 尝试导入时会引发以下错误WebAdministration 错误 06 29 2016
  • 批处理文件删除目录中除指定列表之外的所有文件夹

    我正在寻找一个批处理文件 该文件将进入 C Documents and Settings 并删除除我想保留的几个文件夹之外的所有文件夹 这是一个破解方法 D 如果您在folders txt 中有一个文件夹路径列表 如下所示 C Docume
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da

随机推荐

  • 如何取消“等待上传”?

    我知道这不是一个编程问题 但我想知道是否有人可以快速帮助我 我发现 iTunes Connect 中的某个应用程序存在 等待上传 的小问题 我怎样才能取消这个 谢谢 答案是上传二进制文件 然后取消它
  • echo 完整的 joomla 查询(带有限制等)?

    我想知道是否有一种方法可以用 limit 和 limitstart 等来回显完整的查询 我可以回显 query 行 但我想看看为什么限制不起作用 但我似乎无法理解它显示发送到数据库的实际查询 代码如下 params JComponentHe
  • 如何从DLL中提取字符串资源

    我正在制作管理系统文件扩展名的应用程序 但遇到问题 系统扩展如 jpg exe dll png txt等有一个名为FriendlyTypeName 例如 FriendlyTypeNamejpeg 文件的内容是 SystemRoot Syst
  • 如何设置 HTML5 表单验证消息的样式? [复制]

    这个问题在这里已经有答案了 我正在使用 必需 的 HTML5 验证 但气泡消息正在我的屏幕中创建滚动条 因为输入字段尺寸很小并且位于右侧 所以我想更改气泡消息以显示输入字段的左侧或更改其样式 HTML5 表单
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • 绝对位置在固定位置内不起作用

    div div div div Both main and inner集装箱取走position fixed 内胆的制作方法position absolute和主容器position fixed 你需要定义top right bottom
  • Javafx-场景快照不显示值和系列

    我制作了一个非常短的应用程序 它使用 javafx 生成图表 应用程序显示正确的值 图表 但当我做快照时 图像仅显示轴和标签 但不显示系列和值 stage setTitle Line Chart Sample final DateAxis
  • 使用 chrome canary 执行 selenium python 脚本时如何抑制控制台错误/警告/信息消息

    我正在使用 Chrome Canary 运行 python 脚本 下面的完整脚本链接 进行硒测试 测试似乎运行良好 但是 控制台上显示了大量错误 警告 信息消息 有没有办法抑制这些消息 我努力了 chrome options add arg
  • ToggleButton 控件 VisualStateManager:处理多个悬停状态

    参考我之前的问题 Silverlight MVVM 困惑 基于状态更新图像 https stackoverflow com questions 5034189 silverlight mvvm confusion updating imag
  • 带有“null”PendingIntent 的通知

    我正在尝试在 Android 中实现通知 现在我有一个问题 我不想再有一个PendingIntent该用户将打开任何Activity 我怎样才能做到这一点 PendingIntent contentIntent PendingIntent
  • 对于范围从 0 到最大值的 uint64_t 键,最佳哈希函数是什么?

    假设我们有一组元素并希望将它们存储在哈希映射中 例如std unordered set 并且每个元素都有一个 type 的键uint64 t其值可以从 0 到最大可能值变化 使用简单哈希函数 其中键的哈希值就是键本身 是最佳选择吗 它是否取
  • 可能的数独谜题的数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Wiki http en wikipedia org wiki Mathematics of Sudoku http en wikiped
  • 将 python scikit learn 模型导出到 pmml

    我想将 python scikit learn 模型导出到 PMML 中 什么 python 包最适合 我读到Augustus https github com opendatagroup augustus 但我找不到任何使用 scikit
  • 使用 $location 重定向到 AngularJS 中的新页面

    我正在使用以下 AngularJS location 进行测试 我不明白这有什么问题 只是想检查重定向是否有效 HTML Hello name
  • 求分数 a/b 的小数点后第 k 位,其中 a、b、k 是非常大的整数(小于 10e18)

    我的任务是找到分数 a b 小数点后第 k 位的数字 昨天我发现了这个算法 为了获取小数点后的任何数字 我生成一个名为 rem 的变量并进行循环 for int i 1 i lt k 1 i rem a b a rem 10 cout lt
  • 如何使用 OpenGL ES 2.0 旋转对象?

    在 OpenGL ES 1 1 中 您可以使用glRotatef 旋转模型 但 OpenGL ES 2 0 中不存在该函数 那么 在OpenGL ES 2 0中如何进行旋转呢 为了遵循克里斯蒂安所说的 您需要自己跟踪模型视图矩阵并操纵它来执
  • 如何在Vite配置中更改antd主题?

    是一个由Vite和React antd组成的项目 我想在 vite config ts 中动态处理 antd 主题 如果您能告诉我如何修改 React 组件中的 less modifyVars 值 我将不胜感激 这是当前屏幕 光状态 htt
  • Amazon DynamoDB 使用无服务器修改结构

    修改 DynamoDB 表结构的最佳方法是什么 由于备份而删除它没有问题 我有一个只有哈希键的表 我必须为表添加一个排序键 当我部署堆栈时 我收到此错误 错误 CloudFormation 模板无效 模板格式错误 模板的资源块中存在未解析的
  • MySQL存储过程错误意外字符“:”

    我有以下语句来创建存储过程 但我不断收到 位置 835 处出现意外字符 错误 语句中唯一的冒号位于 start loop 循环中 为什么我会收到此错误以及如何修复 DELIMITER CREATE DEFINER root localhos
  • 批处理文件中的 Powershell - 如何转义元字符?

    运行 Windows 7 当我复制文件在例程期间到外部磁盘文件备份 我使用 Powershell v2 从批处理文件 在副本文件上重新创建原始文件的所有时间戳 以下代码在大多数情况下都能成功运行 但并非总是如此 SET file 1 SET