【问题标题】:Powershell to executable .batPowershell 可执行.bat
【发布时间】:2017-04-03 04:48:23
【问题描述】:

我正在尝试将 Powershell 中的以下脚本转换为可执行的 .bat 文件。基本思想是我有一堆文件,其中文件名存在于 3 个部分中:

  • 第 1 部分:TKSYSTEMID

  • 第 2 部分:变量名称

  • 第 3 部分:YYYY MM DD HHMM

所以一个简单的例子看起来像:TKSYSTEMID NOTES YYYY MM DD HHMM

我正在寻找一个 .bat 文件,它可以将 TKSYSTEM ID 和 YYYY MM DD HHMM 替换为提示用户输入的内容。

我目前的powershell脚本是:

$NEWSYSTEMID = Read-Host -Prompt 'Please input SEJ SYSTEM ID' 
Write-Host "Changing TKSYSTEMID to '$NEWSYSTEMID'" 
dir | Rename-Item -NewName {$_.name -replace 'TKSYSTEMID',$NEWSYSTEMID}

$NEWDATETIME = Read-Host -Prompt 'Please input the upload date and time' 
Write-Host "Changing YYYY MM DD HHMM to '$NEWDATETIME'" 
dir | Rename-Item -NewName {$_.name -replace 'YYYY MM DD HHMM',$NEWDATETIME}

有人能告诉我如何转换它或为此提供一个 .bat 脚本吗?这将意味着世界。

【问题讨论】:

  • 如果您有 PowerShell 脚本,为什么还需要批处理文件?批处理文件是旧 Windows 命令提示符的脚本。 PowerShell 是新的(更好的)命令提示符。两种脚本类型都是可执行的。
  • 对不起,我不知道 powershell 可以成为可执行文件。我只需要一个简单的选项来双击并运行提示以重命名文件,但现在的方式似乎无法使其成为可执行文件。 (我对这些东西了解不多,所以来这里寻求建议哈哈)

标签: powershell datetime batch-file code-conversion


【解决方案1】:

您可以将 powershell 代码包装到批处理文件中,例如:

<# : batch portion
@echo off & setlocal

(for %%I in ("%~f0";%*) do @echo(%%~I) | ^
powershell -noprofile "$argv = $input | ?{$_}; iex (${%~f0} | out-string)"

goto :EOF
: end batch / begin powershell #>

$NEWSYSTEMID = Read-Host -Prompt 'Please input SEJ SYSTEM ID' 
Write-Host "Changing TKSYSTEMID to '$NEWSYSTEMID'" 
dir | Rename-Item -NewName {$_.name -replace 'TKSYSTEMID',$NEWSYSTEMID}

$NEWDATETIME = Read-Host -Prompt 'Please input the upload date and time' 
Write-Host "Changing YYYY MM DD HHMM to '$NEWDATETIME'" 
dir | Rename-Item -NewName {$_.name -replace 'YYYY MM DD HHMM',$NEWDATETIME}

【讨论】:

  • 这正是我所需要的!奇迹般有效。非常感谢!
  • 我不太明白,它的作用。有人可以解释一下吗?特别是第一行(“
  • @Andreas - 检查这个 - stackoverflow.com/a/33065387/388389
【解决方案2】:

下面的批处理文件实际上是原始 PowerShell 代码的直接翻译,不同之处在于每个文件只重命名一次。

@echo off
setlocal EnableDelayedExpansion

set /P "NEWSYSTEMID=Please input SEJ SYSTEM ID: "
set /P "NEWDATETIME=Please input the upload date and time: "
echo Renaming files
for /F "tokens=*" %%a in ('dir /B') do (
   set "name=%%a"
   set "name=!name:TKSYSTEMID=%NEWSYSTEMID%!"
   set "name=!name:YYYY MM DD HHMM=%NEWDATETIME%!"
   ren "%%a" "!name!"
)

但是,如果文件名中的“第 2 部分”由单个单词组成,例如 NOTES,那么代码可能更简单,因为“第 1、2 部分和其余部分”(标记 1,2* ) 在重命名过程中直接取:

@echo off
setlocal

set /P "NEWSYSTEMID=Please input SEJ SYSTEM ID: "
set /P "NEWDATETIME=Please input the upload date and time: "
echo Renaming files
for /F "tokens=1,2*" %%a in ('dir /B') do (
   ren "%%a %%b %%c" "%NEWSYSTEMID% %%b %NEWDATETIME%"
)

【讨论】:

    【解决方案3】:

    默认情况下,Windows 不允许通过双击 .PS1 文件来运行 Powershell 脚本。这实际上是一个security feature,旨在保护不太懂电脑的用户。过去,VBScript 文件是各种恶意软件的流行攻击媒介。这是因为 VBScript 文件默认情况下可以通过双击运行。愚弄没有经验的用户很容易感染Love Letter 蠕虫。

    作为work-around,创建一个快捷方式来启动Powershell 的shell 并将参数传递给脚本。如果链接失效,:

    powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
    

    【讨论】:

      【解决方案4】:

      我开始使用@npocmaka 的解决方案,但在编码非美国字符时遇到了问题。以下解决方案解决了这个问题。

      <# : Save as UTF8 without BOM
      @ECHO OFF
      powershell.exe -NoProfile -Command "Get-Content -Path \"%~f0\" -Encoding UTF8 -Raw | Invoke-Expression"
      PAUSE
      EXIT /B %errorlevel%
      :Script part below #>
      Set-StrictMode -Version Latest
      
      Write-Host("Hello Germans: ÄÖÜäöü")
      

      【讨论】:

        猜你喜欢
        • 2022-07-08
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多