繁体   English   中英

Powershell 到可执行文件 .bat

[英]Powershell to executable .bat

我正在尝试将下面的脚本(在 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 代码包装到批处理文件中,例如:

<# : 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}

下面的批处理文件实际上是原始 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%"
)

默认情况下,Windows 不允许通过双击 .PS1 文件来运行 Powershell 脚本。 这实际上是一项旨在保护不太懂计算机的用户的安全功能 过去,VBScript 文件是各种恶意软件的流行攻击媒介。 这是因为 VBScript 文件在默认情况下只需双击即可运行。 欺骗没有经验的用户很容易感染Love Letter蠕虫。

作为变通方法,创建一个快捷方式来启动 Powershell 的 shell 并将参数传递给脚本。 在链接腐烂的情况下,:

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

我开始使用@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: ÄÖÜäöü")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM